本帖最后由 紫阳真人 于 2021-6-30 11:28 编辑
先说结论:CubeMX配置的自动重传功能,与生成的HAL库下的代码逻辑相反;
以下是问题分析过程:
在快速收发报文的情况下,STM32F103CBT6出现了发送失败的问题,本来应该是接收到0x7F0则返回0x7F1,接收到0x7F8则返回0x7F9。实际中,连续接收到0x7F0、0x7F8则只能返回0x7F1,丢失0x7F9,尝试增加接收buffer无效。下图是正常收发波形,可以看到7F9距离接收接收到的帧非常近:
下面我们增加发送数量到4帧,则接收不到0x7F9,疑似在第三帧与7F0仲裁失败,就发不出来了。
于是审查相关配置:
CubeMX里面是使能自动重发的:
生成相关代码中NART是使能的,这就有问题了,NART是no automatic retransmission,则与想要的结果正好相反:
void MX_CAN_Init(uint8_t baudrate) { g_hcan.Instance = CAN1; g_hcan.Init.Prescaler = baudrate;/*12-BAUDRATE_250KBPS;6-BAUDRATE_500KBPS*/ g_hcan.Init.Mode = CAN_MODE_NORMAL; g_hcan.Init.SJW = CAN_SJW_1TQ; g_hcan.Init.BS1 = CAN_BS1_6TQ; g_hcan.Init.BS2 = CAN_BS2_5TQ; g_hcan.Init.TTCM = DISABLE; g_hcan.Init.ABOM = DISABLE; g_hcan.Init.AWUM = ENABLE; g_hcan.Init.NART = ENABLE;/*自动重发配置*/ g_hcan.Init.RFLM = DISABLE; g_hcan.Init.TXFP = DISABLE; if (HAL_CAN_Init(&g_hcan) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } 以下代码在HAL_CAN_Init(CAN_HandleTypeDef* hcan)里: /* Set the no automatic retransmission */ if (hcan->Init.NART == ENABLE) { SET_BIT(tmp_mcr, CAN_MCR_NART); } else { CLEAR_BIT(tmp_mcr, CAN_MCR_NART); } 于是更改初始化配置g_hcan.Init.NART = ENABLE;为DISABLE,问题解决。
|