一、问题描述
系统:RT-Thread V4.1.0
硬件:AT32F407
在使用CAN通信的时候,CAN设备连接正常时,程序是运行正常的,如果出现CAN设备断开的情况,程序会出现卡死的现象。
二、分析
经过调试发现,发送失败后,一直continue,在while死循环。
后来发现CAN设备重新上电会接着把数据发送出去,其实不是卡死,是发送失败后等待重传。
数据虽然发送出去了,但是还是会提示发送失败返回值为0的情况,不知道什么原因。
/* 发送一帧 CAN 数据 */
size = rt_device_write(can_dev, 0, &msg, sizeof(msg));
if (size == 0)
{
rt_kprintf("can dev write data failed!\n");
}
查看芯片手册寄存器,可以禁止重传机制:
修改drv_can.c文件_can_config函数
// can_instance->config.base_init_struct.prsf_enable = FALSE;
can_instance->config.base_init_struct.prsf_enable = TRUE;
禁止重传使能后,不会出现卡死的现象,CAN设备断开后,再重新连接,不会出现发送返回值为0的情况,经测试收发数据正常。