【通信协议】——CAN
本文最后更新于 126 天前,其中的信息可能已经有所发展或是发生改变。

CAN的全称为“控制器局域网络”(COntroller Area Network),它主要应用于汽车电子行业,由德国的BOSCH公司(博世,欧洲家电第一,德国人的东西值得信赖)开发。

CAN物理层

与IIC和SPI不同,CAN总线没有时钟线,所以CAN通讯并不是以时钟信号来进行同步的,是一种异步通信方式,且只有CAN_H,CAN_L两条线共同组成差分信号线

闭环总线电路

CAN总线包括闭环、开环总线网络两种。其中闭环具有高速、短距离的特点,它的总线最大长度为40M,通信速度最高1Mbps。且总线两端各有一个120Ω电阻。

开环总线网络

开环总线网络特点为低速、远距离,他的最大传输距离为1Km,通信速度最高125Kbps,并且CAN_H,CAN_L两根线不形成闭环,且每根线上各有一个2.2kΩ。

通信节点

CAN总线上可以挂在多个通讯节点,节点之间的信号通过总线传输。但是每个节点没有对应的地址,不对节点进行地址编码;但是对发送的数据内容有ID,所以理论上可以挂在无数个节点(中继器增强负载,保证呈现正常状态)。

CAN通讯节点由一个CAN控制器和CAN收发器组成,控制器与收发器之间通过CAN_Tx,CAN_Rx相连;收发器与CAN总线之间通过CAN_H与CAN_L相连

当CAN节点需要发送数据时,CPU通过CAN控制器要把发送的数据0、1(二进制编码)通过CAN_Tx发送到CAN收发器;在收发器中将二进制编码(逻辑电平信号)转化为差分信号;通过差分线CAN_H、CAN_L线输出到CAN总线网络上;接收端,使用CAN收发器接收来自总线上的数据到CAN控制器中,则与发送是相反的过程。

CAN的Rx、Tx使用TTL逻辑信号,CAN的L、H使用差分信号。

差分信号

差分信号,就是用两根信号线,这两根信号线的振幅相同、相位相反,通过这两根线的电压差来表示0、1。

  • 大幅度提高抗干扰能力,当噪声干扰时,噪声会同时干扰两条信号线,我们只需要计算压差即可。
  • 时序定位准确,差分信号的开始是位于两个信号的交点,而不是普遍单端信号依靠高低两个电压判断(IIC的开始和停止信号)。

CAN总线中的差分信号

我们常用的闭环总线网络,所以以闭环总线网络举例。闭环总线网络当CAN_H为2.5V,CAN_L为2.5V的时候,逻辑电平为1(隐性);当CAN_H为3.5V,CAN_L为1.5V的时候,逻辑电平为0(显性)。所以当H与L压差为0的时候呈隐性,逻辑电平为1;当H与L压差为2V时呈显性,逻辑电平为0。

注意:当同一时刻,两个CAN通讯节点,一个输出隐性,一个输出显性;那么总线将呈现显性状态(类似高中生物的遗传大题)。

CAN的物理层中只有一对差分信号线,所以在同一时刻只能表示一个信号,所以CAN的通讯时半双工的,收发需要分开进行。

CAN协议层

CAN的波特率及位同步

由于CAN是异步通信,没有时钟信号线,如同串口的异步通信一般,CAN总线也是节点之间约定好波特率进行通信。CAN总线还使用”位同步“来抗干扰。

位时序分解

CAN协议把每一个数据位分解成SS段、PTS段、PBS1段、PBS2段,这四段的长度加起来即为一个CAN数据长度。最小的时间单位位Tq。

图中把每一个数据位放大,可以观察到4个段的顺序和长度。

  • SS段 (SYNC SEG):同步段。检测节点与总线时序是否同步,当通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内时则是同步。当时序同步时,采集点的电平则可被始为该点的电平。SS段的大小固定为1Tq。
  • PTS段 (PROP SEG):传播时间段。这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS段的大小可以为1~8Tq。
  • PBS1  (PHASE SEG1):相位缓冲段。主要用来补偿边沿阶段的误差,它的时间长度在重新同步 的时候可以加长 。PBS1段的初始大小可以为1~8Tq。
  • PBS2 (PHASE SEG2): 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短 。PBS2段的初始大小可以为2~8Tq。

通信的波特率

