From c0351446cf28746fb40f187d8a88c34392ff54f7 Mon Sep 17 00:00:00 2001 From: Simon Vogl Date: Thu, 23 Feb 2017 09:26:45 +0100 Subject: [PATCH] can_write(): return error code when no tx mailboxes are available. --- targets/TARGET_STM/can_api.c | 48 +++++++++++++++++------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/targets/TARGET_STM/can_api.c b/targets/TARGET_STM/can_api.c index 7a1ca7c58f..8b6340fedf 100644 --- a/targets/TARGET_STM/can_api.c +++ b/targets/TARGET_STM/can_api.c @@ -207,7 +207,7 @@ int can_frequency(can_t *obj, int f) int can_write(can_t *obj, CAN_Message msg, int cc) { - uint32_t transmitmailbox = 5; + uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX; CAN_TypeDef *can = (CAN_TypeDef *)(obj->can); /* Select one empty transmit mailbox */ @@ -218,33 +218,31 @@ int can_write(can_t *obj, CAN_Message msg, int cc) } else if ((can->TSR & CAN_TSR_TME2) == CAN_TSR_TME2) { transmitmailbox = 2; } else { - transmitmailbox = CAN_TXSTATUS_NOMAILBOX; + return 0; } - if (transmitmailbox != CAN_TXSTATUS_NOMAILBOX) { - can->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ; - if (!(msg.format)) { - can->sTxMailBox[transmitmailbox].TIR |= ((msg.id << 21) | msg.type); - } else { - can->sTxMailBox[transmitmailbox].TIR |= ((msg.id << 3) | CAN_ID_EXT | msg.type); - } - - /* Set up the DLC */ - can->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0; - can->sTxMailBox[transmitmailbox].TDTR |= (msg.len & (uint8_t)0x0000000F); - - /* Set up the data field */ - can->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)msg.data[3] << 24) | - ((uint32_t)msg.data[2] << 16) | - ((uint32_t)msg.data[1] << 8) | - ((uint32_t)msg.data[0])); - can->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)msg.data[7] << 24) | - ((uint32_t)msg.data[6] << 16) | - ((uint32_t)msg.data[5] << 8) | + can->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ; + if (!(msg.format)) { + can->sTxMailBox[transmitmailbox].TIR |= ((msg.id << 21) | msg.type); + } else { + can->sTxMailBox[transmitmailbox].TIR |= ((msg.id << 3) | CAN_ID_EXT | msg.type); + } + + /* Set up the DLC */ + can->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0; + can->sTxMailBox[transmitmailbox].TDTR |= (msg.len & (uint8_t)0x0000000F); + + /* Set up the data field */ + can->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)msg.data[3] << 24) | + ((uint32_t)msg.data[2] << 16) | + ((uint32_t)msg.data[1] << 8) | + ((uint32_t)msg.data[0])); + can->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)msg.data[7] << 24) | + ((uint32_t)msg.data[6] << 16) | + ((uint32_t)msg.data[5] << 8) | ((uint32_t)msg.data[4])); - /* Request transmission */ - can->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ; - } + /* Request transmission */ + can->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ; return 1; }