25-CAN总线
一、什么是CAN总线?(理解CAN重点)
CAN总线(Controller Area Network Bus)控制器局域网总线
CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域
注意:
- CAN 协议:在汽车和工业领域几乎不可替代,因其高可靠性和实时性,常用于刹车系统、发动机控制等关键场景。
CAN总线特征:
两根通信线(CAN_H、CAN_L),线路少,无需共地
差分信号通信(两线决定一位数据),抗干扰能力强,差分信号线一般使用双绞线
高速CAN(ISO11898):125k~1Mbps, 低速CAN(ISO11519):10k~125kbps,
异步,无需时钟线,通信速率由设备各自约定
半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序
11位/29位报文ID,用于区分消息功能,同时决定优先级
可配置1~8字节的有效载荷(有效长度)
可实现广播式和请求式两种传输方式
应答、CRC校验、位填充、位同步、错误处理等特性
二、主流通信协议对比(重点)
应用场景:
USART:调试串口、蓝牙模块、GPS 模块。
I2C:传感器、EEPROM()、低速多设备通信。
SPI:高速设备(如 Flash、显示屏、ADC/DAC)。
CAN:汽车电子(ECU 通信)、工业控制(PLC)、机器人。
接线图:
USART
IIC:
SPI:
SS1 SS2 SS3:使能端
三、CAN物理层
1、CAN硬件电路
每个设备通过CAN收发器挂载在CAN总线网络上
CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连
高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻
低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻
控制器:
CAN控制器在芯片内部,收发器一般是芯片外一个电路模块。
收发器:
CAN收发器(是MCU外的一个芯片)的作用:实现电平转转换、输出驱动和输入采样
有四个引脚:TX、RX、CAN_H、CAN_L
高速CAN有120Ω的终端电阻主要有2个作用:
1、防止回波反射
2、在没有设备操作时,将2根差分线的电压收紧,也就是使其电压一致
2、CAN电平标准(重点)
CAN总线采用差分信号,即两线电压差(VCAN_H、VCAN_L)传输数据位(下图可见)
高速CAN规定:
电压差为0V时表示逻辑1(隐性电平)
电压差为2V时表示逻辑0(显性电平)
低速CAN规定:
电压差为-1.5V时表示逻辑1(隐性电平)
电压差为3V时表示逻辑0(显性电平)
四、帧格式(重点)
1、CAN总线帧格式
CAN协议规定了以下5种类型的帧:(重要的是数据帧和遥控帧)
2、数据帧
数据帧分为标准帧与扩展帧,标准帧与扩展帧区别在于报文ID长度不同,标准帧为11位,扩展帧为:29位
注意点:
数据帧有标准格式和扩展格式两种,CAN总线刚制定时,只有标准格式,扩展格式是后来新增的,扩展格式增加了ID位数,能承载更多种类的ID。
标准格式分析:
在发送数据帧之前,总线必须处于空闲状态,空闲状态时,总线是隐性电平(逻辑电平表示为高电平1)
SOF(帧起始):
低电平,显性电平0 作用:打破总线空闲,开始一帧数据,并告诉接收方,后续若发送隐性1,即是发送过去的1。
报文ID:
1、表示后面数据的功能
2、区分优先级:多个设备同时发送时,根据仲裁规则,ID小的报文优先发送,ID大的报文等待下一次总线空闲再重试发送
3、标准帧ID为11位,扩展帧ID为29位。
RTR(远程请求标志位):
用于区分数据帧或遥控帧(数据帧为显性0,遥控帧为隐性1)
报文ID+RTR位称为仲裁段
IDE(ID扩展标志位):(在没有扩展帧之前是r1保留位)
用于区分标准格式还是扩展格式,标准格式为显性0,扩展格式为隐性1
r0:保留位(未用到)
DLC(数据段长度):即上面所说的有效长度
发送1个字节:0001 为显显显隐 (数据段为1字节)
发送8个字节:1000 为隐显显显 (数据段为8字节)
Data:有效载荷(一帧携带的数据)
数据长度为1~8字节
CRC(校验算法):
对数据位进行CRC算法计算 (SOF–Data),得出的校验码赋给CRC校验位,接收方接收到数据和校验码后,也会调用CRC算法进行计算,看看计算的校验码是否一致,以判断传输是否有误
CRC界定符:1位,必须是隐性电平(这里的CRC界定符和下面的ACK界定符都可以理解为CRC校验和ACK应答的延时作用)
ACK槽:做应答
发送方发送完一帧数据后,在应答这一位,发送方释放总线,总线回归默认状态(隐性1),如果接收方收到数据,在ACK槽这一位,把总线拉开,使总线呈现显性0的状态,发送方释放总线后,在ACK槽会读取总线状态,如果发送方读取为显性0,说明有接收方正确接收数据,若为隐性1 ,说明发送失败,发送方可以配置自动重发,也可以什么都不做,总之发送方知道发送状态就行。
ACK界定符:
*(ACK槽设计和ACK界定符,CRC界定符的用途)*总结:发送方发隐性1,若接收方存在,则接收方要发显性0,若不存在,无显性0,在ACK槽这一位前后,操作总线权力有短暂交换,前面所有波形,只有发送方有权操做总线,在ACK槽这一位时,变为接收方操作总线,为了给权力交接留出时间,ACK槽前后留了两个界定符,在CRC界定符时,发送方必须发隐性1,作用1是做分隔,作用2是在ACK槽之前,发送方必须释放总线(发送隐性1为释放总线),之后再ACK槽的时间点,接收方会拉开总线, ACK槽接收后,也需要释放总线,所有再ACK界定符时,接收方必须及时释放总线,交出控制权。
EOF(帧结束):
应答结束后,发送方发7个隐性1
小结:设计一个波形承载数据,需要有数据段,又需要数据段的字节是可调的,就加了DLC,用于指定数据段的长度,为了区分这个数据的功能,需要加上ID号,为了实现广播式,类似于只写,或者是请求式,类似于读取,用RTR位进行区分,为了判断书是否正确传输,加上了CRC校验,为了判断是否有接收方,加了应答设计,r0,r1留的保留位,为了后续升级使用,最后整个波形,加上起始和结束就完成了
3、数据帧各部分用途简介
SOF(Start of Frame):帧起始,表示后面一段波形为传输的数据位
ID(Identify):标识符,区分功能,同时决定优先级
RTR(Remote Transmission Request ):远程请求位,区分数据帧和遥控帧
IDE(Identifier Extension):扩展标志位,区分标准格式和扩展格式
SRR(Substitute Remote Request):替代RTR,协议升级时留下的无意义位
这一位只有扩展格式有,为了保证仲裁优先级规则,这一位必须给隐性1
r0/r1(Reserve):保留位,为后续协议升级留下空间
DLC(Data Length Code):数据长度,指示数据段有几个字节(值范围:0001~1000)
Data:数据段的1~8个字节有效数据
CRC(Cyclic Redundancy Check):循环冗余校验,校验数据是否正确
ACK(Acknowledgement):应答位,判断数据有没有被接收方接收
CRC/ACK界定符:为应答位前后发送方和接收方释放总线留下时间
EOF(End of Frame ):帧结束,表示数据位已经传输完毕
4、数据帧的发展历史
CAN 1.2时期,仅存在标准格式,IDE位当时仍为保留位r1
CAN 2.0时期,ID不够用,出现了扩展格式,增加了ID的位数,为了区分标准格式与扩展格式,协议将标准格式中的r1赋予了新功能—IDE
5、遥控帧
遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同
6、其他帧(错误帧,过载帧,帧间隔)--自行了解
7、位填充
数据帧和遥控帧在发送到总线之前,要经过位填充的处理
位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据
例如:
即将发送: [100000110] [10000011110] [0111111111110]=
实际发送: [1000001110] [1000001111100] [011111011111010]
实际接收: [1000001110] [1000001111100] [011111011111010]
移除填充后: [100000110] [10000011110] [0111111111110]
位填充作用:(防止数据波形长时间不变化)
8、波形实例
- 标准数据帧,报文ID为0x555,数据长度1字节,数据内容为0xAA
- 扩展数据帧,报文ID为0x0789ABCD,数据长度1字节,数据内容为0x56
标准遥控帧,报文ID为0x088,数据长度1字节,无数据内容
后面还有内容,明天补