背景:现场发现CAN硬件连接后,波特率设置成125k则初始化失败,设置成500k则能正常启动。
平台:STM32 HAL库
调试记录:
- 单步调试发现CAN初始化失败的原因为退出初始化模式时超时,INAK位始终为1。
- 查找芯片资料,发现CAN需要检测到连续11个隐性电平才将INAK位清零,退出初始化模式。
- 用万用表测量CAN线对地电压,总线悬空时测得CANH=3.26V、CANL=3.27V,总线无法初始化情况下,CANH=3.47V、CANL=1.97V,至此只能判断总线未能处于空闲状态,不能判断为什么波特率高低影响初始化。
- 将逻辑分析仪挂到总线上,抓到波形,发现总线有周期性电平变化,且最长持续电平大约持续62us。
- 500k的11个隐性电平时间为22us,125k的11个隐性电平时间为88us,由此这条总线不满足125k波特率初始化条件。
总结
CAN初始化时要想办法将总线至于空闲状态,即便不能控制总线处于空闲状态,软件设计时也尽量不要总线初始化失败就陷入死循环。