summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c111
1 files changed, 50 insertions, 61 deletions
diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c
index e12624a709..da748590b0 100644
--- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c
+++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c
@@ -704,6 +704,55 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
}
}
+static void _can_check_tx_complete(struct rt_can_device *can)
+{
+ CAN_HandleTypeDef *hcan;
+ RT_ASSERT(can);
+ hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
+
+ if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
+ {
+ if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
+ {
+ rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8);
+ }
+ SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
+ }
+
+ if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
+ {
+ if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
+ {
+ rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
+ }
+ SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
+ }
+
+ if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
+ {
+ if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
+ {
+ rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
+ }
+ SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
+ }
+
+ if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/
+ {
+ SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/
+ }
+
+ if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1))
+ {
+ SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
+ }
+
+ if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2))
+ {
+ SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
+ }
+}
+
static void _can_sce_isr(struct rt_can_device *can)
{
CAN_HandleTypeDef *hcan;
@@ -721,45 +770,6 @@ static void _can_sce_isr(struct rt_can_device *can)
break;
case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
can->status.ackerrcnt++;
- if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
- {
- if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
- {
- rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8);
- }
- SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
- }
- else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
- {
- if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
- {
- rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
- }
- SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
- }
- else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
- {
- if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
- {
- rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
- }
- SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
- }
- else
- {
- if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/
- {
- SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/
- }
- else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1))
- {
- SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
- }
- else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2))
- {
- SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
- }
- }
break;
case RT_CAN_BUS_IMPLICIT_BIT_ERR:
case RT_CAN_BUS_EXPLICIT_BIT_ERR:
@@ -769,6 +779,7 @@ static void _can_sce_isr(struct rt_can_device *can)
can->status.crcerrcnt++;
break;
}
+ _can_check_tx_complete(can);
can->status.lasterrtype = errtype & 0x70;
can->status.rcverrcnt = errtype >> 24;
@@ -908,28 +919,6 @@ void CAN2_SCE_IRQHandler(void)
}
#endif /* BSP_USING_CAN2 */
-/**
- * @brief Error CAN callback.
- * @param hcan pointer to a CAN_HandleTypeDef structure that contains
- * the configuration information for the specified CAN.
- * @retval None
- */
-void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
-{
- __HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERROR_WARNING |
- CAN_IT_ERROR_PASSIVE |
- CAN_IT_BUSOFF |
- CAN_IT_LAST_ERROR_CODE |
- CAN_IT_ERROR |
- CAN_IT_RX_FIFO0_MSG_PENDING |
- CAN_IT_RX_FIFO0_OVERRUN |
- CAN_IT_RX_FIFO0_FULL |
- CAN_IT_RX_FIFO1_MSG_PENDING |
- CAN_IT_RX_FIFO1_OVERRUN |
- CAN_IT_RX_FIFO1_FULL |
- CAN_IT_TX_MAILBOX_EMPTY);
-}
-
int rt_hw_can_init(void)
{
struct can_configure config = CANDEFAULTCONFIG;