总线上的通讯节点之间只要约定好1个Tq的时间长度以及每个数据位占据多少个Tq,就可以确定CAN通讯的波特率。波特率=每秒可以传输的数据位个数。

同步过程分析

CAN的数据同步分为硬同步和重新同步,硬同步就是当设备节点发现自己的时序有CAN总线上的时序不同(节点检测到总线上的起始信号不在SS段范围内),则节点通过硬同步的方式进行调整,把自己的位时序中的SS段平移至起始信号的部分。

硬同步是在信号开始时检测节点时序与总线时序出现问题,如果在一帧很长的数据内,节点信号与总线信号发生偏移则就无法修正。而重新同步就是利用普通数据位的高至第电平的条百年来同步。

CAN的报文种类及结构

因为CAN使用的是两条差分信号线,同一时刻只能表达一个信号,所以他的协议更为复杂。

报文格式

在原始数据短的前面加上传输起始标签、片选标签和控制标签,在原始数据的尾段叫上CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包。当整个数据包通过CAN总线传输到其他设备时,只要这些设备按照这个封装规定去解读,就要可以正确提取出原始数据。这种数据包称为”CAN的数据帧“。

帧用途
数据帧用于节点向外传送数据
遥控帧用于向远端节点请求数据
错误帧用于向远端节点通知校验错误,请求重新发送上一个数据
过载帧用于通知远端节点:本节点尚未做好接收准备
帧间隔用于将数据帧及遥控帧与前面的帧分离开来

数据帧的结构

数据帧时最重要、最复杂的结构!!!

数据帧以一个显性(0)开始,以7个连续的隐性(1)结束。在他们中间分别由仲裁段、控制端、数据段、CRC段、ACK段

  • 帧起始(SOF):帧起始信号只有一个数据位,就是一个显性电平(0),它用于通知各个节点将有数据传输,其他非发送节点可以通过该位进行硬同步实现时钟与总线相同。
  • 仲裁段:总线通过仲裁段的内容来决定传输那个报文。

仲裁段主要内容为数据帧的ID信息(标识符),数据帧具有标准格式和可扩展模式两种,区别就在于ID信息的长度,标准格式的ID为11位,扩展ID在原来11位基础上多出18位。

在CAN总线中ID决定着这个数据帧的优先级,也决定着那个节点可以接受这个数据帧。

报文的优先级是通过对ID的仲裁来决定的。如下图,两个节点同时竞争CAN总线的占有权,都想发送自己的数据帧;他们前期的电平相同,所以他们会一直发送数据,当首先出现隐性电平的一方(在这一时刻节点1为隐性,节点2为显性),则失去对总线的占有权,自己的数据帧不能发送,节点转为接收状态。

仲裁段的ID也影响接收设备对数据帧反应,因为CAN总线上是以广播的形式发送数据帧的,所有连接在CAN总线上的节点都会接收到所有其他节点发出的有效数据。但是我们的CAN控制器可以根据ID来过滤数据帧。

仲裁段中除了有ID之外还有三个位,分别是RTR、IDE、SRR。

  1. RTR(Remote Transmission Request Bit):远程传输请求,他是用于区分数据帧和遥控帧的;当显性的时候表示数据帧,当隐性的时候表示遥控帧。
  2. IDE(Identifier Extension Bit):标识扩展位,他用于区分标准格式和扩展格式;当为显性时表示标准格式,当为隐性时表示扩展格式。
  3. SRR(Substitute Remote Request Bit):只存在于扩展格式,用于替代标准格式中的RTR(远程传输请求)位。在扩展格式中SRR为隐性,RTR为显性,所以在两个ID相同的条件下,标准格式的报文比扩展模式优先级更高。
  • CRC:CAN报文包含15位的CRC校验码,一旦接收节点端算出的CRC码与接收到的CRC码不同,则向发送节点反馈错误信息,请求重新发送。CRC校验码之后还有一个界定符,他为隐性位,主要用于将CRC与ACK间隔开来。
  • ACK:ACK段包括一个ACK槽位、一个ACK界定符。在ACK槽中,发动报文中的时隐性位,则接收节点在这一位中发送显性位回复。ACK段与帧结束之间有ACK界定符间隔。
  • 帧结束:EOF段,由7个隐性位组成表示结束。

其他报文结构

如果您觉得这篇文章不错,且手里较为宽裕,可以支持一下博主,一分也是缘分😊
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