【STM32】CAN总线基础入门

CAN总线基础入门

一、CAN简介

\quad CAN总线(Controller Area Network Bus)控制器局域网总线
\quad CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域

CAN总线特征:

  • 两根通信线(CAN_H、CAN_L),线路少,无需共地
  • 差分信号通信,抗干扰能力强
  • 高速CAN(ISO11898):125k~1Mbps, <40m
  • 低速CAN(ISO11519):10k~125kbps, <1km
  • 异步,无需时钟线,通信速率由设备各自约定
  • 半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序
  • 11位/29位报文ID,用于区分消息功能,同时决定优先级
  • 可配置1~8字节的有效载荷
  • 可实现广播式和请求式两种传输方式
  • 应答、CRC校验、位填充、位同步、错误处理等特性

二、主流通信协议对比

UART:

IIC:

SPI:

三、CAN物理层

1、CAN硬件电路

\quad 每个设备通过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收发器的作用:实现电平转转换、输出驱动和输入采样

有四个引脚: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(显性电平)

3、CAN收发器 -- TJA1050(高速CAN)

芯片内部电路
芯片引脚:

VCC:5V

TX、RX:与设备的CAN控制器相连

Vref:参考电平输出

S:选择输入是高速模式或者静默模式
ps:Vref和S可不接

4、CAN物理层特性

四、帧格式

1、CAN总线帧格式

CAN协议规定了以下5种类型的帧:

错误帧和过载帧:做异常处理

帧间隔:等待几位的时间

2、数据帧

数据帧有标准格式和扩展格式两种,CAN总线刚制定时,只有标准格式,扩展格式是后来新增的,扩展格式增加了ID位数,能承载更多种类的ID。

图例解释:

标准格式分析:
\quad 在发送数据帧之前,总线必须处于空闲状态,空闲状态时,总线是隐性电平(逻辑电平表示为高电平1)

  • SOF(帧起始):
    低电平,显示电平0 作用:打破总线空闲,开始一帧数据,并告诉接收方,后续若发送隐性1,即是发送过去的1。
  • 报文ID:
    1、表示后面数据的功能
    2、区分优先级:多个设备同时发送时,根据仲裁规则,ID小的报文优先发送,ID大的报文等待下一次总线空闲再重试发送
  • RTR(远程请求标志位):
    用于区分数据帧或遥控帧(数据帧为显性0,遥控帧为隐性1)

报文ID+RTR位称为仲裁段

  • IDE(ID扩展标志位):(在没有扩展帧之前是r1保留位)
    用于区分标准格式还是扩展格式,标准格式为显性0,扩展格式为隐性1
  • r0:保留位(未用到)
  • DLC(数据段长度):
    发送1个字节:0001 为显显显隐
    发送8个字节:1000 为隐显显显
  • CRC(校验算法):
    对数据位进行CRC算法计算 (SOF--Data),得出的校验码赋给CRC校验位,接收方接收到数据和校验码后,也会调用CRC算法进行计算,看看计算的校验码是否一致,以判断传输是否有误
  • CRC界定符:1位,必须是隐性电平
  • ACK槽:做应答

\quad 发送方发送完一帧数据后,在应答这一位,发送方释放总线,总线回归默认状态(隐性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界定符时,接收方必须及时释放总线,交出控制权。

注意事项

1、ACK槽时,可以允许多个接受方共同拉开总线,因为一个报文消息,可以被多个设备同时接收,所以多个设备可以同时被拉开,可以多个设备同时操作总线,输出显性0

2、不是发送方发一段完整波形,在接收应答的,而是发送方和接收方共同完成一整个波形,发送方每发出一位,接收方便立刻收到,所以整个数据帧还没结束,接收方就已经接收完成,在ACK槽接收方和发送方短暂交接权力,让接收方操作总线,产生应答,之后发送方的整个数据帧才结束(应答是夹在发送过程中的)

  • EOF(帧结束):
    应答结束后,发送方发7个隐性1

小结:设计一个波形承载数据,需要有数据段,又需要数据段的字节是可调的,就加了DLC,用于指定数据段的长度,为了区分这个数据的功能,需要加上ID号,为了实现广播式,类似于只写,或者是请求式,类似于读取,用RTR位进行区分,为了判断书是否正确传输,加上了CRC校验,为了判断是否有接收方,加了应答设计,r0,r1留的保留位,为了后续升级使用,最后整个波形,加上起始和结束就完成了

扩展格式:
(仲裁是先比较ID,后比较RTR,所以RTR必须在所有ID位的后面)

出现的原因:标准格式的ID不够用,需要添加,并且扩展格式必须要考虑于标准格式的兼容

  • 11位ID与标准格式一致
  • SRR:替代RTR位,空出来的,在仲裁规则中为了保证标准格式的优先级要高于扩展格式,虽然SRR位没用,但必须给隐性电平1
  • IDE:扩展格式标志位,隐性1

当接收方收到一段波形,就会从前往后开始判断,收到IDE后,若IDE位显性0,则后续按照标准格式来解析,若IDE为隐性1,则后续按照扩展格式来解析,在收到IDE之前,接收方是不知道哪种格式的

在两个ID中夹了SRR和IDE,是为了兼容标准格式,ID升级完成,后续时序不需要变,与标准格式一致。

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):数据长度,指示数据段有几个字节
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,其他部分与数据帧相同

  • 遥控帧的使用场景(对于不是持续需要发送数据的情况):
    如果有设备需要数据时,首先请求方会发出一个遥控帧(广播),遥控帧包含报文ID,每个设备都能收到遥控帧,如果某个设备有这个ID的数据,它就会在通过数据帧广播出来,接收方就能及时获取这个数据 。
  • 遥控帧的作用和请求流程:

\quad 一次完整的请求,需要遥控帧和数据帧的配合,请求方发出遥控帧,遥控帧的ID表示要请求的数据;响应请求的一方,通过相同ID的数据帧反馈数据,当请求和反馈数据同时发生时,数据帧拥有更高的优先级。

6、错误帧

\quad 总线上所有设备都会监督总线的数据,一旦发现"位错误"或"填充错误"或"CRC错误"或"格式错误"或"应答错误" ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备(错误帧可以叠加在数据帧上)

\quad 设备默认处于主动错误状态,处于主动错误状态的设备,检测出错误时,会连续发6个显性位(发显性位就是拉开总线,总线只要有一个设备拉开了,就必然处于显性状态,即0和1相遇时,总线总是处于0状态,这是"线与"特性),破坏正常传输的数据,其它设备检测到错误标志,就会抛弃这个数据,若主动错误产生太频繁,说明此设备不太可靠,设备就会进入被动错误状态,处于被动错误的状态,检测出错误时,会连续发6个隐性位,发出隐性位就是不去碰总线,就不会破坏总线别人发的数据,但是会破坏自己发的数据,自己的数据有问题,自己破坏掉,不会影响到别的设备发的数据。

错误帧定义:

  • 错误标志6位:
  • 错误界定符:8个隐性1
  • 0-6位延长时间:(错误标志可能会延长0~6位的时间)

一个设备发出的错误标志,可能会引发其它设备连带产生错误标志,多个设备的错误标志叠加起来,这个标志位的长度可能就不止6位了

7、过载帧

\quad 当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失。

8、帧间隔

将数据帧和远程帧与前面的帧分离开

  • 3位的帧间隔配合7位的EOF和8位的错误/过载界定符,可以实现更复杂的优先级控制策略(任何设备检测到连续11个隐性电平,即认为总线空闲)

9、位填充

数据帧和遥控帧在发送到总线之前,要经过位填充的处理

  • 位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据
  • 例如:
    即将发送: [100000110] [10000011110] [0111111111110]=
    实际发送: [1000001110] [1000001111100] [011111011111010]
    实际接收: [1000001110] [1000001111100] [011111011111010]
    移除填充后: [100000110] [10000011110] [0111111111110]

注意:

位填充插入的数据位,要和后续的数据位合并,进行新的位填充判定

位填充是发送方的最后一步处理,接收方的第一步处理

  • 位填充作用:(防止数据波形长时间不变化)
    • 增加波形的定时信息,利于接收方执行"再同步",防止波形长时间无变化,导致接收方不能精确掌握数据采样时机
    • 将正常数据流与"错误帧"和"过载帧"区分开,标志"错误帧"和"过载帧"的特异性
    • 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲

CAN总线规定:当总线出现连续11个隐性1后,即认为总线空闲

10、波形实例

  • 标准数据帧,报文ID为0x555,数据长度1字节,数据内容为0xAA
  • 标准数据帧,报文ID为0x666,数据长度2字节,数据内容为0x12, 0x34
  • 扩展数据帧,报文ID为0x0789ABCD,数据长度1字节,数据内容为0x56
  • 标准遥控帧,报文ID为0x088,数据长度1字节,无数据内容

