背景:现场发现CAN硬件连接后,波特率设置成125k则初始化失败,设置成500k则能正常启动。

平台:STM32 HAL库

调试记录

  1. 单步调试发现CAN初始化失败的原因为退出初始化模式时超时,INAK位始终为1。
    STM32 CAN因波特率不同导致初始化失败
  2. 查找芯片资料,发现CAN需要检测到连续11个隐性电平才将INAK位清零,退出初始化模式。STM32 CAN因波特率不同导致初始化失败
  3. 用万用表测量CAN线对地电压,总线悬空时测得CANH=3.26V、CANL=3.27V,总线无法初始化情况下,CANH=3.47V、CANL=1.97V,至此只能判断总线未能处于空闲状态,不能判断为什么波特率高低影响初始化。
  4. 将逻辑分析仪挂到总线上,抓到波形,发现总线有周期性电平变化,且最长持续电平大约持续62us。STM32 CAN因波特率不同导致初始化失败
  5. 500k的11个隐性电平时间为22us,125k的11个隐性电平时间为88us,由此这条总线不满足125k波特率初始化条件。

总结

CAN初始化时要想办法将总线至于空闲状态,即便不能控制总线处于空闲状态,软件设计时也尽量不要总线初始化失败就陷入死循环。

相关文章: