STM32 CAN简介及帧格式
一、CAN简介
图1.CAN简介
高速CAN:用于短距离、高速
低速CAN: 用于长距离、低速
二、回顾之前的通信协议对比:
图2. 通信协议对比
UART:点对点的通信,只有两个设备
I2C:一个主机外挂多个被动的传感器、存储器等模块
SPI:也是一主多从,但是通信速率是最快的,主要应用于高速通信场景
CAN:可以实现多个主控互相通信
三、CAN硬件电路
- 每个设备通过CAN收发器挂载在CAN总线网络上
- CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CANH和CAN L分别与总线的CAN H和CANL相连
- 高速CAN使用闭环网络,CANH和CANL两端添加120Q的终端电阻
- 低速CAN使用开环网络,CAN H和CANL其中一端添加2.2kQ的终端电阻
图3.闭环高速CAN
图4.开环低速CAN
注:闭环控制CAN总线的两端120欧电阻作用:
1.防止回波反射(与传输线原理有关)
2.可以将两根差分线的电压“收紧”,,也就是电压拉至同一电压,呈现1状态。当需要0状态的时候由软件来将电压拉开,呈现0状态。(如下)
CAN收发器-TJA1050
图5.TJA1050原理图
- 发送部分:
首先最右边的CANH和CANL就是CAN总线,连接在总线上。
中间的RECEIVER可以时刻检测总线的电压差,然后输出到左边通过场效应管到RXD引脚(这个场效应管有电平反向的功能,右边为1,输出左边为0。右边为0,输出到左边为1)。
- 接收部分:
如果TXD给1,则不会对总线进行任何操作,总线呈现默认的隐性电平1。
如果TXD悬空,则默认也是给1
如果TXD给0,则驱动器会把CANH拉高,CANL拉低,输出显性电平0。
如果TXD一直给0,出错了,则显性超时,收发器会主动释放CAN总线。
四、CAN电平标准
图6.CAN电平标准
这里注意:逻辑1是隐性电平,逻辑0是显性电平
高速CAN规定的状态0或者是状态1,都是由电压差来呈现的。逻辑电平是由两个线的差分电平合成而来的
五、CAN总线帧格式
规定了一下五种帧格式:
图7.CAN帧类型
主要学习的是数据帧,最复杂,用到的最多
(一)数据帧
图8,数据帧的构成
- 一个起始帧,是一个显性信号,用来标志起始信号
- identifier(ID):报文ID,标准格式是11位。用来表示后面数据的功能,相 当于加一个名字,同时还用来区分优先级,ID小的报文优先发送,ID大的等到下一次的空闲时间重新发送,不同功能的数据帧ID不同
- RTR:占据1位必须为显性0,远程请求标志位,用于区分数据帧还是遥控帧。数据帧为0,遥控帧为1
- IDE:ID扩展标志位,用于区分标准格式还是扩展格式,标准格式固定为显性0(如上半部分),扩展格式固定为隐性1(如下班部分)
- r0 : 保留位,必须为显性0,为了以后附加其它功能的
- DLC : 数据段的长度,例如发一个字节,DLC就给0001,八个字节,就给1000
- Data : 数据段,最大64位,也就是8个字节(这里数据段必须要给8的倍数)
- CRC段 : 高效检验算法,有15位,对前面所有的数据进行算法计算,从SOF到Data,计算得到一个校验码,然后接收方也是通过CRC进行CRC计算,得到校验码。然后对比发送方的校验码,判断传输是否有误
- CRC界定符 : 1位,必须是隐性电平
- ACK槽:应答的作用,发送方发出一帧数据,查看是否收到,发送方发送隐性1,如果接收方存在,则接收方就要发显性0,可以多个设备同时接收(也就是同时拉开)
- EOF:7个隐性1,作为停止位。
扩展格式:
- ID:同上
- SRR:没有用,但是要给隐性电平1
- IDE:扩展格式标志位,和标准格式相反
- 之后就和标准格式相同
(二)遥控帧
适合使用频率低,但偶尔又需要集中用几次的数据
图9.遥控帧的构成
RTR进行数据帧和遥控帧的区分,数据帧为0,遥控帧为1。
请求方发出遥控帧,其中ID表示要请求的数据。响应请求的那边,通过相同ID的数据帧反馈数据。
注:当请求和反馈数据同时发生时,数据帧拥有更高的优先级
(三)错误帧
用途:某个设备检测出错误时,向其它设备通知错误
图10.错误帧的构成
(四)过载帧
图11.过载帧的构成
(五)帧间隔
连续发送数据帧时,中间会有一小段帧间隔
图12.帧间隔
六、位填充
- 位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据
- 例如:
即将发送: 10000011 0 10000011110 0111111111110
实际发送: 1000001110 1000001111100 011111011111010
实际接收: 1000001110 1000001111100 011111011111010
移除填充后: 100000110 10000011110 0111111111110
- 位填充作用:
1. 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机
2.将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性(它们都需要6个相同电平)
3.保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲(规定:出现连续11个隐性1之后,认为是总线空闲)
总结:某个设备想要发送自己的数据时,就操作总线,拉开或者释放,使总线产生一段这样的时序波形,发送方需要依照上面的帧格式的定义来发,接收方同样根据帧格式的定义,来接收解析