五、位同步

1、接收方数据采样

\quad CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长

  • 发送方以约定的位时长每隔固定时间输出一个数据位
  • 接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
  • 理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近

2、接收方数据采样遇到的问题

接收方以约定的位时长进行采样,但是采样点没有对齐数据位中心(硬同步解决)

  • 接收方刚开始采样正确,但是时钟有误差,随着误差积累,采样点逐渐偏离(再同步解决)

3、位时序

为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成(Tq时间单位可以在程序中指定,,如1tq=0.5us)

定义位时序,是为了便于确定采样点的位置

位时序,是为了同步的

SS = 1Tq

PTS = 1~8Tq

PBS1 = 1~8Tq

PBS2 = 2~8Tq

每段取值范围,每一位为10tq

可以设定PTS,PBS1,PBS2为几个tq,可以灵活指定采样点是靠前还是靠后,在实际项目中,

这3个段具体该选几个tq,一般会有统一的规定

SS(同步段):同步过程

  • 如果数据跳变边沿正好出现在SS段,那就说明当前设备与波形达成同步,如果数据跳变边沿不在SS段,那就要调整当前设备的位时序,使跳变边沿正好出现在同步段。当有一个波形的数据跳变沿,正好在同步段,自己定义的位时序,就是一位的时间,下次数据如果再跳变,起始波形肯定会在下一个位时序的同步段,如果每次波形跳变沿都在同步段,那就说明当前设备的位时序与波形是同步的,即,我在当前设备定义的一位时间,正好与波形一位的时间重合,当前设备如果是接收方,那它直接在这PBS1和PBS2之间进行采样,这个采样点必然是自己想要采样的地方。
  • 如果跳变沿出现在SS段之外的地方,需要用到硬同步和再同步,来调整当前设备的位时序,使得跳变沿再次出现在SS段。

PTS(传播时间段):

  • PTS用于吸收网络上的物理延迟(发送单元的输出延迟,总线上信号的传播延迟、接收单元的输入延迟),PTS的时间为以上各延迟时间的和的两倍,控制器要发信号,由于硬件电路的限制,这个信号输出到总线,总会有一点延迟,同理,数据输入,和数据在总线上传输都会有一点延迟,此延迟信号很小,但在信号发生变化后,最好稍微延迟一点,这就是PTS段的作用。

网络的物理延迟指发送单元的输出延迟,总线上信号的传播延迟、接收单元的输入延迟

PBS1和PBS2:相位缓冲段

  • 作用:确定采样点的位置,采样点会在PBS1和PBS2中间,如果PBS1时间设置长点,PBS2时间设置短点,此时采样点靠后,相反则采样点靠前,通过调节PBS1和PBS2段的时长,就可以灵活调节采样点的位置。

4、硬同步(硬件同步)

解决的问题:使接收方的第一个采样点与波形的第一位对齐(用于一帧波形初始的位置对齐)

  • 每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方位的时序计时周期保持同步
  • 硬同步只在帧的第一个下降沿( SOF下降沿)有效
  • 经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近。

接收方内部位时序周期:

红线:总线上的波形
\quad 当红线由逻辑高电平跳变到逻辑低电平时,此时的下降沿,是发送方产生SOF的第一个下降沿,下降沿时刻,肯定是发送方的SS段,此时接收方的SS段与波形的下降沿对齐(下部分图),接收方的SS段与波形的下降沿重合,所有接收方均是,就可以保证每个设备的位时序周期同步。 

如何保证设备的秒表都同步转动?

所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方位的时序计时周期保持同步

例子:
\quad 把位时序周期想象成一个秒表,每个设备内部都有一个秒表,顺时针转动,每转一圈就是一个数据位的时间,秒表的最佳状态,所有设备的秒表都时刻处于同一位置,保持同步。
\quad 假设现在所有设备的秒表都是同步转动,有一个设备,想作为发送方,开始一段波形,那么发送方,会在自己的秒表转到SS段时,开始一个新数据位,即发送方的每次数据跳变,都会等自己的秒表转到SS段时产生,接收方内部也有一个秒表,并且它的秒表和发送方同步转动,所以,接收方的秒表,每次转到SS段,接收方就知道一个新的数据位开始了,之后接收方直接在PBS1和PBS2之间,进行数据采样,即采样点位置是对的。因此,只要所有设备内部都有一个秒表,并且秒表保持同步转动,发送方在自己秒表的SS段,跳变数据,开始新的1位,接收方在自己秒表转到PBS1和PBS2之间时,采样数据,这样就能保证,接收方每次都采样到数据位的中间附近。

