diff --git a/f4/can/src/can.c b/f4/can/src/can.c index b951a56249273d67e489bbdeb4e8e8e392abb132..103d25808ce89451f0777b7d56ce25c2b43c22c2 100644 --- a/f4/can/src/can.c +++ b/f4/can/src/can.c @@ -18,6 +18,8 @@ CAN_HandleTypeDef CANHandle; CAN_FilterTypeDef CANFilterConfig; CAN_TxHeaderTypeDef CAN_txHeader; uint8_t CAN_txMessage[8]; +uint8_t arbitrationBakCAN_txMessage[8]; + uint32_t TxMailbox; CAN_RxHeaderTypeDef CAN_rxHeader; uint8_t CAN_rxMessage[8]; @@ -124,6 +126,7 @@ void can_init(TComm *comm_dev,CAN_InitTypeDef *conf,TCAN_IRQ_Priorities *priorit //Activate default interrupt when message in FIFO0 HAL_CAN_ActivateNotification(&CANHandle, CAN_IT_RX_FIFO0_MSG_PENDING); HAL_CAN_ActivateNotification(&CANHandle, CAN_IT_TX_MAILBOX_EMPTY); + HAL_CAN_ActivateNotification(&CANHandle, CAN_IT_ERROR); } void can_config(TComm *comm_dev,CAN_InitTypeDef *conf) @@ -228,7 +231,10 @@ void can_set_can_id(TComm *comm_dev,unsigned int id) */ void HAL_CAN_ErrorCallback(CAN_HandleTypeDef* CANHandle) { - //HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET); + if(HAL_CAN_GetError(CANHandle) == HAL_CAN_ERROR_TX_ALST0) + { + HAL_CAN_AddTxMessage(CANHandle, &CAN_txHeader, arbitrationBakCAN_txMessage, &TxMailbox); + } } void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef* CANHandle) @@ -359,12 +365,20 @@ unsigned char can_send_dma(unsigned char *data,unsigned short int length) } can_send_lenght = length - 8; can_send_iterations = 1; + for (uint8_t i=0;i<8;i++) + { + arbitrationBakCAN_txMessage[i] = can_send_data[i]; + } HAL_CAN_AddTxMessage(&CANHandle, &CAN_txHeader, data, &TxMailbox); } else{ CAN_txHeader.DLC = length; can_send_lenght = 0; can_send_iterations = 0; + for (uint8_t i=0;i<length;i++) + { + arbitrationBakCAN_txMessage[i] = data[i]; + } HAL_CAN_AddTxMessage(&CANHandle, &CAN_txHeader, data, &TxMailbox); uint8_t byte; comm_do_dma_send(can_comm_dev); @@ -386,6 +400,10 @@ void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef* CANHandle) } can_send_lenght = can_send_lenght - 8; can_send_iterations++; + for (uint8_t i=0;i<8;i++) + { + arbitrationBakCAN_txMessage[i] = CAN_txMessage[i]; + } HAL_CAN_AddTxMessage(CANHandle, &CAN_txHeader, CAN_txMessage, &TxMailbox); } else @@ -397,6 +415,10 @@ void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef* CANHandle) } can_send_lenght = 0; can_send_iterations = 0; + for (uint8_t i=0;i<8;i++) + { + arbitrationBakCAN_txMessage[i] = CAN_txMessage[i]; + } HAL_CAN_AddTxMessage(CANHandle, &CAN_txHeader, CAN_txMessage, &TxMailbox); uint8_t byte; comm_do_dma_send(can_comm_dev);