CAN总线通信协议(基础)
CAN总线(Controller Area Network Bus)控制器局域网总线 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域 CAN总线特征: 两根通信线(CAN_H、CAN_L),线路少,无需共地 差分信号通信,抗干扰能力强,用电压差值传递数据 高速CAN(ISO11898):125k~1Mbps, <40m,用处多,着重学 低速CAN(ISO11519):10k~125kbps, <1km 异步,无需时钟线,通信速率由设备各自约定 半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序 11位(标准格式)/29位(扩展格式)报文ID,用于区分消息功能,同时决定优先级 可配置1~8字节的有效载荷 可实现广播式
(发送者向接收者写入数据,这个lan网络下的其他设备被动接收,可根据ID确定要不要接收)和
请求式(发一个数据就需要先请求再接收)两种传输方式 应答、CRC校验、位填充、位同步、错误处理等特性
主流通信协议对比
名称 | 引脚 | 双工 | 时钟 | 电平 | 设备 | 应用场景 |
---|---|---|---|---|---|---|
UART | TX、RX | 全双工 | 异步 | 单端 | 点对点 | 两个设备互相通信 |
I2C | SCL、SDA | 半双工 | 同步 | 单端 | 多设备 | 一个主控外挂多个模块 |
SPI | SCK、MOSI、MISO、SS | 全双工 | 同步 | 单端 | 多设备 | 一个主控外挂多个模块(高速) |
CAN | CAN_H、CAN_L | 半双工 | 异步 | 差分 | 多设备 | 多个主控互相通信 |
CAN结合了UART和IIC
UART
IIC
SPI
CAN: 如果想实现 有很多 主控单片机 相互进行通讯 比如 5个STM32 之间任意通信
这时候就可以利用到 CAN总线了 , USART I2C SPI 都难以实现这个要求
一、CAN硬件电路
-
每个设备通过CAN收发器挂载在CAN总线网络上
-
CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连
-
高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻
电阻作用:
1.防止回波反射 尤其是 高频信号、远距离传输的场景 如果不加终端电阻 信号波形会在线路终端反射,进而干扰原始信号 。加了终端电阻 且 阻抗匹配 则电平跳变会比较平稳
2.在没有设备操作时 将两根差分线的电压 “收紧” (收紧为 电平1 呈隐性) 使其电压一致。
收紧:在没有设备操作总线的情况下 电阻就和弹簧一样 将两根线(CAN_H CAN_L) 的电压拉到同一个电平 和I2C的上拉电阻很像。
这里CAN总线的上拉电阻也就类似一个弹簧,可以将两根线“收紧”至电压一致状态,代表的就是默认1的状态,并且这两个电阻的阻值并不大,所以收紧的速度是很快的,使得CAN总线支持的最大速率也比较快,但是代价是CAN总线的功耗也会比较大。
如果某个设备想要发送 0 时 , 设备会操作总线,把总线拉开(总线的电平拉开) 使其呈现0状态。当设备想要发送1时 ,就不去碰总线 。总线在终端电阻的收缩下自动默认为1状态。注意当设备想发送1时,它无需对总线进行任何操作,因为总线默认的是1。
-
低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻
低速CAN这里一端接到总线另一端悬空,没有形成环路,这里电阻无效,因为电路只有形成回路才有效,但是它可以防止回波反射,这两个电阻没有“收紧”作用。