目的:通过STM32自带CAN控制器及收发器实现STM32与CAN总线的通信。
1. CAN总线原理
- 控制器局域网络(Controller Area Network, CAN)
- 2根总线(CAN-H和CAN-L)的电位差来确定总线的电平,输出差分电压信号(显性电平和隐性电平)
- “显性"数值表示逻辑"0”,而"隐性"表示逻辑"1"
在“隐性”状态下,VCAN_H和VCAN_L被固定与平均电压电平,Vdiff近似为零,此时VCAN_H和VCAN_L的标称值为2.5V。“显性”位以大于最小阀值的差分电压表示,此时VCAN_H的标称值为3.5V,VCAN_L的标称值为1.5V。
2. STM32上的CAN通信
- 在使用STM32的CAN口需要注意,CAN控制器完成底层协议(仲裁、CRC校验、自动重发等),位于芯片内部,CAN收发器用于将TTL信号转化为CAN总线上的电平,常见型号为SN65HVD230、TJA1051,需要额外购买。
- 接线方式:控制器TX连收发器TX,直连,和串口连接方式不同
- 收发器出来的CANH和CANL之间有一个120欧姆电阻,以保证阻抗匹配(要注意有些现成CAN收发器板子上有接这个电阻,没有的话再自己接终端电阻)
CAN的波特率为:
Tout = T c l k p s c × ( B S 1 + B S 2 + S J W ) \text { Tout }=\frac{T c l k}{p s c×(BS1+BS2+SJW)} Tout =psc×(BS1+BS2+SJW)Tclk
APB1外设时钟Tclk已知为42Mhz,设置psc为9,BS1=5, BS2=6, SJW=1,此时波特率为388.9KHz。
CAN配置中选择内部时钟作为时钟源,查看数据手册或者查看代码可以知道TIM3是挂接到APB1外设时钟线上,查看Cubemx中APB1的外设时钟频率即为Tclk。
3.Cubemx配置
- 设置CAN为Activated
- 配置相应的p