【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!
《QT开发实战》
《嵌入式通用开发实战》
《从0到1学习嵌入式Linux开发》
《Android开发实战》
《实用硬件方案设计》
长期持续带来更多案例与技术文章分享;
欢迎商业项目咨询,10年+软硬全栈内功,助力解决您的尊贵需求。
原文链接:https://blog.csdn.net/w464960660/article/details/129127589
——————————————————————————————————
目录
0 引言
1 CAN是什么?
2 CAN的电气属性
3 CAN通信协议
3.1 数据帧
3.2 遥控帧
3.3 错误帧
3.4 过载帧
3.5 帧间隔
4 CAN通信速率
5 总结
0 引言
CAN是一种应用广泛的现场总线,由于其高可靠性,多应用于工业自动化、船舶、汽车、医疗和工业设备等方面,如汽车上大量的传感器与模块都是通过CAN总线连接起来的。 本次博文根据瑞萨的《CAN入门书》,对CAN协议进行一个梳理总结,包括其概念、电气属性、协议、速率等,意在对CAN有一个基础性的认知,详细协议等可参见原书。
1 CAN是什么?
CAN,是Controller Area Network的英文缩写,也就是控制局域网络,其最早由德国BOSCH开发,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线之一。BOSCH博世主要是做汽车电子的,因此CAN一开始主要是为汽车电子开发的,目前已经是汽车网络的标准协议。当然,经过几十年的发展,CAN协议的高性能和可靠性已经得到了业界的认可,目前除了汽车电子外,也广泛应用于工业自动化、医疗、工业和船舶等领域。
以汽车电子为例,汽车上的电子设备很多,空调、车门、发动机、大量传感器等,这些设备就是通过CAN总线连接形成一个网络,如下图所示:
图中的各个单元通过CAN总线连接,每个单元都是独立的节点,同一个CAN网络中单元的通信速度一致,不同网络间速度可以不同。
CAN的主要特点如下:
- 1)多主控制:总线空闲时,所有单元都可以发送消息,当两个以上单元同时开始发送消息时,根据标识符ID(并非发送的目的地址)决定优先级,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收。
- 2)系统的柔软性:与总线相连的单元没有类似于“地址”的信息,因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
- 3&#xff09;通信速度快&#xff0c;距离远&#xff1a;最高 1Mbps&#xff08;距离<40M&#xff09;&#xff0c;最远达10KM&#xff08;速率<5Kbps&#xff09;。
- 4&#xff09;具有错误检测、错误通知和错误恢复功能&#xff1a;所有单元都可以检测错误&#xff0c;检测出错误的单元会立即通知其他所有单元。正在发送消息的单元一旦检测出错误&#xff0c;会强制结束当前的发送&#xff0c;然后不断反复地重新发送此消息直到成功为止。
- 5&#xff09;故障封闭功能&#xff1a;CAN可以判断出错误的类型是总线上暂时的数据错误&#xff08;如外部噪声等&#xff09;还是持续的数据错误&#xff08;如单元内部故障、驱动器故障、断线等&#xff09;&#xff0c;若为后者&#xff0c;可将引起此故障的单元从总线上隔离出去。
- 6&#xff09;连接节点多&#xff1a;CAN 总线是可同时连接多个单元的总线&#xff0c;可连接的单元总数理论上没有限制&#xff0c;但实际上受总线上的时间延迟及电气负载的限制。降低通信速度&#xff0c;可连接的单元数增加&#xff1b;提高通信速度&#xff0c;单元数减少。
2 CAN的电气属性
CAN总线使用两根线来连接各个单元&#xff1a;CAN_H、CAN_L&#xff0c;CAN控制器通过判断这两根线上的电位差来得到总线电平&#xff0c;分为显性电平和隐性电平两种。显性电平表示逻辑“0”&#xff0c;此时CAN_H电平比CAN_L 高&#xff0c;分别为 3.5V 和 1.5V&#xff0c;电位差为 2V。隐形电平表示逻辑“1”&#xff0c;此时 CAN_H 和 CAN_L 电压都为 2.5V 左右&#xff0c;电位差为 0V。 当CAN 总线上没有节点传输数据&#xff0c;即总线空闲时&#xff0c;总线电平一直处于隐性。
CAN 节点单元连接到CAN总线时&#xff0c; CAN_H 接CAN_H、CAN_L 接 CAN_L&#xff0c;CAN 总线两端要各接一个 120Ω的端接电阻&#xff0c;用于匹配总线阻抗&#xff0c;吸收信号反射及回拨&#xff0c;提高数据通信的抗干扰能力以及可靠性。CAN2.0传输速度可达 1Mbps/S&#xff0c;最新的 CAN-FD 最高速度可达 5Mbps/S&#xff0c;甚至更高&#xff0c;传输速度和总线距离有关&#xff0c;总线距离越短&#xff0c;传输速度越快。
3 CAN通信协议
通过CAN总线传输数据是需要按照一定协议进行&#xff0c;CAN 协议提供了 5 种帧格式来传输数据&#xff1a;数据帧、遥控帧、错误帧、过载帧和间隔帧&#xff0c;用途如下&#xff1a;
3.1 数据帧
数据帧由7段组成&#xff1a;
- 1&#xff09;帧起始&#xff1a;表示数据帧开始的段&#xff1b;
- 2&#xff09;仲裁段&#xff1a;表示该帧优先级的段&#xff1b;
- 3&#xff09;控制段&#xff1a;表示数据的字节数及保留位的段&#xff1b;
- 4&#xff09;数据段&#xff1a;数据的内容&#xff0c;一帧可发送 0~8 个字节的数据&#xff1b;
- 5&#xff09;CRC段&#xff1a;检查帧的传输错误的段&#xff1b;
- 6&#xff09;ACK 段&#xff1a;表示确认正常接收的段&#xff1b;
- 7&#xff09;帧结束&#xff1a;表示数据帧结束的段。
以上是数据帧标准格式和扩展格式两种帧结构&#xff0c;图中 D 表示显性电平 0、 R 表示隐性电平 1&#xff0c; D/R 表示显性或隐性&#xff0c;也就是 0 或 1。
&#xff08;1&#xff09;帧起始
标准格式和扩展格式都是由一1位的显性电平 0 来表示帧起始。
&#xff08;2&#xff09;仲裁段
仲裁段表示帧优先级&#xff0c;标准格式和扩展格式的仲裁段不同&#xff0c;从上图可见&#xff0c;标准格式的 ID 为 11 位&#xff0c;发送顺序是从 ID10 到 ID0&#xff0c;最高 7 位 ID10~ID4 不能全为隐性(1)&#xff0c;也就是禁止0X1111111XXXXX这样的 ID。扩展格式的 ID 为 29 位&#xff0c;基本 ID 从 ID28 到 ID18&#xff0c;扩展 ID 由 ID17 到 ID0&#xff0c;基本ID 与标准格式一样&#xff0c;禁止最高 7 位都为隐性。
&#xff08;3&#xff09;控制段
控制段由 6 个位构成&#xff0c;表示数据段的字节数&#xff0c;标准格式和扩展格式的控制段略有不同&#xff0c;r1 和 r0 为保留位&#xff0c;保留位必须以显性电平发送。 DLC 为数据长度&#xff0c;高位在前&#xff0c; DLC 段有效值范围为 0~8。
&#xff08;4&#xff09;数据段
数据段也就是帧的有效数据&#xff0c;标准格式和扩展格式相同&#xff0c;可以包含 0~8 个字节的数据&#xff0c;从最高位(MSB)开始发送。
&#xff08;5&#xff09;CRC段
CRC段保存CRC校准值&#xff0c;用于检查帧传输错误&#xff0c;标准格式和扩展格式相同。CRC 段由 15 位的 CRC 值与 1 位的 CRC 界定符组成。 CRC 值的计算范围包括&#xff1a;帧起始、仲裁段、控制段、数据段&#xff0c;接收方以同样的算法进行计算&#xff0c;然后用计算得到的 CRC 值与此CRC段进行比较&#xff0c;如果不一致的话就会报错。
&#xff08;6&#xff09;ACK段
ACK 段用来确认接收是否正常&#xff0c;标准格式和扩展格式相同&#xff0c;ACK 段由 ACK 槽(ACK Slot)和 ACK 界定符两部分组成。 发送单元的 ACK&#xff0c;发送 2 个隐性位&#xff0c;而接收到正确消息的单元在 ACK 槽&#xff08;ACK Slot&#xff09;发送显性位&#xff0c;通知发送单元正常接收结束&#xff0c;这个过程叫发送 ACK/返回 ACK。发送 ACK 的是所有接收单元中接收到正常消息的单元&#xff0c; 所谓正常消息是指不含填充错误、格式错误、 CRC 错误的消息&#xff0c;这些接收单元既不处于总线关闭态也不处于休眠态的所有接收单元中。
&#xff08;7&#xff09;帧结束
帧结束段&#xff0c;标准格式和扩展格式相同&#xff0c;帧结束段很简单&#xff0c;由 7 位隐性位构成。
3.2 遥控帧
接收单元向发送单元请求数据的时候用遥控帧&#xff0c;遥控帧由6个段组成&#xff1a;
1&#xff09;帧起始&#xff1a;表示数据帧开始的段&#xff1b;
2&#xff09;仲裁段&#xff1a;表示该帧优先级的段&#xff1b;
3&#xff09;控制段&#xff1a;表示数据的字节数及保留位的段&#xff1b;
4&#xff09;CRC段&#xff1a;检查帧的传输错误的段&#xff1b;
5&#xff09;ACK 段&#xff1a;表示确认正常接收的段&#xff1b;
6&#xff09;帧结束&#xff0c;表示数据帧结束的段。
遥控帧结构基本和数据帧一样&#xff0c;最主要的区别就是遥控帧没有数据段。遥控帧的 RTR 位为隐性的&#xff0c;数据帧的 RTR 位为显性&#xff0c;因此可以通过 RTR 位来区分遥控帧和没有数据的数据帧。遥控帧没有数据&#xff0c;因此 DLC 表示的是所请求的数据帧数据长度&#xff0c;遥控帧的其他段参考数据帧&#xff0c;不再赘述。
3.3 错误帧
当接收或发送消息出错的时候使用错误帧来通知&#xff0c;错误帧由错误标志和错误界定符两部分组成&#xff1a;
错误标志有主动错误标志和被动错误标志两种&#xff0c;主动错误标志是 6 个显性位&#xff0c;被动错误标志是 6 个隐性位&#xff0c;错误界定符由 8 个隐性位组成。
3.4 过载帧
接收单元尚未完成接收准备的话就会发送过载帧&#xff0c;过载帧由过载标志和过载界定符构成&#xff1a;
过载标志由 6 个显性位组成&#xff0c;与主动错误标志相同&#xff0c;过载界定符由 8 个隐性位组成&#xff0c;与错误帧中的错误界定符构成相同。
3.5 帧间隔
帧间隔用于分隔数据帧和遥控帧&#xff0c;数据帧和遥控帧可以通过插入帧间隔来将本帧与前面的任何帧隔开&#xff0c;过载帧和错误帧前不能插入帧间隔。
间隔由 3 个隐性位构成&#xff0c;总线空闲为隐性电平&#xff0c;长度没有限制&#xff0c;本状态下表示总线空闲&#xff0c;发送单元可以访问总线。延迟发送由 8 个隐性位构成&#xff0c;处于被动错误状态的单元发送一个消息后的帧间隔中才会有延迟发送。
4 CAN通信速率
CAN总线以帧的形式发送数据&#xff0c;到总线上的就是“0”和“1”这样的二进制数据&#xff0c;这里就涉及到了通信速率&#xff0c;即每秒钟发送多少位数据&#xff0c;CAN2.0 最高速度为1Mbps/S。对于CAN总线&#xff0c;一个位分为 4 段&#xff1a;
- 1&#xff09;同步段(SS)
- 2&#xff09;传播时间段(PTS)
- 3&#xff09;相位缓冲段 1(PBS1)
- 4&#xff09;相位缓冲段 2(PBS2)
这些段由 Tq(Time Quantum)组成&#xff0c;Tq 是 CAN 总线的最小时间单位。帧由位构成&#xff0c;一个位
由 4 个段构成&#xff0c;每个段又由若干个Tq 组成&#xff0c;这个就是位时序。 1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等&#xff0c;可以任意设定位时序。通过设定位时序&#xff0c;多个单元可同时采样&#xff0c;也可任意设定采样点。 各段的作用和 Tq 数&#xff1a;
1个位的构成示意图&#xff1a;
上图中&#xff0c;采样点是指读取总线电平&#xff0c;并将读到的电平作为位值的点。位置在 PBS1结束处。根据这个位时序&#xff0c;我们就可以计算 CAN 通信的波特率了。
前面提到的 CAN 协议具有仲裁功能&#xff0c;下面我们来看看是如何实现的。在总线空闲态&#xff0c;最先开始发送消息的单元获得发送权。当多个单元同时开始发送时&#xff0c;各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程&#xff1a;
单元 1 和单元 2 同时开始向总线发送数据&#xff0c;开始部分他们的数据格式是一样的&#xff0c;故无法区分优先级&#xff0c;直到 T 时刻&#xff0c;单元 1 输出隐性电平&#xff0c;而单元 2 输出显性电平&#xff0c;此时单元 1 仲裁失利&#xff0c;立刻转入接收状态工作&#xff0c;不再与单元 2 竞争&#xff0c;而单元 2 则顺利获得总线使用权&#xff0c;继续发送自己的数据。这就实现了仲裁&#xff0c;让连续发送显性电平多的单元获得总线使用权。
5 总结
本次博文根据瑞萨的《CAN入门书》&#xff0c;对CAN协议进行一个梳理总结&#xff0c;包括其概念、电气属性、协议、速率等&#xff0c;意在对CAN有一个基础性的认知&#xff0c;详细协议等可参见原书。
作于202302211810&#xff0c;已归档
———————————————————————————————————
本文为博主原创文章&#xff0c;未经博主允许不得转载&#xff01;
若本文对您有帮助&#xff0c;轻抬您发财的小手&#xff0c;关注/评论/点赞/收藏&#xff0c;就是对我最大的支持&#xff01;
祝君升职加薪&#xff0c;鹏程万里&#xff01;