5、再同步

作用:补偿误差

  • 若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW) 通过加长 PBS1 段,或缩短PBS2 段,以调整同步
  • 再同步可以发生在第一个下降沿之后的每个数据位跳变边沿

    蓝线:表示总线上发送方发出的波形
    \quad 当前数据跳变沿出现在SS段之后,接收方执行再同步,在接收方的PBS1段之后额外加上SJM指定的补偿宽度(红色部分),在PBS1段延长2Tq,下一数据位发送过来时接收方的SS段就会往后移2Tq,新的波形跳变沿,就会往SS段的方向调整,这是是接收方时钟快于发送方。(图示上半部分)
    \quad 接收方时钟快于发送方,接收方秒表慢与发送方,波形的数据跳变沿提前出现,在SS段之前,此时接收方把PBS2段减少SJW指定的宽度。

总结:以普通的数据跳变沿为参考,如果接收方时钟快了,加长对应的时间(图示上半部分),如果接收方时钟慢了,就减少对应的时间(图示下半部分)

6、波特率计算
波特率:数据位的传输速率 单位:bps(每秒传输多少个bit)

波特率 = 1 / 一个数据位的时长 = 1 / (TSS + TPTS + TPBS1 + TPBS2)

例如:

SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq

Tq = 0.5us

波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps

六、仲裁

1、多设备同时发送遇到的问题

CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?

  • 解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线

    问题:
    第一种情况:在A设备发送中途,B设备要开始新的发送-->可以使用先占先得
    \quad 假设设备A发出上方波形,设备B发出下方波形,在A设备发送中途,B设备要开始新的发送,若不做处理,总线上实际的波形是二者波形进行"线与"的叠加,即只要有一个设备拉开总线,总线就呈现显性0状态,只有所有的设备都释放总线,总线才呈现隐性1状态,那按照"线与"特性叠加后,显然,两个波形都必然产生数据损坏,二者的数据都无法发出去,所以,CAN总线的设计必须要考虑多设备同时发送遇到的资源冲突问题。
    第二种情况:A,B设备同时开始一段波形--- 可以使用非破坏性仲裁

2、资源分配规则1 - 先占先得

若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)

  • 任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧
  • 一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送
  • 若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求

11个隐性电平:1个ACK界定符+7个EOF+3个帧间隔

3、资源分配规则2 - 非破坏性仲裁

若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送

  • 实现非破坏性仲裁需要两个要求:
    • 线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1
    • 回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实的发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1

4、非破坏性仲裁过程

数据位从前到后依次比较,出现差异且数据位为1的设备仲裁失利

几个设备同时发送时的仲裁过程:
\quad 当两个设备同时发送波形时(如下图单元1和单元2),能进行仲裁的数据位包括帧起始位+仲裁段(ID+RTR),在ID段两个设备同时发送波形并进行回读(发一位回读一位),当单元1发送波形到红色部分时,单元1发送1隐性电平,单元2发送0显性电平,根据"线与"特性,单元1回读为0,单元2回读为0,从数据正确性看:由于单元1回读的是0,与原本发的1不同,所以单元1的数据被破坏了,无法继续发,从设备感知看:发出的是1,回读却是0,单元1 感知到有别的设备存在,所以退出,而单元2的数据,每次发和回读的数据都是一样的,感知不到有别的设备存在,所以继续。综合以上两个原因,单元1应该退出,让出总线控制权。再此之后,单元2继续发送它的电平,依旧是发一位回读一位,只有发出的数据和读回的数据一样,才会继续发送。在仲裁段,一旦出现发出的数据和读回的不一样,那就是仲裁失利,自己得主动退出。

\quad 总结:当多个设备同时发送波形时,每个设备仍然执行"发一位,回读一位"的流程,一旦回读的和自己发的不一样,自己就退出,又因为每个设备发出消息的仲裁段都必然不同,所以,在仲裁段数据位从前往后的比较中,必然会陆续有设备主动退出,并且在仲裁段结束时,必然有且只有一个设操作总线,之后,再执行后续数据位的发送,就不会再出现多设备冲突的问题。

