图 3 数据帧的具体组成
数据帧由帧起始(Start of Frame,SOF)、仲裁字段、控制字段、数据字段、CRC 字段、ACK 字段(应答字段)和帧尾组成。
帧起始标志数据帧的开始(远程帧同样具有帧起始),它仅由一个显性值组成。只有在总线处于空闲时,才允许节点开始发送。所有节点必须与首先开始发送的那个节点的帧起始位前沿同步。
仲裁字段由标识符和远程发送请求位(RTR 位)组成,如图 4 所示。标识符的长度为 11位。远程发送请求位在数据帧中必须是显性值,在远程帧中必须是隐性值。
图 4 仲裁字段的组成
控制字段由保留位和数据长度码组成,如图 5 所示。数据长度码表示数据字段的长度。
图 5 控制字段的组成
数据字段由数据帧中被发送的数据组成,它可以包括 0~8 个字节,每个字节 8 位。首先发送的是最高有效位。
CRC 字段包括 CRC 序列和 CRC 界定符。CRC 序列用来实现 CRC 计算,CRC 界定符只包括一个隐性值。应答字段为两位,包括应答间隙和应答界定符。帧尾由 7 个连续的隐性值组成,作为数据帧和远程帧的结束标志。
b.远程帧
作为接收器的节点可以通过向相应的数据源节点发送一个远程帧来激活该节点,让它把数据发送给接收器。远程帧由帧起始、仲裁字段、控制字段、CRC 字段、应答字段和帧尾 6 个不同的字段组成。远程帧的组成如图 6 所示。
图 6 远程帧的组成
c.出错帧
出错帧由出错叠加标志和错误界定符组成。出错叠加标志包括了多个出错信息的标志。
d.超载帧
超载帧包括超载标志和超载界定符。超载发生在两种情况下:一个是接收器因内部条件要求推迟下一个数据帧或者远程帧的发送;另一个是在间歇字段检测到显性值时。
e.帧间空间
数据帧或远程帧通过帧间空间与前一帧隔开,而不管前一帧是何种类型的帧。而在超载帧与出错帧前面不需要帧间空间,多个超载帧之间也不需要帧间空间来作分隔。
1.4 位时序(Bit Timing)
CAN 总线协议规定,报文传输的同步或者非同步方式的选择通过位时序来实现。CAN 总线中位时序包括正常位速率和正常位时间两个参数。
• 正常位速率(Nominal Bit Rate):在非重同步情况下,借助理想发送器每秒发送的位数。
• 正常位时间(Nominal Bit Time):正常位速率的倒数。正常位时间由几个不同的时间段组成,它们是同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段 1(PHASE_SEG1)、相位缓冲段 2(PHASE_SEG2),如图 7 所示。
图 7 正常位时间的组成
• 同步段:在这段时间内,完成总线上各个节点的同步,需要一个跳变沿。
• 传播段:这个时间段是指网络上传输的延迟时间,它是信号在总线上传播时间、输入比较器延迟和输出驱动器延迟之和的两倍。
• 相位缓冲段 1 和相位缓冲段 2:它们用于弥补跳变沿的相位误差造成的影响。通过重同步,这两个时间段可以被延长或缩短。
• 采样点:这是读取总线电平并理解该位数值的时刻,它位于相位缓冲段 1 的终点。
1.5 同步(Synchronization)
a.硬同步(Hard Synchronization)
硬同步后,内部位时间从同步段(SYNC_SEG)重新开始,它迫使触发该硬同步的跳变沿处于新的位时间的同步段(SYNC_SEG)之内。
b.重同步(Resynchronization)
当引起重同步沿的相位误差小于或等于重同步跳转宽度编程值时,重同步的作用和硬同步相同。若相位误差大于重同步跳转宽度且相位误差为正时,则相位缓冲段 1(PHASE_SEG1)延长总数为重同步跳转宽度。若相位误差大于重同步跳转宽度且相位误差为负时,则相位缓冲段2(PHASE_SEG2)缩短总数为重同步跳转宽度。
c.重同步跳转宽度(Resynchronization Jump Width)
由于重同步的结果,PHASE_SEG1 可被延长或 PHASE_SEG2 可被缩短。相位缓冲段长度的改变量不应大于重同步跳转宽度。
d.同步的规则CAN
通信协议规定,同步包括硬同步和重同步两种形式。它们遵从下列几条规则:
- 在一个位时间内仅允许一种同步。
- 对于一个跳变沿,仅当它前面的第一个采样点数值与紧跟该跳变沿之后的总线值不相同时,才把该跳变沿用于同步。
- 在总线空闲期间,若出现一个从隐性值到显性值的跳变沿,则执行一次硬同步。
- 符合规则前两条规则的从隐性值到显性值的跳变沿都被用于重同步(在低比特率时也可选择从显性值到隐性值的跳变沿),例外的情况是具有正相位误差的隐性值到显性值的跳变沿将不会导致重同步。
二、CAN通信控制器程序基本框架
CAN 总线的通信协议由 CAN 通信控制器完成。CAN 通信控制器由实现 CAN 总线协议部分和微控制器部分的电路组成。下面将通过一个实例讲解如何用 FPGA 实现 CAN 通信控制器的功能。这个实例从功能和结构上完全参照 SJA 1000 CAN 通信控制器。
2.1 SJA1000CAN 通信控制器
SJA1000 是 Philips 公司于 1997 年推出的一种独立 CAN 总线控制器。它实现了 CAN 总线物理层和数据链路层的所有功能。SJA 1000 通信控制器的功能框图如图 8 所示。
SJA 1000 主要由以下几部分构成:
• 接口管理逻辑 处理来自主 CPU 的命令,控制 CAN 寄存器的寻址,并为主 CPU 提供中断和状态信息。
• 发送缓冲器 它是 CPU 和位数据流处理器(BSP)之间的接口,能存储一条可发送到 CAN总线上的完整报文。报文由 CPU 写入,由位数据流处理器读出。
图 8 SJA1000 通信控制器功能框图
• 接收缓冲器 它是接收 FIFO 的一个可被 CPU 访问的窗口。在接收 FIFO 的支持下,CPU可以在处理当前信息的同时接收总线上的其他信息。
• 接收滤波器 它把收到的报文标识符和接收滤波器寄存器中的内容进行比较,以判断该报文是否应该被接收。如果符合接收条件,则报文被存入接收 FIFO 中。
• 位数据流处理器 它是一个序列发生器,控制发送缓冲器、接收 FIFO 和 CAN 总线之间的数据流,同时它也执行错误检测、仲裁、位填充和 CAN 总线错误处理功能。
• 位时序逻辑 它监视串行 CAN 总线并处理与总线相关的位时序。它在报文开始发送,总线电平从隐性值跳变到显性值时同步于 CAN 总线上的位数据流(硬同步),并在该报文的传送过程中,每遇到一次从隐性值到显性值的跳变沿就进行一次重同步(软同步)。位时序逻辑还提供可编程的时间段来补偿传播延迟时间和相位漂移(如晶振导致的漂移),还能定义采样点以及每一个位时间内的采样次数。
• 错误管理逻辑 它按照 CAN 协议完成传输错误界定。它接收来自位数据流处理器 BSP 的出错通知,并向位数据流处理器 BSP 和接口管理逻辑提供出错统计。