本文主要介绍 CAN FD 。
2. CAN FD 简介目前 CAN FD 有两个版本 ,一个是博世开发的原始 CAN FD ,一般可称为 non-ISO CAN FD ,另一种是 ISO 官方的 ,称为 ISO CAN FD 。这两种版本区别在与 CRC 校验这一块 ,为提高故障检测能力 ,ISO CAN FD 引入了一个填充位计数器和一个奇偶校验位且 CRC 计算方法也发生了变化 。这里主要讲解 ISO CAN FD ,主要参考 ISO 11898-1: 2015 ,需要注意着两者不能混用 。此外 ,会在具体的地方比较 CAN 和 CAN FD 的区别 。
2.1 概述CAN FD 是一种串行通讯协议 ,除了控制域 BRS 位至 CRC 界定符之外的其余内容传输速度可达 1Mbit/s 。总线由单一可双向信号传送的通道组成 ,其是多主机控制 。CAN 速率最高为 1Mbps 。
CAN / CAN FD的地址范围由识别符定义 ,标准格式有 11 个识别符 ,扩展格式有 29 个识别符 。
总线有两种逻辑值 :"显性”和“隐性”。这两种同时传送时 ,总线传送的是 “显性”,通常我们用逻辑 0 代表 “显性”,逻辑 1 代表 “隐性”。
CAN / CAN FD 是 MSB 传输的 。即对于一个字节 ,从 b7开始传送 。
对于 CAN FD ,报文传输由以下 3 种帧类型表示和控制 :
(1) 数据帧 :将数据从****发至接收器 ,数据帧优先级高于远程帧
(2) 错误帧 :任何单元检测到错误就发出错误帧
(3) 过载帧 :为前后的数据帧 / 远程帧之间提供一附加延时
注意 :CAN 除了以上三种 ,还有远程帧 ,发至总线 ,可以请求具有同一识别符的数据帧 。
2.2 数据帧
图 1 CAN / CAN FD 数据帧
如图 1 ,这是一帧数据帧 ,包含了帧起始 、仲裁域 、控制域 、数据域 、CRC 域 、应答域和帧结束 。如图 2 ,是 CAN 标准帧 ,图 3是 CAN 扩展帧 ,图 4~5是 CAN FD 标准帧 ,但支持的数据大小不一致 ,CRC 位数不一致 ,图 6~7 ,是 CAN FD 扩展帧 ,支持的数据大小不一致 , CRC 位数不一致 。CAN 的 CRC 为 15 位 。
图 2 CAN 标准帧的帧起始至 CRC 域(数据域最高 8 字节)
图 3 CAN 扩展帧的帧起始至 CRC 域(数据域最高 8 字节)
图 4 CAN FD 标准帧的帧起始至 CRC 域(数据域最高 16 字节)
图 5 CAN FD 标准帧的帧起始至 CRC 域(数据域 20 ~ 64 字节)
图 6 CAN FD 扩展帧的帧起始至 CRC 域(数据域最高 16 字节)
图7 CAN FD 扩展帧的帧起始至 CRC 域(数据域 20 ~ 64 字节)
由一个单独的“显性”位组成 。注意 :只有总线空闲才允许发送此信号 。
2.2.2 仲裁域仲裁域包括识别符和 RRS 等 。
(1) 标准格式中 :仲裁域由 11 位识别符和 RRS 位组成 。识别符位为 ID28~ID18 。
(2) 扩展格式中 :仲裁域包括 29 位识别符 、SRR 位 、IDE 位和 RRS 位 。 识别符位为 ID28~ID0 。
SRR 位是一个 “隐性”位 。但接收 “隐性”也不导致帧错误 。
IDE 位为识别符扩展位 ,在标准帧里为 “显性”(此时在控制域) ,在扩展帧里为 “隐性”。
RRS 位是远程请求替换 ,永远为“显性” ,接收到“隐性” 不为帧错误 。注意 : CAN FD 里无远程帧 。 此位对应 CAN 的 RTR ,在 CAN 中此位为远程发送请求位 ,数据帧为 “显性” ,远程帧为 “隐性” 。
2.2.3 控制域扩展帧由 8 位组成 ,标准帧由 9 位组成 ,由 IDE 、FDF 、res 、BRS 、ESI 和 DLC 组成 。(在 CAN 中都是 6 位 ,有 IDE ,r0 、r1 和 DLC 组成)
注意 :IDE 在标准帧是在控制域中 ,在扩展帧是在仲裁域中 。
FDF 位区分了 CAN 帧和 CAN FD 帧 ,在 CAN 帧是 “显性” ,在 CAN FD 帧是 “隐性” 。在标准帧中对应 r0 ,在扩展帧中对应 r1 。注意 :CAN 扩展帧在 r1 之后还有一个 r0 ,都为 “显性” 。
r0 位是 CAN 扩展帧才有的位 , 扩展预留位 ,“显性”发送 ,此位导致的错误不能视为帧错误 。
res 位是扩展预留位 ,永远为 “显性” 。CAN 中无此位 。
BRS 位是切换比特率位 ,该位 “隐性” ,表示接下来的位至 CRC 界定符的位将以另外的比特率传送 ;该位 “显性” ,表示接下来的位以仲裁阶段速率传送 。CAN 中无此位 。
ESI 位是节点错误状态指示位 ,该位 “显性” ,表示发送节点为错误主动节点 ;该位 “隐性” ,表示发送节点为错误被动节点 。CAN中无此位 。
DLC 是数据长度位 。与 CAN 相比 ,CAN FD 在控制域多出了 res 、BRS 和 ESI 位 。 其 DLC 表示长度也不相同 ,如图 8 。
图 8 DLC 在 CAN 与 CAN FD 代表的位数
2.2.4 数据域数据帧允许 0~64 Byte ,最小单位为 Byte 。其频率与仲裁阶段可以不一致 。(在 CAN 中 ,数据帧为 0~8 Byte ,频率与仲裁阶段一致)
2.2.5 CRC 域由 填充计数器 、 CRC 序列与 CRC 界定符组成 。CAN 无填充计数器 。
填充计数器总共 4 位 ,有 3 个格雷编码和 1 个奇偶校验位组成 。其数值是 CRC 域之前所有填充位计数总和除以 8 的余值 。如图 9 。
图 9 填充计数
对于 CAN ,CRC 序列是 15位 ,无固定填充位和填充计数 ,计算 CRC 时应当是排除填充位的位流 。对于 CAN FD ,数据域数据小于等于 16 Byte ,则 CRC序列是 17 位 ,若数据域数据在 20~64 Byte ,则 CRC 序列是 21 位 。CAN FD 帧中 ,除了固定填充位外 ,填充计数和填充位都应该包含在位流中进行 CRC 中 。(在 CAN 中填充位流是被排除在 CRC 计算位流之外的) 在帧起始时 ,所有节点并发计算三个 CRC 序列 ,赢得仲裁的节点发送由帧的 FDF 和 DLC 选择的 CRC 序列 ) 。
图 10 CAN 及 CAN FD 的三种 CRC 序列
CRC 界定符是一单独的 “隐性”位 。CRC 界定符及以后内容不填充 。在 CAN FD 中 ,可以有一个或两个 “隐性”位组成 。发送方发送一个 “隐性”位作为 CRC 界定符 ,但在应答间隙 “显性”之前应当能接受有两个 “隐性”位 。
2.2.6 应答域 (ACK 域)由 2 个部分组成 ,分别为应答间隙 (ACK SLOT) 和应答界定符 (ACK DELIMITER) 。在应答域里 ,发送端发送两个 “隐性”位 。
当接收端接收到有效报文 ,接收端就会在应答间隙 (ACK SLOT) 期间向发送端发送一 “显性”位以示应答 (即发送 ACK 信号) 。CAN FD 帧应当能接受最长 2 位的应答间隙 。
应答间隙 :所有接收到匹配 CRC 序列的接收端会在应答间隙期间用一 “显性”的位写入发送端的 “隐性”位来做出应答 。
应答界定符 :必定为一 “隐性”位 。
2.2.7 帧结束 (EOF)由7个 “隐性”位组成 。
对于接受方而言 ,如果直到帧结束最后一位之前都无错误 (最后一位错误也可以),接受方才有效 。注意 :若帧结束最后一位是 “显性” ,不是帧错误 ,接收方应当发送过载帧 。
对于发送方 ,只有直到帧结束最后一位都无错误才有效 ,此时发送方将发送错误帧 (如果是主动错误的帧 ,接收方将认为是过载帧接收 ,并可以接收下一帧) ,然后开始自动重发造成错误的帧 ,注意此时若有其他节点发送 ,将发生仲裁 。自动重发可禁用(看是否有此选项的支持) 。
2.2.7 远程帧CAN FD 中无远程帧 ,CAN 有远程帧 。远程帧相比数据帧 ,没有数据域 。远程帧的 DLC 一般要求与所请求的数据帧的 DLC 一致 。
2.3 错误帧由两个不同的域组成 ,第一个域是用不同节点提供的错误标志 (ERROR FLAG) 的叠加 。第二个域是错误界定符 。
为了正确终止错误帧 ,“错误被动”的节点要求总线至少有长度为 3 个位时间的总线空闲 。
有两种形式错误标志 ,如下 :
(1) 主动错误标志 :由 6 个连续的 “显性”位组成 。
(2) 被动错误标志 :由 6 个连续的 “隐性”位组成 ,除非被其他节点 “显性”位重写 。
检测到错误条件的主动错误节点通过发送主动错误标志指示错误 ,错误标志的形式破坏了从帧起始到 CRC 界定符的位填充规则 ,或者破坏了 ACK 域或帧结尾场的固定形式 。所有其他节点由此检测到错误条件并同时其中一部分发送错误标志 。“显性”位的序列由此导致了个别节点发送的不同的错误标志叠加在一起 。这个序列的总长度最小为 6 位 ,最长为 12 位 。
检测到错误的被动错误节点尝试发送被动错误标志指示错误 。在这里分两种情况 。
如果是接收方发起的被动错误标志 ,则不能凌驾于总线任何活动之上 ,其要等待 6 个相同极性的“隐性”连续位 。当此 6 个相同的位被检测到 ,被动错误标志发送完成 。
如果是发送方发送的被动错误标志 ,如果是在以位填充方法编码的域中 (CRC 界定符之前所有字节) ,接收方将检测到填充错误 。(有两个例外 : 第一个是在发送仲裁域时有竞争 ,即仲裁期间有另外节点发送仲裁域的 ,这将不引起填充错误 ,第二个是 CRC 序列离结束还不到 6 个位时开始被动错误标志且切好从这时开始 CRC 序列都是隐性的) 。
错误界定符 :包括 8 个 “隐性”位 。错误标志传送以后 ,节点就发送 “隐性”位并一直监视总线出现 “隐性”位 ,然后发送其他 7 个 “隐性”位 。
2.4 过载帧由两个域组成 :过载标志和过载界定符 。
有三种情况会引发过载标志传送 :
(1) 接收端内部情况 (此接收端对下一个数据帧要有一延时) 。
(2) 在间歇的第一和第二字节检测到一个 “显性”位 。
(3) 如果任意节点在错误界定符或过载界定符的第 8 位 (最后一位) ,采样到一 “显性”位 ,或者接受方在数据帧帧结束最后一位检测到一 “显性”位 ,节点会发送一个过载帧 ,错误计数器不增加 。
情况 1 引发的过载帧只允许起始于所期望的间歇的第一个位时间 ,情况 2 和情况 3 引发的过载帧应起始于所检测到 “显性”位之后的位 。
过载标志 :由 6 个 “显性”的位组成 ,其余节点检测到过载标志也会发送过载标志 。
过载界定符 :与错误界定符一样 。
2.5 帧间空间数据帧与先行帧 (无论那种帧类型) 的隔离是通过帧间空间实现的 。但错误帧和过载帧之前不应当有帧间空间 ,多个过载帧之间不应当有帧间空间分隔 。
帧间空间包括间歇 、总线空闲这两个域 。如果 “被动错误”的节点已作为前一报文的发送端 ,帧空间还包括了挂起传送的域 ,如图 11 和图 12 。
图 11 帧间空间 (无挂起传送)
图 12 帧间空间 (有挂起传送)
间歇 :包括 3 个 “隐性”位 。间歇期间 ,所有节点不可传送数据帧 ,只允许发出过载帧 。如果有报文等待发送且节点在间歇第三位采集到 “显性”位 ,则此位被解释为帧的起始 。
总线空闲 :总线空闲是任意长度 。当接收方和 “主动错误”节点传输时 (无挂起传送),间歇的第三个位为 “隐性” ,此节点认为总线空闲 ;或“被动错误”节点传送时(有挂起传送),挂起传送第 8 位为 “隐性”,此节点认为总线空闲 ,或退出总线集成状态 ,此节点认为总线空闲 。在传输另一帧期间 ,挂起等待传输的帧应当在间歇后第一个位开始传输 。
挂起传送 :跟随在间歇的后面 , 在下一个报文开始传送或者总线空闲之前发出 8 个 “隐性”的位 ,若没有其余节点发送 ,必须等到挂起传送结束进入总线空闲 ,此 “被动错误”节点才可以继续发送 。但如果有另一个节点在此期间开始传输 ,则此 “被动错误”节点则作为接收方 。
2. 6编码位流编码 :NRZ 编码方式 ,数据帧与远程帧的帧起始 、仲裁域 、控制域 、数据域 、CRC 域 ,发送端只要检测到位流里有 5 个连续相同值的位 ,便自动在位流里插入一互补位 (即与连续相同值反相的逻辑电平) ,其余的 CRC 界定符 、 应答域和帧结尾还有错误帧和过载帧都不填充 。要注意 :填充的位在解析时要去掉 。
对于 CAN FD ,CRC 域会在每经过 4 个 bit 之后插入填充位 ,称为固定填充位 。固定填充位的值为其前一个位的反转值 。如填充计数 ,其之前有一个固定填充位 ,注意即使前面 5 个连续值数值相同 ,这里也只会有 1 个固定填充位 ,而不允许有 2 个连续填充位 ,填充计数之后也应当有一个固定填充位 。如果固定填充位错误 ,会导致帧错误 。
2.7 仲裁与优先权总线空闲时 ,任何节点都可以传送报文 ,任何节点都可以接收报文 (多播) ,具有较高优先权的报文可获得总线访问权 。
仲裁即在多个节点同时传送报文时 ,针对总线访问冲突的解决方法 。仲裁期间 ,每一个节点都对发送位的电平与被监控的总线电平进行比较 ,电平相同 ,则这个单元可以继续发送 ,如果不一致 ,则该节点仲裁失败 ,必须退出发送状态且不发送更多位 。注意 “显性”和“隐性”同时发送时 ,总线为 “显性”。所以当发送 “显性”但是检测到 “隐性”,即使有位错误 。
在标准帧 ,仲裁期间应从标识符第一位开始 ,直到 IDE 结束 ,对于扩展帧 ,仲裁期间应从表示符第一位开始 ,直到 RTR (CAN 帧)或 RRS (CAN FD 帧)结束 。即整个仲裁域都要仲裁 。
2.8 总线集成状态总线集成状态 :在总线关闭恢复或协议异常事件之后的期间 ,一个节点启动协议操作后等待空闲条件的状态 在空闲条件后应当退出此状态 。协议异常事件一般是对 CAN FD 节点和不接收或发送 CAN FD 帧但不干扰 CAN FD 帧的节点而言 , 此时不会改变错误计数器 ,但会启用硬同步 ,进入总线集成状态 。
当进入总线集成状态或总线在采样点检测到 “显性” ,应当重置位计数器 。当总线在采样点检测到 “隐性” ,位计数器应当增加一 。当为计数器到达 11 时应当认为是空闲条件 ,然后计数器重置 。为了检测总线关闭恢复条件 ,应该有第二个计数器 ,此计数器每检测到一个空闲条件就加一 。
处于总线关闭状态的节点在检测到空闲条件后 ,如果还没满足总线恢复条件 ,则重新进入总线集成状态 。
对于CAN FD 节点和不接收或发送 CAN FD 帧但不干扰 CAN FD 帧的节点而言 ,当检测到导致同步的沿变时 ,位计数器应当重置 。注意此时对于数据阶段的脉冲也是认为是一个脉冲 ,而不认为是空闲条件 。
2.9 受限操作模式CAN / CAN FD 可以选择受限操作模式 ,即可以接收数据帧和远程帧 ,并做出下应答 ,当不能发送错误帧和过载帧 ,有错误帧和过载帧出现 ,将认为是协议异常事件 ,并进入总线集成状态 。在此操作模式中 ,错误计数器不得增加或减少 。
2.10 节点时间同步为了节点时钟同步,任何消息应采用 SOF 位或 EOF 最后一位的采样点作为参考点 ,这有助于建立全网时基(时基是一种至少16位的循环向上计数器,其馈电由内部或外部滴答发生器产生的时钟滴答。),可使用时间触发通信 。此时接收或发送都应该捕获 SOF 或 EOF 最后一位的采样点获得的时基 ,且可以在时基范围内触发一个可编程的事件 。注意 ,硬件上这是可选的,即不一定是必须有的。
2.11 时间戳时间戳的宽度应为 8 、16 或 32 位 ,这其实就是计数器的位数 。其时钟源应该为节点内部生产的时钟或逻辑链路层 (LLC) 指定 ,计数器应该增加 ,并且溢出时归零 。
LLC 使用者应当可以随时读取计数器的值 ,这个值在每帧的参考点被捕获到 ,一般而言 ,对于 CAN ,参考点一般是相应帧的 SOF 采样点或帧的有效时间点 ;对于 CAN FD 帧 ,参考点一般是 SOF 采样点或 res 采样点或帧的有效时间点 ,在 EOF 之后 ,捕获的时间戳值应当由 LLC 使用者读取 。(帧有效时间点:对于接收器,直到 EOF 结束都没有错误才算是有效 ;对于接收器 ,直到 EOF 倒数第二个结束前没有错误才算有效)
2.12 位时间标称比特率 :标称比特率是理想发送端在没有重新同步的情况下每秒传输的位数 。
在 CAN FD 中 ,应当还有一个数据比特率 ,此数据比特率应该不小于标称比特率 。CAN FD 帧分数据阶段和仲裁阶段 ,数据阶段从 BRS 的采样位开始 ,到 CRC 界定符的采样点结束 。 除此之外的其他阶段称为仲裁阶段 。CAN 帧全属于仲裁阶段 。
标称位时间 := 1 / 标称比特率 ,即位的持续时间 ,如位时间是 0.2 μs ,则这个时间段内全是这个位所代表的电平 (全是 “隐性”或 “显性”) 。仲裁阶段使用标称位时间 。
数据位时间 := 1 / 数据比特率 ,当 BRS 为 “隐性” ,数据阶段切换至数据位时间 。
图 13 标称位时间和仲裁位时间切换过程
可以将标称位时间视为划分为单独的非重叠时间段。 这些划分 :(重新同步也有译为再同步 ,重同步)
(1) 同步段 (Sync_Seg) :同步总线不同节点 ,这一段有跳边沿是可进行同步
(2) 传播时间段 (Prop_Seg) :补偿网络内物理延时时间 ,包括总线上的信号传播时间和CAN节点的内部延迟时间
(3) 相位段 1 (Phase_Seg1) :用于补偿边沿相位误差 ,可通过重新同步加长或缩短
(4) 相位段 2 (Phase_Seg2) :用于补偿边沿相位误差 ,可通过重新同步加长或缩短
图 14 标称位时间和仲裁位时间
采样点 :读总线电平并认为是每个位的值的一个时间点
时间量子 Tq :派生于振荡器周期的固定时间单元 。存在一个可编程预比例因子 ,整体数值范围为 1~32 。在 CAN/CAN FD 中这个是最小时钟单位 。
信息处理时间 :以采样点位起始时间段 ,采样点用于计算后续位的位电平 ,不大于 2 个 Tq
同步跳转宽度 (SJW) :重新同步时 ,相位段 1 增加和相位段 2 减小的上限
位时间四个时间段分配如下 :(都为是时间量子 Tq 的倍数)
图 15 标称位时间和仲裁位时间段的分配
上图中 ,一些限制如下 :
数据位时间的相位段 2 应不小于最大信息处理时间 。
标称位时间的相位段 2 应不小于 SJW 和信息处理时间之间的最大值 。
标称位时间和数据位时间中 ,SJW 应不大于相位段 1 和相位段 2 之间的最小值 。
在某一些配置中 ,可能会将传播时间段 Prop_Seg 和 相位段 1 Phase_Seg1 和在一起 ,作为一个量 。对于 CAN ,一个标称位时间范围为 :8~25 Tq ,对于 CAN FD ,一个标称位时间范围为 :8~80 Tq ,一个数据位时间范围为 :5~25 Tq 。
对于标称位时间和数据位时间的范围由以下建议(仅限高速 CAN,仲裁比特率就是标称比特率 ,仲裁位时间是标称位时间) :
1 :支持数据比特率为 2mbit /s 或小于或等于仲裁比特率的四倍 ,两者中较低的为准 。
2 :支持数据比特率为 5mbit /s 或小于或等于仲裁比特率的十倍 ,两者中较低的为准。
在数据阶段 ,在持续时间内小于或等于仲裁位时间的 pBitfilter 最小值的 “显性”信号不应被视为“显性” ,并且不得重新启动隐性位计数器 。 持续时间大于或等于仲裁位时间的 pBitfilter 最大值的 “显性”信号应重新启动隐性位计数器。 图16 根据所选择的位过滤器选项将pBitfilter指定为仲裁位时间的百分比 。
图 16 CAN FD 数据阶段 pBitfilter 的值
2.13 同步2.13.1 硬同步硬同步后 ,接收端的内部位时间从同步段重新开始 ,即跳变沿处于重新开始的位时间同步段之内 。
沿过滤功能开启后 ,短于两个标称时间量子 Tq 的显性总线状态将被忽略 。
2.13.2 重新同步位时间相位误差 :
一个沿的相位误差由相对于同步段的跳边沿出现的位置给出 ,以时间量子量度 。相位误差定义如下 :
e=0 跳边沿处于同步段里
e>0 跳边沿处于同步段之后 ,当前采样点之前(即理想的位时间中有一个跳变沿)
e<0 跳边沿处于下一个同步段之前 ,当前采样点之后 (即理想的位时间中有两个跳变沿)
图 17 接收端位定时与同步
(注 :S 是同步段 ,P 是传播时间段 ,P1 是相位缓冲段 1 ,P2 是相位缓冲段 2)
重新同步结果 ,可能引起当前位相位缓冲段 1 增长或相位缓冲段 2 缩短 ,但这个增量有一个上限 ,就是由同步跳转宽度 (SJW)给出 。
当前位定时出现 e≠0 时 ,若相位误差不大于 SJW ,则:
e>0 ,当前位时间的相位缓冲段 1 增加相位误差的绝对值个时间量子
e<0 ,当前位时间的相位缓冲段 2 减少相位误差的绝对值个时间量子
这里其实与硬同步的作用相同 。但若相位误差大于 SJW ,则增加或减少的时间量子就为 SJW 。
同步原则 :
在一个位时间 (两个采样点之间)里只允许一个同步 。同步被检测到后 ,禁用同步 ,直到下一次采样点检测到 “隐性”才开启同步 。
只有前一个采样点检测到总线为 “隐性” ,接下来的边沿才会进行同步 。如果发送端启动 TDC ,CRC界定符采样点之后的第一个从 “隐性”至 “显性”的沿也将触发同步 ,这种情况也可以选择在CRC 界定符之后第一个从 “隐性”至“显性”(至少发送延时间迟加上一个 Tq 时间的时间内)的边沿同步 。第一个相位误差为正的边沿不应当在发送显性位的节点中引起同步 。
节点处于总线集成状态时 ,帧间间隔期间(间歇第一位除外)的沿变 (从 “隐性” 到 “显性”)将导致硬同步 ;在 CAN FD 帧的 FDF 至接下来的 res 上的沿变也将导致硬同步 。
所有 “隐性”转变为 “显性”的沿且其他符合规则 1 和规则 2 都将引起重新同步 ,但有一例外情况 : 传输 CAN FD 帧的节点在传输该帧的数据阶段时不能同步。
节点连接到网络上时 ,协议控制器的输出信号与协议控制器的输入信号之间不可避免有一定延时 。 在无 TDC 情况下 ,FD 帧的数据阶段可能遇到此种情况 :发送端发送的数据 ,同时在总线上采样数据 ,若延时太大 ,则可能会导致发送与接收的数据不符合 ,出现位错误 。
CAN FD 应支持此机制 ,当 BRS 为 “隐性” ,该机制只能由 CAN FD 帧中的数据阶段使用 。使用该机制时 ,数据时间量子的分频应为 1或 2 ,即数据比特率的分频系数为 1 或 2 。此机制能补偿延迟至少两个数据位时间 。
TDC 机制定义了次级采样点 SSP ,在使用 TDC 时 (一般而言是 CAN FD 帧的数据阶段会使用),发送端忽略采样点 SP 检测到的位错误 。此时接收的值应与延迟的发送值比对 (可以认为是将发送的数据缓存 ,经过设定的延迟之后就与接收值进行比对),如果此时检测到位错误 ,则此时发送端会对此错误做出相对应的反应 ,如发送错误标志灯 。对于那些实际上发送端已经进入仲裁阶段但延迟的数据阶段的发送值还没比对完的位 ,此时应禁用位错误检测 。
SSP 的位置应是发送端发送位起始至接收时数据稳定的距离 ,其配置范围应至少为 0~63 的协议控制器时钟周期 。SSP 可为固定值或根据实际发送延迟的测量值算出的值 。要测量此延迟值 ,应从每一帧的 FDF 至 res 的沿变进行 ,即一帧只能测量一次 。具体测量方式为 :当发送端开始发送 res 时 ,启动一个计数器 (注意 :此计数器的时间源为协议控制器的时钟源 ,而不是标称时间量子 ,此时还是在仲裁阶段) ,每经过一个时间源范围就加一 ,直到接收输入检测到 “显性” ,计数器停止计数 ,(需要注意 :这里是要求仲裁阶段即使没有 TDC 机制正常情况下也不会出现位错误 ,即从发送到接收的延迟时间对于仲裁阶段没多大影响 ,不会出现在接收采样时就已经在发送下一位之类的情况) ,此时计数器的值即测量的传送延迟值 ,如图 18 。SSP 的位置就应当是测得的发送延迟时间与 SSP 偏移量之和 (SSP 偏移量仍旧以协议控制器的时钟为准) 。
图 18 发送延迟时间
图 19 SSP 的位置
如图 21 ,这个是在数据阶段开启 TDC 时 SSP 的采样情况 ,可以看到几乎延迟了两个数据位时间 ,SSP 处于 A2 、B2 …… K2 的范围内 ,此时应将发送延迟时间延迟两个数据位时间才能与接收进行比较 (可以看到发送延迟时间只有无延迟 、延迟一个数据位时间和延迟两个数据位时间三个选项) ,SSP 偏移应尽量选在接收数据已经稳定的时候 。
如果数据阶段分频为 1 ,则计算出来的 SSP 位置值即为 SSP 位置值 ,若数据阶段分频为 2 ,则计算出来的 SSP 位置应除以 2 并对余数进行舍去或留存 ,此时才是真正的 SSP 位置值 。
对于 SSP 序列的结束 ,如图 20 ,在发送端发送的第一个 CRC 界定符的采样点 ,数据阶段结束 ,SSP序列停止 ,重新使用 SP 序列比对 ,但该帧中此时及以后接收的 CRC 序列即使接收到的值与发送值不一致也不会出现位错误(若开启发送数据阶段结束 ,但还继续 SSP 序列 ,则发送第一个 CRC 界定符之后接收的 CRC 序列也必须检测匹配 ,若匹配不符同样会出现位错误 ,如图 21)。基于此的补偿 ,发送端在接收到 “显性”应答前应允许有第二个 CRC 界定符 。(如果第一个界定符已经完成 , 在第二个界定符接收到一半期间出现应答 ,就可以进行重同步)
图 20 TDC 阶段结束
图 21 延续 SSP 序列
有以下五种错误类型 (不会相互排斥) :
(1) 位错误 :除了在仲裁期间 (即等仲裁域结束) 或应答域的应答间隙期间发送 “隐性”位却检测到 “显性”和发送被动错误标志期间检测到 “显性”之外 ,其余时间如果发送值与监视值不一致时 ,则检测到一个位错误 。
(2) 填充错误 :如果需要位填充的信息中检测到连续 6 个相同的值 ,则出现填充错误 。但是 CAN FD 的 CRC 域被检测到不符合期望值时是应当认为是帧错误 。
(3) CRC 错误 :如果接收端计算的 CRC 序列与发送端发送的 CRC 序列不符合 ,发生 CRC 错误 。在 CAN FD 中 ,填充位计数不匹配的也是 CRC 错误 。
(4) 帧错误 :当一个固定形式的位域含有 1 或多个非法位,检测到帧错误 。即此位固定为“显性”或 “隐性” ,当出错时 ,如 SRR 位是 “隐性” ,但却检测到 “显性” 。例外的是接收方接收到帧结束 (EOF) 最后一位为显性 ,或任意节点检测到错误界定符和过载界定符最后一位为 “显性” ,不视为帧错误 ,而是应当发送过载帧 。
(5) 应答错误 :只要应答域应答间隙不为 “显性”,检测到应答错误
2.15.1 错误信息每当任何节点检测到位错误 、填充错误 、帧错误或应答错误时 ,相应节点下一位发送错误标志 ,在 CAN FD 中 ,若在是可变速率部分检测到错误 ,必须将时钟切换到仲裁时的标称位时间 ,启动 TDC 的节点位时间切换如图 22 ,接收方和无启动 TDC 的节点位时间切换如图 23 。
图 22 启动 TDC 节点在 Secondary Sample Point 检测到错误时的位时钟切换
图 23 接收方和无 TDC 节点检测到错误时的位时钟切换
检测到错误后 ,经过 SP 和 IPT 后 ,位时间重新设置为仲裁时的标称位时间 ,此时相位段 2 已经在 IPT 进行计数 ,在一个位开始且错误标志发送前必须结束此段 。
节点在 CAN FD 帧检测到 CRC 错误后应在 CRC 界定符 3 个 bit 之后发送错误帧 ,但在 CAN 帧检测到 CRC 错误后是在 ACK 界定符后发送一个错误帧 。CRC 界定符和错误帧之间的 “显性”不视为错误 。
2.15.2 故障界定每个节点状态可能为以下三个状态 :
(1) 错误主动 :正常参与总线通讯并可发出主动错误标注
(2) 错误被动 :可参与总线通讯 ,但只能发送被动错误标志 ,发送后 ,在下一次发送前处于等待状态 (见挂起发送) 。
(3) 总线关闭 :不允许对总线有任何影响
界定节点是哪种状态 ,用到了以下两种计数 :
(1) 发送错误计数 :发送期间错误数
(2) 接收错误计数 :接收期间错误数
这两个按照以下规则改变 :
(1) 接收端检测到错误 ,接收错误计数加一 。但发送主动错误标志或过载标志期间的位错误 ,接收错误计数器值加 8
(2) 错误标志发送后 ,接收端检测到第一位为 “显性”时 ,接收错误计数值加 8
(3) 发送端发送错误标志时 ,发送错误计数值加 8 ,以下情况错误计数不变 :
例外情况一 :
发送端为 “被动错误”,并检测到应答错误 (注 :此应答错误由检测不到“显性”应答引起) 和发送被动错误标志检测不到“显性”位
例外情况二 :
发送端在仲裁期间因为填充错误而发送错误标志 (注 :引起填充错误是由于填充位是 “隐性”且已经作为 “隐性”发送 ,但监视总线为 “显性”)
(4) 发送主动错误标志或过载标志时 ,如果发送端检测到位错误 ,发送错误计数加 8
(5) 在发送主动错误标志 、被动错误标志或过载标志后 ,任何节点最多容许 7 个连续的 “显性”位 。以下情况 ,每一发送端的发送错误计数加 8 ,每一接收端错误计数加 8 :
当检测到第 14 个连续的 “显性”位之后 (在发生主动错误标志或过载标志的情况下)
被动错误标志之后检测到第 8 个连续的 “显性”之后
每一个有额外的 8 个连续 “显性”位序列之后
(6) 报文发送成功 ,应答无错 ,帧结束无错 ,发送错误计数器减一 ,除非其为零
(7) 如果接收错误计数介于 1 和127 之间 ,成功接收到报文后 ,及时发送出应答 ,接收错误计数减一 ,为零则继续为零 ,如果超过 127 ,则设置为一个在 119~127 间的一个值
(8) 发送 / 接收错误计数等于或大于 128 ,节点变为被动错误节点 。造成节点这种转变的错误条件发出主动错误标志
(9) 发送错误计数等于或大于 256 ,节点为总线关闭
(10) 发送 / 接收错误计数小于 128 ,节点重新变为错误主动节点
(11) 总线监视到 128 次有 总线空闲情况(11 个连续 “隐性”位)之后 ,总线关闭节点转为错误主动节点 ,错误计数设为 0
2.16 三种收发器实现(1) 仅支持 CAN :CAN 网络上只能有 CAN 帧 ,不能出现 CAN FD 帧 ,可以接收和发送 CAN 帧 。
(2) CAN FD tolerant :支持 CAN ,CAN 网络上可以有 CAN FD 帧 ,但此节点不发送 CAN FD 帧 ,不接收 CAN FD 帧 。
(3) CAN FD enabled :CAN 网络上可以有 CAN 帧 和 CAN FD 帧 ,可以接收和发送 CAN 帧和 CAN FD 帧 。
总体上看如图 所示 。
图 24 收发器实现
3. 参考资料(1) 百度文库 :《CAN 20 A B 标准》
下载链接 :
https://wenku.baidu.com/view/549e1e15d4d8d15abf234e37.html
(2) ISO :《ISO 11898-1:2015》
下载链接 :
https://www.iso.org/standard/63648.html
(3) ISO :《ISO 11898-2:2016》
下载链接 :
https://www.iso.org/standard/67244.html
【以上来自网络,如有违法或侵权,请与网站管理员联系!】