CAN总线:实现多设备高效通讯
CAN总线(Controller Area Network Bus)即控制器局域网络总线,是一种由博世(BOSCH)公司开发的串行通信总线。由于其结构简洁、传输速度快、易于扩展以及高可靠性,CAN总线已经广泛应用于汽车、嵌入式系统、工业控制等多个领域。
CAN总线特性
CAN总线的主要特性包括:
-
两根通信线:CAN总线仅需要两根线——CAN_H(高速)和CAN_L(低速),这两根线用于差分信号传输,因此不需要共地。
-
差分信号通信:通过CAN_H和CAN_L两根线的电压差来传输信号,这使得CAN总线具有很强的抗干扰能力。
-
高速CAN和低速CAN:
- 高速CAN(符合ISO11898标准)支持125kbps至1Mbps的传输速率,适用于传输距离较短的场合(小于40米)。
- 低速CAN(符合ISO11519标准)支持10kbps至125kbps的传输速率,适用于传输距离较长的场合(小于1千米)。
-
异步通信:CAN总线上的通信不需要时钟线,各设备根据约定的速率进行通信。
-
半双工通信:CAN总线支持多设备挂载,当多个设备同时发送数据时,通过仲裁机制决定数据的传输顺序。
-
报文ID:CAN总线使用11位或29位的报文ID来标识不同的消息功能,并且决定了消息的优先级。
-
灵活的数据长度:有效载荷的长度可配置,从1到8字节不等,根据传输需求灵活设定。
-
广播式和请求式传输:CAN总线支持广播式和请求式两种数据传输方式。
-
丰富的错误处理机制:包括应答、CRC校验、位填充、位同步以及错误处理等特性,确保通信的可靠性。
只需要两根通讯线,因为是差分信号,所以无需共地,I2C是单端信号需要共地
多数使用高速CAN
串口一次只能发送一个字节,CAN一次能发送1~8个,灵活指定数据长度
广播式就是一个设备主动发送数据,其他所有设备都能收到,然后接收方通过报文ID来决定用不用这个数据
请求式就是发送方不会主动发送数据,只有收到接受方发出的请求,发送方才会发送数据
CAN总线与其他通讯协议的对比
下表列出了CAN总线与其他常见通讯协议的对比:
名称 | 引脚 | 双工 | 时钟 | 电平 | 设备 | 应用场景 |
---|---|---|---|---|---|---|
UART | TX、RX | 全双工 | 异步 | 单端 | 点对点 | 两个设备互相通信 |
I2C | SCL、SDA | 半双工 | 同步 | 单端 | 多设备 | 一个主控外挂多个模块 |
SPI | SCK、MOSI、MISO、SS | 全双工 | 同步 | 单端 | 多设备 | 一个主控外挂多个模块(高速) |
CAN | CAN_H、CAN_L | 半双工 | 异步 | 差分 | 多设备 | 多个主控互相通信 |
CAN总线硬件电路设计与工作原理
CAN硬件电路组成
每个设备通过CAN收发器挂载在CAN总线网络上。CAN控制器的TX和RX引脚与CAN收发器相连,CAN收发器再将CAN_H和CAN_L引脚分别与总线的CAN_H和CAN_L相连。
高速CAN与低速CAN的终端电阻
- 高速CAN:使用闭环网络,在CAN_H和CAN_L两端添加120Ω的终端电阻。
- 低速CAN:使用开环网络,在CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻。
TX和RX的连接
TX接TX,RX接RX,无需交叉。这样的连接方式确保了数据的正确传输。
高速CAN终端电阻的作用
1.防止回波反射:信号波形会在线路终端反射,进而干扰原始信号。加了终端电阻且阻抗匹配后,信号波形能平稳输出。
尤其是高频信号、远距离传输的场景,如果不加终端电阻,信号波形会在线路终端反射,进而干扰原始信号 最终的波形可能是这样,当信号跳变时。它会在边沿振荡几下。如果加了终端电阻且阻抗匹配就能平稳输出
- 收紧差分线电压:在没有设备操作时,终端电阻将两根差分线的电压“收紧”,使其电压一致。这样,在发送0时,只需将两端拉开;发送1时,无需操作,因为两端会默认收紧。
低速CAN终端电阻的作用
低速CAN的终端电阻接法比较特殊,其一端接到总线,另一端是悬空的。虽然从原理上看,这个电阻似乎没有作用,因为它没有形成回路,但事实上,它仍然可以起到防止回波反射的作用。此外,这两个电阻没有连在一起,因此没有“收紧”作用。
CAN的电平标准
CAN总线采用差分信号,即两线电压差(VCAN_H-VCAN_L)传输数据位。
- 高速CAN:电压差为0V时表示逻辑1(隐性电平),电压差为2V时表示逻辑0(显性电平)。
- 低速CAN:电压差为-1.5V时表示逻辑1(隐性电平),电压差为3V时表示逻辑0(显性电平)。
高速CAN,总线回归隐性电平快,传输速度就会快。低速CAN,总线回归隐性电平慢,传输速度自然就慢
高速CAN收发器工作原理
当总线(CANH-CANL)有电压差时,收发器输出1;没有电压差时,输出0。
然后这个1和0,通过左边两个场效应管的输出驱动器输出到RXD引脚,这两个管,你就当成是电子开关
右边为1时,上管断开,下管导通,输出0。右边为0时,上管导通,下管断开,输出1。所以这两个管还有个电平反相的功能。
最终整体上看,当CAN总线有电压差时,输出RXD引脚为低电平0,表示显性电平。
CAN总线没有电压差时,输出RXD引脚为高电平1,表示隐性电平。
所以RXD这块是输入部分,那上面TXD这一块,就是输出部分了
当TXD给1时,后面这个驱动器(DRIVER)就会让这边两个场效应管都断开,相当于不对总线进行任何操作
总线在外边终端电阻的收紧作用下呈现默认的隐性电平
电流源上拉的作用
电流源上拉的作用是,如果TXD悬空了,那么这里会保持默认输入1的状态,防止输入引脚电平不确定造成误操作。
中拉电阻
内部还有两个电阻,被称为“中拉电阻”。它们可以将CANH和CANL两根线都拉到0.5倍VCC的中间电平,也就是使CANH和CANL的默认对地电压都是2.5V左右。同时,这两个电阻也有一定的收紧作用,但它们的阻值比较大,因此收紧作用,主要还是靠外面的终端电阻来实现。
当TXD给0时,两个管导通,相当于两只手,上面的手,将CANH电压拽高。下面的手,将CANL的电压拽低。这样两线就会分开,产生电压差。总线呈现显性电平0的状态
CAN物理层特性
总结
CAN总线以其独特的优势,如简洁的线缆、高效的传输、强大的抗干扰能力以及完善的错误处理机制,在多个领域内得到了广泛的应用。无论是汽车的多ECU系统,还是工业控制网络,CAN总线都能提供稳定可靠的通讯保障。理解和掌握CAN总线技术,对于嵌入式系统开发者来说,是一门重要的技能。