|
36 | 36 | #define CFG_HW_RCC_SEMID 3 |
37 | 37 | #undef DUAL_CORE |
38 | 38 |
|
| 39 | +#define X8H7_CAN_STS_FLG_RX_OVR 0x01 // Receive Buffer Overflow |
| 40 | +#define X8H7_CAN_STS_FLG_TX_BO 0x02 // Bus-Off |
| 41 | +#define X8H7_CAN_STS_FLG_TX_EP 0x04 // Transmit Error-Passive |
| 42 | +#define X8H7_CAN_STS_FLG_RX_EP 0x08 // Receive Error-Passive |
| 43 | +#define X8H7_CAN_STS_FLG_TX_WAR 0x10 // Transmit Error Warning |
| 44 | +#define X8H7_CAN_STS_FLG_RX_WAR 0x20 // Receive Error Warning |
| 45 | +#define X8H7_CAN_STS_FLG_EWARN 0x40 // Error Warning |
| 46 | +#define X8H7_CAN_STS_FLG_TX_OVR 0x80 // Transmit Buffer Overflow |
| 47 | + |
| 48 | +#define X8H7_CAN_STS_INT_TX 0x01 |
| 49 | +#define X8H7_CAN_STS_INT_RX 0x02 |
| 50 | +#define X8H7_CAN_STS_INT_ERR 0x04 |
| 51 | + |
39 | 52 | /************************************************************************************** |
40 | 53 | * GLOBAL VARIABLES |
41 | 54 | **************************************************************************************/ |
@@ -729,16 +742,23 @@ int can_write(can_t *obj, CAN_Message msg, int cc) |
729 | 742 | TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS; |
730 | 743 | TxHeader.MessageMarker = 0; |
731 | 744 |
|
732 | | - if (HAL_FDCAN_AddMessageToTxFifoQ(&obj->CanHandle, &TxHeader, msg.data) != HAL_OK) { |
733 | | - // Note for debug: you can get the error code calling HAL_FDCAN_GetError(&obj->CanHandle) |
734 | | - printf("error: %ld\n", HAL_FDCAN_GetError(&obj->CanHandle)); |
735 | | - return 0; |
736 | | - } |
| 745 | + if (HAL_FDCAN_AddMessageToTxFifoQ(&obj->CanHandle, &TxHeader, msg.data) != HAL_OK) |
| 746 | + { |
| 747 | + uint32_t const err_code = HAL_FDCAN_GetError(&obj->CanHandle); |
| 748 | + printf("error: %ld\n", err_code); |
737 | 749 |
|
738 | | - uint8_t _msg[2] = {0x01, 0}; |
739 | | - enqueue_packet(obj == &fdcan_1 ? PERIPH_FDCAN1 : PERIPH_FDCAN2, 0x40, sizeof(_msg), _msg); |
| 750 | + uint8_t msg[2] = {X8H7_CAN_STS_INT_ERR, 0}; |
| 751 | + if (err_code == HAL_FDCAN_ERROR_FIFO_FULL) msg[1] = X8H7_CAN_STS_FLG_TX_OVR; |
740 | 752 |
|
741 | | - return 1; |
| 753 | + enqueue_packet(obj == &fdcan_1 ? PERIPH_FDCAN1 : PERIPH_FDCAN2, CAN_STATUS, sizeof(msg), msg); |
| 754 | + return 0; |
| 755 | + } |
| 756 | + else |
| 757 | + { |
| 758 | + uint8_t msg[2] = {X8H7_CAN_STS_INT_TX, 0}; |
| 759 | + enqueue_packet(obj == &fdcan_1 ? PERIPH_FDCAN1 : PERIPH_FDCAN2, CAN_STATUS, sizeof(msg), msg); |
| 760 | + return 1; |
| 761 | + } |
742 | 762 | } |
743 | 763 |
|
744 | 764 | int can_read(can_t *obj, CAN_Message *msg, int handle) |
|
0 commit comments