为什么ID号小的优先级越高?
\quad ID号越小,说明在二进制中显性0就越多,所以就越有希望占有总线的控制权
位填充会不会影响仲裁?
\quad 位填充的作用范围是:帧起始、仲裁场、控制场、数据场以及CRC序列,所以在仲裁场里,会执行位填充,在位填充时加入一些相反位,会不会号致仲裁优先级的变化,如11位ID中全部为0,在ID号中,根据位填充规则,每隔5位,就会插入一个1,实际的11位ID就会变成00000 1 00000 1 0 ,11位ID会插入两个填充位,ID就变成13位,不会导致仲裁出错,或者ID号的优先级变化,原因是填充位不会改变ID号的优先级。
为什么称为非破坏性仲裁
\quad 从仲裁后优先级最高的那个ID中,它仲裁段所有的位,发出和回读的都一样, 中间不会受到其它发送方的影响,它的发送过程,也没有因为仲裁而受到任何影响,所以这个过程是非破坏性的。

5、数据帧和遥控帧的优先级

数据帧和遥控帧ID号一样时,数据帧的优先级高于遥控帧
\quad 如下图,相同ID号的数据帧和遥控帧是有可能进行仲裁的,单元1(A设备)发出1个遥控帧,表示想要请求一个ID号的数据帧,而这时,单元2(B设备)正好也要发出这个ID号的数据帧,那么就会出现相同ID的数据帧和遥控帧仲裁的情况,(相同ID号的数据帧和数据帧是不允许同时出现的,相同ID号的遥控帧和遥控帧也是不允许同时出现的,如果是这样,它们之间的仲裁段完全一样,就无法判断优先级了)。

\quad 第一行是单元1发出的遥控帧,表示想要请求这个ID的数据,单元1正好也在发送相同ID的数据帧,两者进行仲裁,单元1和单元2都执行"发出一位,回读一位"的仲裁流程,因为ID号完全一致,所以当11位ID发出后,单元1和单元2,每次回读总线的数据都是和自己发出的数据是相同的,所以11位ID不能区分数据帧和遥控帧的优先级,此时就需要靠仲裁段的最后一位RTR来进行决断(RTR位,遥控帧定义为1,数据帧定义为0),所以在这一位时 ,单元1发出数据1,单元2发出数据0,总线呈现数据0状态,之后单元1回读总线值,读出的是0,所以单元1仲裁失利,之后单元1转入接收,不再操作总线,单元2继续操作总线,发完剩下的所有位。因为RTR定义是,1为遥控,0为数据帧。所以就有ID号相同时,数据帧优先级高于遥控帧的设定。

6、标准格式和扩展格式的优先级

标准格式11位ID号和扩展格式29位ID号的高11位一样时、标准格式的优先级高于扩展格式(SRR必须始终为1,以保证此要求)

\quad 单元1(扩展数据帧和)和单元2(标准数据帧)的11位ID号完全一致,若不一致,在11位ID前就可以仲裁出结果,单元1在发完11位ID后是SRR位,在扩展数据帧中,SRR位必须始终为1,所以单元1此时打出数据1,单元2此时发出RTR位,因为单元2是数据帧,RTR位是0, 所以单元2发出数据0,所以总线呈现0状态,单元1出现"发1读0"的现象,所以单元1仲裁失利,转入接收状态,单元2,继续发送后续数据,因此,当标准数据帧和护展数据帧相遇,并且前11位ID号都一样时,标准数据帧的优先级高于扩展数据帧。

7、扩展数据帧和标准遥控帧的优先级

\quad 扩展数据帧和标准遥控帧的前11位ID一样时,标准遥控帧的RTR位是1,扩展数据帧,SRR位也是1,在这个位置,扩展数据帧和标准遥控帧仍然无法决出谁的优先级更高,此时标准遥控帧的仲裁段已经结束了,也就是标准遥控帧直到仲裁段结束,都无法和扩展数据帧决出谁的优先级更高,这样会不会导致错误呢?答案是不会的。
\quad 因为标准遥控帧仲裁段虽然结束了,但是扩展数据帧仲裁段仍然没有结束,标准遥控帧RTR之后,跟的是IDE,扩展标志位,因为它是标准遥控帧,所以IDE为0,而扩展数据帧SRR之后也是IDE位,因为它是扩展帧,所以IDE为1,在这一位,虽然标准遥控帧已经不再执行仲裁了,但是扩展数据帧仍然执行仲裁,并且扩展数据帧会出现"发1读0"的情况,所以,扩展数据帧仲裁失利,转入接收状态。两者比较,直到标准遥控帧仲裁段结束,到下一位IDE,才能比出优先级,若非如此,后续很有可能产生错误。

