目录
报文传输
1. 帧类型
1.1 数据帧
1.1.1 帧起始
1.1.2 仲裁场
1.1.3 控制场
1.1.4 数据场
1.1.5 CRC 场
1.1.6 应答场
1.1.7 帧结尾
1.2 远程帧
1.3 错误帧
1.4 过载帧
1.5 帧间空间(INTERFRAME SPACING)
2. 发送器/接收器的定义
2.1 发送器(TRANSMITTER)
2.2 接收器(RECEIVER)
报文传输
1. 帧类型
报文传输由以下 4 个不同的帧类型所表示和控制:
-数据帧:数据帧携带数据从发送器至接收器。
-远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。
-错误帧:任何单元检测到一总线错误就发出错误帧。
-过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。
数据帧(或远程帧)通过帧间空间与前述的各帧分开。
1.1 数据帧
数据帧由 7 个不同的位场组成:
帧起始、仲裁场、控制场、数据场、CRC 场、应答场、帧结尾。数据场的长度可以为 0。
1.1.1 帧起始
它标志数据帧和远程帧的起始,由一个单独的“显性”位组成。
只在总线空闲(参见“总线空闲”)时,才允许站开始发送(信号)。所有的站必须同步于首先开始发送信息的站的帧起始前沿(参见“硬同步”)。
1.1.2 仲裁场
仲裁场包括识别符和远程发送请求位(RTR)。
识别符:识别符的长度为 11 位。这些位的发送顺序是从 ID-10 到 ID-0。最低位是 ID-0。最高的 7 位(ID-10 到 ID-4)必须不能全是“隐性”。
RTR 位:该位在数据帧里必须为“显性”,而在远程帧里必须为“隐性”。
1.1.3 控制场
控制场由 6 个位组成,包括数据长度代码和两个将来作为扩展用的保留位。所发送的保留位必须为“显性”。接收器接收所有由“显性”和“隐性”组合在一起的位。
数据长度代码:数据长度代码指示了数据场中字节数量。数据长度代码为 4 个位,在控制场里被发送。
数据长度代码中数据字节数的编码(DATA LENGTH CODE):
缩写: d—“显性”
r—“隐性”
数据帧:允许的数据字节数:{0,1,....,7,8}。其他的数值不允许使用。
1.1.4 数据场
数据场由数据帧中的发送数据组成。它可以为 0~8 个字节,每字节包含了 8 个位,首先发送 MSB。
1.1.5 CRC 场
CRC 场包括 CRC 序列(CRC SEQUENCE),其后是 CRC 界定符(CRC DELIMITER)。
CRC 序列:由循环冗余码求得的帧检查序列最适用于位数低于 127 位〈BCH 码〉的帧。为进行 CRC计算,被除的多项式系数由无填充位流给定,组成这些位流的成分是:帧起始、仲裁场、控制场、数据场(假如有),而 15 个最低位的系数是 0。将此多项式被下面的多项式发生器除(其系数以 2 为模):
X 15 + X 14 + X 10 + X 8 + X 7 + X 4 + X 3 + 1
这个多项式除法的余数就是发送到总线上的 CRC 序列(CRC SEQUENCE)。为了实现这个功能,可以使用 15 位的位移寄存器 CRC_RG(14:0)。如果用 NXTBIT 标记指示位流的下一位,它由从帧的起始到数据场末尾都由无填充的位序列给定。
CRC 序列(CRC SEQUENCE)的计算如下:
CRC_RG = 0; // 初始化移位寄存器
REPEAT;
CRCNXT = NXTBIT EXOR CRC_RG(14);
CRC_RG(14:1) = CRC_RG(13:0); // 寄存器左移 1 位
CRC_RG(0) = 0;
IF CRCNXT THEN
CRC_RG(14:0) = CRC_RG(14:0) EXOR (4599hex);
ENDIF
UNTIL (CRC 序列开始或存在一个错误条件)
在传送/接收数据场的最后一位以后,CRC_RG 包含有 CRC 序列。CRC 序列之后是 CRC 界定符,它包含一个单独的“隐性”位 。
1.1.6 应答场
应答场长度为 2 个位,包含应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。在应答场里,发送站发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK SLOT)期间(发送 ACK 信号)向发送器发送一“显性”的位以示应答。
应答间隙:所有接收到匹配 CRC 序列(CRC SEQUENCE)的站会在应答间隙(ACK SLOT)期间用一“显性”的位写入发送器的“隐性”位来作出回答。
ACK 界定符:ACK 界定符是 ACK 场的第二个位,并且是一个必须为“隐性”的位。因此,应答间隙(ACK SLOT)被两个“隐性”的位所包围,也就是 CRC 界定符(CRC DELIMITER)和 ACK 界定符(ACK DELIMITER)。
1.1.7 帧结尾
每一个数据帧和远程帧均由一标志序列界定。这个标志序列由 7 个“隐性”位组成。
1.2 远程帧
通过发送远程帧,作为某数据接收器的站通过其资源节点对不同的数据传送进行初始化设置。
远程帧由 6 个不同的位场组成:
帧起始、仲裁场、控制场、CRC 场、应答场、帧末尾。
与数据帧相反,远程帧的 RTR 位是“隐性”的。它没有数据场,数据长度代码的数值是不受制约的(可以标注为容许范围里 0...8 的任何数值)。此数值是相应于数据帧的数据长度代码。
RTR 位的极性表示了所发送的帧是一数据帧(RTR 位“显性”)还是一远程帧(RTR“隐性”)。
1.3 错误帧
错误帧由两个不同的场组成。第一个场用作为不同站提供的错误标志(ERROR FLAG)的叠加。第二个场是错误界定符。
为了能正确地终止错误帧,一“错误被动”的节点要求总线至少有长度为 3 个位时间的总线空闲(如果“错误被动”的接收器有本地错误的话)。因此,总线的载荷不应为 100%。
有两种形式的错误标志,主动错误标志(Active error flag)和被动错误标志(Passive error flag)。主动错误标志由 6 个连续的“显性”位组成。被动错误标志由 6 个连续的“隐性”的位组成,除非被其他节点的“显性”位重写。
检测到错误条件的“错误主动”的站通过发送主动错误标志,以指示错误。错误标志的形式破坏了从帧起始到 CRC 界定符的位填充规则(参见“编码”),或者破坏了应答场或帧末尾场的固定形式。所有其他的站由此检测到错误条件并与此同时开始发送错误标志。因此,“显性”位(此“显性”位可以在总线上监视)的序列导致一个结果,这个结果就是把各个单独站发送的不同的错误标志叠加在一起。这个顺序的总长度最小为 6 个位,最大为 12 个位。
检测到错误条件的“错误被动”的站试图通过发送被动错误标志,以指示错误。“错误被动”的站等待 6 个相同极性的连续位(这 6 个位处于被动错误标志的开始)。当这 6 个相同的位被检测到时,被动错误标志的发送就完成了。
错误界定符包括 8 个“隐性”的位。
错误标志传送了以后,每一站就发送“隐性”的位并一直监视总线直到检测出一个“隐性”的位为止。然后就开始发送 7 位以上的“隐性”位。
1.4 过载帧
过载帧包括两个位场:过载标志和过载界定符。
有两种过载条件都会导致过载标志的传送:
1. 接收器的内部条件(此接收器对于下一数据帧或远程帧需要有一延时)。
2. 间歇场期间检测到一“显性”位。
由过载条件 1 而引发的过载帧只允许起始于所期望的间歇场的第一个位时间开始。而由过载条件 2 引发的过载帧应起始于所检测到“显性”位之后的位。
通常为了延时下一个数据帧或远程帧,两个过载帧都会产生。
过载标志
过载标志由 6 个“显性”的位组成。过载标志的所有形式和主动错误标志的一样。过载标志的形式破坏了间歇场的固定形式。因此,所有其他的站都检测到一过载条件并与此同时发出过载标志。(万一有的节点在间歇的第 3 个位期间于本地检测到“显性”位,则其他的节点将不能正确地解释过载标志,而是将这 6 个“显性”位中的第一个位解释为帧的起始。这第 6 个“显性”的位破坏了产生错误条件的位填充的规则。)
过载界定符
过载界定符包括 8 个“隐性”的位。
过载界定符的形式和错误界定符的形式一样。过载标志被传送后,站就一直监视总线直到检测到一个从“显性”位到“隐性”位的发送(过渡形式)。此时,总线上的每一个站完成了过载标志的发送,并开始同时发送 7 个以上的“隐性”位。
1.5 帧间空间(INTERFRAME SPACING)
数据帧(或远程帧)与其前面帧的隔离是通过帧间空间实现的,无论其前面的帧为何类型(数据帧、远程帧、错误帧、过载帧)。所不同的是,过载帧与错误帧之前没有帧间空间,多个过载帧之间也不是由帧间空间隔离的。
帧间空间
帧间空间包括间歇场、总线空闲的位场。如果“错误被动”的站已作为前一报文的发送器时,则其帧空间除了间歇、总线空闲外,还包括称作挂起传送(SUSPEND TRANSMISSION)的位场。
对于不是“错误被动” 的站,或者此站已作为前一报文的接收器,其帧间空间如下图所示:
对于已作为前一报文发送器的“错误被动”的站,其帧间空间如下图所示:
间歇
间歇包括 3 个“隐性”的位。
间歇期间,所有的站均不允许传送数据帧或远程帧,唯一要做的是标示一个过载条件。
总线空闲
总线空闲的(时间)长度是任意的。只要总线被认定为空闲,任何等待发送信息的站就会访问总线。在发送其他信息期间,有报文被挂起,对于这样的报文,其传送起始于间歇之后的第一个位。
总线上检测到的“显性”的位可被解释为帧的起始。
挂起传送
“错误被动”的站发送报文后,站就在下一报文开始传送之前或总线空闲之前发出 8 个“隐性”的位跟随在间歇的后面。如果与此同时另一站开始发送报文(由另一站引起),则此站就作为这个报文的接收器。
2. 发送器/接收器的定义
2.1 发送器(TRANSMITTER)
产生报文的单元被称之为报文的“发送器”。此单元保持作为报文发送器直到总线出现空闲或此单元失去仲裁(ARBITRATION)为止。
2.2 接收器(RECEIVER)
如果有一单元不作为报文的发送器并且总线也不空闲,则这一单元就被称之为报文的“接收器”。
STM32F1之CAN介绍-CSDN博客
STM32F1之CAN基本概念-CSDN博客