37《STM32 HAL库 CAN总线通信从入门到精通》
STM32 HAL库 CAN总线通信从入门到精通 001:CAN总线基础概念与物理层原理
写在前面:一次深夜的调试噩梦
去年做一款车载BMS项目,凌晨两点,示波器夹在CAN_H和CAN_L之间,波形像一团乱麻。主控是STM32F407,CAN收发器用的TJA1050,波特率500kbps。代码逻辑检查了三遍,HAL_CAN_Start()返回HAL_OK,但总线就是没反应——发送邮箱一直pending,接收中断死活不进。最后发现是终端电阻没焊,120Ω的贴片电阻在BOM里被漏掉了。这个教训让我意识到:CAN总线调试,物理层的问题往往比协议层更隐蔽、更致命。
一、CAN总线到底长什么样?——别被“差分”两个字骗了
CAN总线物理层就是两根线:CAN_H(高电平线)和CAN_L(低电平线)。但“差分信号”这四个字,新手容易理解成“一根发正信号,一根发反信号”。实际工作方式更微妙:
- 显性电平(Dominant):CAN_H比CAN_L高1.5V~2.5V(具体看收发器型号),逻辑上代表“0”。这是总线上的“强权”——只要有一个节点拉显性,整条总线就是显性。
- 隐性电平(Recessive):CAN_H和CAN_L电压差接近0V(约2.5V对2.5V),逻辑上代表“1”。这是“无争状态”,所有节点都释放总线时才会出现。
这里踩过坑:用万用表测CAN_H对地电压,发现是2.5V,以为正常。但示