七、错误处理

错误处理是CAN总线额外的安全保障机制,当某个设备检测到总线的帧传输出错时,主动发出错误帧,通知总线上的设备这个帧是错的 ,收到帧的设备就会去掉这个错误帧,以免收到影响。

1、错误类型

错误共有5种: 位错误、填充错误、CRC错误、格式错误、应答错误

\quad 发出错误帧的行为,叫做错误通知。不管其他设备有没有检测到这个错误,当其中一个设备检测到了错误,其会破坏这帧数据,其他接收设备都不能接收,错误帧一旦产生,这帧数据将无效,数据传输也会终止,等错误帧结束后,总线回归空闲,后续才可以正常发数据。

【回顾】

\quad 错误帧的两种形式:由6位的错误标志和8位的错误界定符组成,错误标志分为主动错误标志和被动错误标志两种,主动错误标志是6个显性0,被动错误标志是6个隐性1,根据"线与"特性,主动错误的6个显性0,会破坏总线上的数据,无论其它设备如何发数据,只要它不释放总线,其它设备发来的数据就会被破坏,而被动错误的6个隐性1,并不会影响当前总线上已有的波形,如果别设备正在发出波形,自己发的是被动错误标志,那别设备发来的波形不会受到影响,

过载帧:只有一种形式,就是6个显性位


帧间隔
\quad 在连续发出的数据帧或遥控帧之间,会保留3位的帧间隔,帧间隔也分主动错误状态和被动错误状态,主动错误状态的帧间隔是3个隐性位(上方图示),被动错误状态,在3个隐性位的帧间隔后,还要加8个隐性位的延迟传送(下方图示)
\quad 错误通知赋予了每个设备破坏传输的能力,有一定的风险,当某个设备有问题时,接收到的数据都认为是错误帧,便会不断破坏数据,干扰正常的数据传输,所以要加上一些限制措施,这个限制措施就是错误状态。

2、错误状态

  • 主动错误状态的设备正常参与通信并在检测到错误时发出主动错误帧(会破坏其它设备发出的数据)
  • 被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误帧(不会破坏其它设备发出的数据)
  • 总线关闭状态的设备不能参与通信
  • 每个设备内部管理一个TEC和REC,根据TEC和REC的值确定自己的状态
    TEC:(Transmit Error Counter:发送错误计数器):
    设备在发送时,每发现一个错误,TEC加1,同时每进行一次正常的发送,TEC减1
    REC(Receive Error Counter)是接收错误计数器:
    设备在接收时,每发现一个错误,REC加1,同时每进行一次正常的接收,TEC减1
    即TEC和REC的值,反映了当前设备检测错误的相对频率

    主动错误状态---->被动错误状态---->总线关闭状态

eg:若某个设备因为REC而转到被动错误状态,该设备只要进行一次正确接收,就会转为主动错误状态

3、错误计数器

4、波形示例(基于ACK错误)

  • 设备处于主动错误状态,发送标准数据帧,正常传输
  • 设备处于主动错误状态,发送标准数据帧,检测到ACK错误(主动错误状态)
  • 设备处于被动错误状态,发送标准数据帧,检测到ACK错误(被动错误状态)
相关推荐
学习路上_write9 分钟前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
非概念15 分钟前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
jjjxxxhhh1232 小时前
FPGA,使用场景,相比于单片机的优势
单片机·嵌入式硬件·fpga开发
无敌最俊朗@2 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_2 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
changingshow3 小时前
Arduino IDE Windows 系统 离线安装 esp32 开发板 亲测好用。
单片机·嵌入式硬件
7yewh5 小时前
嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻
驱动开发·stm32·嵌入式硬件·mcu·物联网·硬件架构·pcb工艺
Chervin12 小时前
Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建
linux·单片机·ubuntu·arm
TeYiToKu13 小时前
笔记整理—linux驱动开发部分(8)framebuffer类设备
linux·驱动开发·笔记·嵌入式硬件·arm
电子工程师UP学堂15 小时前
STM32 设计的较为复杂的物联网项目,包括智能家居控制系统,涵盖了硬件和软件的详细设计。
stm32