近期遇到一个问题,CAN在低波特率(250K)下正常工作,高波特率(500K)下频繁报错,导致总线崩溃,
初步怀疑是终端电阻不匹配或者外部存在干扰,但是因为阻抗限制,不能更改终端电阻,
因为设备是外接件,对于安全要求较低,所以考虑使用CAN的静默模式,以消除报错信息
在CAN通信的正常模式(Nomal)中,RX收到一个正确的报文,TX脚会返回一个ACK信号,告诉发送端此报文发送成功,以维持正常通信
因为如果CAN通信配置为静默模式,RX脚会正常接收数据,TX脚不对外发送数据,那么当总线中仅有发送端和静默设备时,因为发送端不会收到ACK信号,会认为发送失败,于是通信会不成功
所以, 使用静默模式前提, 要确保CAN总线中至少有一个其他的正常设备能够返回ACK信号.
当我们配置为静默模式时,CAN过滤器会正常工作,
硬件上可以把CAN收发器的TX脚和MCU对应管脚断开仍能正常工作,
软件上配置TX脚为输入上拉模式或者映射到空的脚上都可以正常工作
在实际测试中发现,CAN的静默模式下TX脚配置为输入上拉可以解除报错现象,
CAN_InitStructure.autoBusoff = DISABLE;
CAN_InitStructure.autoWakeup = DISABLE;
CAN_InitStructure.noAutoReTxMode = ENABLE;
CAN_InitStructure.rxFifoLockMode = DISABLE;
CAN_InitStructure.txFifoPriority = DISABLE;
CAN_InitStructure.mode = CAN_MODE_SILENT; // 静默模式
CAN_InitStructure.syncJumpWidth = CAN_SJW_1;
CAN_InitStructure.timeSegment1 = CAN_BS1_8TQ;
CAN_InitStructure.timeSegment2 = CAN_BS2_3TQ;
CAN_InitStructure.prescaler = 4;
CAN_Init(CAN1,&CAN_InitStructure);