CAN总线协议

1.CAN协议简介

CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。

CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,近年来,它具有的高可靠性 和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射 强及振动大的工业环境。

2. CAN物理层

与 I2C、SPI 等具有时钟信号的同步通讯方式不同,CAN 通讯并不是以时钟信号来进行同步的, 它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以 差分信号的形式进行通讯。

2.1 闭环总线网络

CAN 物理层的形式主要有两种,下图的CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离“闭环网络”,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要 求有一个“120 欧”的电阻。

2.2 开环总线网络

下图中的是遵循 ISO11519-2 标准的低速、远距离“开环网络”,它的最大传输距离为 1km, 最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2 千欧”的电阻。

2.3 通讯节点

CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过 CAN_Tx 及 CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。其中 CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号,而 CAN_High 及 CAN_Low 是一对差分信号线。

当 CAN 节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线 CAN_High 和 CAN_Low 线输出到 CAN 总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器 把总线上收到的 CAN_High 及 CAN_Low 信号转化成普通的逻辑电平信号,通过 CAN_Rx 输出到 控制器中。

STM32 的 CAN 片上外设就是通讯节点中的控制器,为了构成完整的节点,还要给它外接一个收发器,战舰V3开发板中使用型号为 TJA1050 的芯片作为 CAN 收发器。CAN 控制器与 CAN 收发器的关系如同 TTL 串口与 MAX3232 电平转换芯片的关系,MAX3232 芯片把 TTL 电平的串 口信号转换成 RS-232 电平的串口信号,CAN 收发器的作用则是把 CAN 控制器的 TTL 电平信号转换成差分信号 (或者相反) 。

2.4 差分信号

差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输 时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示 逻辑 0 和逻辑 1。

相对于单信号线传输的方式,使用差分信号传输具有如下优点:

• 抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关 心两个信号的差值,所以外界的共模噪声可以被完全抵消。

• 能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射 的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。

• 时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依 靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更 适合于低幅度信号的电路。

由于差分信号线具有这些优点,所以在 USB 协议485 协议以太网协议CAN 协议的物理层 中,都使用了差分信号传输。

2.5 CAN协议中的差分信号

CAN 协议中对它使用的 CAN_High 及 CAN_Low 表示的差分信号做了规定,见下表及下图。以高速 CAN 协议为例,当表示逻辑 1 时 (隐性电平) ,CAN_High 和 CAN_Low 线上 的电压均为 2.5v,即它们的电压差 VH-V:sub:L=0V;而表示逻辑 0 时 (显性电平) ,CAN_High 的 电平为 3.5V,CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-V:sub:L=2V。例如,当 CAN 收发器从 CAN_Tx 线接收到来自 CAN 控制器的低电平信号时 (逻辑 0),它会使 CAN_High 输出 3.5V,同时 CAN_Low 输出 1.5V,从而输出显性电平表示逻辑 0 。

在 CAN 总线中,必须使它处于隐性电平 (逻辑 1) 或显性电平 (逻辑 0) 中的其中一个状态。假如有两个CAN 通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线 的“线与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先的意味。 在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。

由于 CAN 总线协议的物理层只有 1 对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说,CAN 通讯是半双工的,收发数据需要分时进行。在 CAN 的通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。

3.协议层

3.1 CAN通讯的简单理解

每个设备都可以发送和接收信息。

3.2 CAN 的波特率及位同步

由于 CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步 通讯那样,节点间使用约定好的波特率进行通讯,特别地,CAN 还会使用“位同步”的方式来抗 干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

3.2.1 位时序分解

该图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq,PTS 段占 6Tq,PBS1 段占 5Tq,PBS2 段占 7Tq。信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的长度,以对采样点的位置进行偏移,以便准确地采样。

3.2.2 通讯的波特率

总线上的各个通讯节点只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个 Tq,就可以 确定 CAN 通讯的波特率。 例如,假设上图中的 1Tq=1us,而每个数据位由 19 个 Tq 组成,则传输一位数据需要时间 T1bit =19us,从而每秒可以传输的数据位个数为: 1x106 /19 = 52631.6 (bps) 这个每秒可传输的数据位的个数即为通讯中的波特率。

3.2.3 同步过程分析

3.2.3.1 硬同步

若某个 CAN 节点通过总线发送数据时,它会发送一个表示通讯起始的信号 (即下一小节介绍的帧起始信号SOF(一位)),该信号是一个由高变低的下降沿。而挂载到 CAN 总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。

见下图,可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的 SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的 SS 段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。

3.2.3.1 重新同步

硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步 (帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用 SS 段来进行检测,同步的目的都是使节点内的 SS 段把跳变沿包含起来。

重新同步的方式分为超前和滞后两种情况,以总线跳变沿与 SS 段的相对位置进行区分。第一种 相位超前的情况如下图,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2Tq,这时控制器在下一个位时序中的 PBS1 段增加 2Tq 的时间长度,使得节点与总线时序重新同步。

第二种相位滞后的情况如下图,节点从总线的边沿跳变中,检测到它的时序比总线的时序 相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长度,获得同步。

在重新同步的时候,PBS1 和 PBS2 中增加或减少的这段时间长度被定义为“重新同步补偿宽度 SJW* (reSynchronization Jump Width)”。一般来说 CAN 控制器会限定 SJW 的最大值,如限定了最 大 SJW=3Tq 时,单次同步调整的时候不能增加或减少超过 3Tq 的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。当控制器设置的 SJW 极限值较大时,可以吸收的误差加大, 但通讯的速度会下降。

3.3 CAN 的报文种类及结构

3.3.1 CAN的报文

CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议, 如何用一个信号通道实现同样、甚至更强大的功能呢?CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。

3.3.2 CAN报文的种类

在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC 校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。

3.3.3 数据帧

数据帧是在 CAN 通讯中最主要、最复杂的报文。

数据帧以一个显性位 (逻辑 0) 开始,以 7 个连续的隐性位 (逻辑 1) 结束,在它们之间,分别有仲 裁段、控制段、数据段、CRC 段和 ACK 段。

1、帧起始 SOF 段 (Start Of Frame)

SOF译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通 知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。

2、仲裁段

当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。

报文的优先级,是通过对 ID 的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平(逻辑0),CAN 正是利用这个特性进行仲裁。相当于对以下两种电平波形进行综合,综合起来就是显性电平(逻辑0)(如下图)。

若两个节点同时竞争 CAN 总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。见下图 39_10,在开始阶段,两个设备发送的电平一样,所以 它们一直继续发送数据。到了图中箭头所指的时序处,节点单元 1 发送的为隐性电平,而此时节点单元 2 发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元 2 竞争总线成功,这个报文得以被继续发送出去。

仲裁段 ID 的优先级也影响着接收设备对报文的反应。因为在 CAN 总线上数据是以广播的形式 发送的,所有连接在 CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的 CAN 控制器大多具有根据 ID 过滤报文的功能,它可以控制自己只接收某些 ID 的报文。

3、控制段

在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段 (Data Length Code), 译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC 段表 示的数字为 0~8。

4、数据段

数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成,MSB 先行。

5、CRC 段

为了保证报文的正确传输,CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的 CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。 CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。 在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK 段间隔起来。

6、ACK 段

ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送 的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界 定符间隔开。

7、帧结束 EOF 段 (End Of Frame)

EOF译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。

3.3.4 重要的相关位

拓展帧目的在于拓展ID,令其有更多的报文。

拓展帧的SRR用来代替标准帧的RTR位(远程传输请求位),拓展帧的SRR默认为隐形电平(逻辑1),

优先级低于标准帧(RTR位可以为显性电平和隐形电平,显性电平表示数据帧,隐形电平为遥控帧(遥控请求某设备的数据))

上图中的1表示位数,不表示逻辑。

CRC界定符是为了和后面是校验区分的,固定为逻辑1。

4. STM32 的 CAN 外设简介

STM32F1 自带的是 bxCAN,即基本扩展 CAN。它支持 CAN 协议 2.0A 和 2.0B。CAN2.0A 只能处理标准数据帧,扩展帧的内容会识别错误;CAN2.0B Active(主动)可以处理标准数据帧和扩展数据帧;而 CAN2.0B passive(被动)只能处理标准数据帧,扩展帧的内容会忽略。它的设计目标是, 以最小的 CPU 负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。对于安全紧要的应用,bxCAN 提供所有支持时间触发通信模式所需的硬件功能。

STM32F1 的 bxCAN 的主要特点有:

 1、支持 CAN 协议 2.0A 和 2.0B 主动模式

 2、 波特率最高达 1Mbps

 3、支持时间触发通信

 4、具有 3 个发送邮箱

 5、具有 3 级深度的 2 个接收 FIFO

 6、可变的过滤器组(最多 28 个) 在 STM32 互联型产品中,带有 2 个 CAN 控制器,而我们使用的STM32F103ZET6 属于增强型,不是互联型,只有 1 个 CAN 控制器。双 CAN 的框图如下图所示:

4.1 主控制寄存器 CAN_MCR

主控制寄存器 CAN_MCR 负责管理 CAN 的工作模式。

(1) DBF 调试冻结功能

(2) TTCM 时间触发模式

(3) ABOM 自动离线管理

(4) AWUM 自动唤醒

(5) NART 自动重传

(6) RFLM 锁定模式

(7) TXFP 报文发送优先级的判定方法

4.2 位时序寄存器 (CAN_BTR) 及波特率

CAN 外设中的位时序寄存器 CAN_BTR 用于配置测试模式、波特率以及各种位内的段参数。

4.2.1 测试模式

配置位时序寄存器 CAN_BTR 的 SILM 及 LBKM 寄存器位可以控制使用正常模式、静默模式、回环模式及静默回环模式

• 正常模式

正常模式下就是一个正常的 CAN 节点,可以向总线发送数据和接收数据。

• 静默模式

静默模式下,它自己的输出端的逻辑 0 数据会直接传输到它自己的输入端,逻辑1可以被发送到总线,所以它不能向总线发送显性位 (逻辑 0),只能发送隐性位 (逻辑 1)。输入端可以从总线接收内容。由于它只可发送的隐性位不会强制影响总线的状态,所以把它称为静默模式。这种模式一般用于监测,它可以用于分析总线上的流量,但又不会因为发送显性位而影响总线。

• 回环模式

回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容 同时也会被传输到总线上,即也可使用总线监测它的发送内容。输入端只接收自己发 送端的内容,不接收来自总线上的内容。使用回环模式可以进行自检。

• 回环静默模式

回环静默模式是以上两种模式的结合,自己的输出端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容。 输入端只接收自己发送端的内容,不接收来自总线上的内容。这种方式可以在“热自检”时使用,即自我检查的时候,不会干扰总线。

4.2.2 位时序及波特率

图中还给出了 CAN 波特率的计算公式,我们只需要知道 BS1 和 BS2 的设置,以及 APB1 的时钟频率(一般为 36Mhz),就可以方便的计算出波特率。比如设置 TS1=8、TS2=7 和 BRP=3, 在 APB1 频率为 36Mhz 的条件下,即可得到 CAN 通信的波特率=36000/[(9+8+1)*4]=500Kbps。

SJW:发现时序有些差异时,设置SJW可以用SJW的值*Tq为最小单位调整时间,再同步会增减到适合为止。

4.3 CAN 发送邮箱

CAN 外设的发送邮箱,它一共有 3 个发送邮箱, 即最多可以缓存 3 个待发送的报文。

每个发送邮箱中包含有标识符寄存器 CAN_TIxR、数据长度控制寄存器 CAN_TDTxR 及 2 个数据寄存器 CAN_TDLxR、CAN_TDHxR,它们的功能见下表。

当我们要使用 CAN 外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对 标识符寄存器 CAN_TIxR 中的发送请求寄存器位 TMIDxR_TXRQ 置 1,即可把数据发送出去。

其中标识符寄存器 CAN_TIxR 中的 STDID 寄存器位比较特别。我们知道 CAN 的标准标识符的 总位数为 11 位,而扩展标识符的总位数为 29 位的。当报文使用扩展标识符的时候,标识符寄存器 CAN_TIxR 中的 STDID[10:0] 等效于 EXTID[18:28] 位,它与 EXTID[17:0] 共同组成完整的 29 位扩展标识符。

TXRQ:报文的各个位和数据填充完后,TXRQ位置一就可以发送该报文了

4.4 CAN 接收 FIFO

CAN 外设的接收 FIFO,它一共有 2 个接收 FIFO, 每个 FIFO 中有 3 个邮箱,即最多可以缓存 6 个接收到的报文。当接收到报文时,FIFO 的报文计 数器会自增,而 STM32 内部读取 FIFO 数据之后,报文计数器会自减,我们通过状态寄存器可获 知报文计数器的值,而通过前面主控制寄存器的 RFLM 位,可设置锁定模式,锁定模式下 FIFO 溢出时会丢弃新报文,非锁定模式下 FIFO 溢出时新报文会覆盖旧报文。

跟发送邮箱类似,每个接收 FIFO 中包含有标识符寄存器 CAN_RIxR、数据长度控制寄存器 CAN_RDTxR 及 2 个数据寄存器 CAN_RDLxR、CAN_RDHxR,它们的功能见下表。

通过中断或状态寄存器知道接收 FIFO 有数据后,我们再读取这些寄存器的值即可把接收到的报 文加载到 STM32 的内存中。

4.5 验收筛选器

CAN 外设的验收筛选器,一共有 28 个筛选器组, 每个筛选器组有 2 个寄存器,CAN1 和 CAN2 共用的筛选器的。其中 STM32F103 系列芯片仅有 14 个筛选器组:0-13 号。在 CAN 协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送节点将报文广 播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,为了简化软件的工作,STM32 的 CAN 外设接收报文前会先使用验收筛选器检查,只接收需要的报文到 FIFO 中。

筛选器工作的时候,可以调整筛选 ID 的长度过滤模式

根据筛选 ID 长度来分类有有以下两种:

 (1) 检查 STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位,一共 31 位。

 (2) 检查 STDID[10:0]、RTR、IDE 和 EXTID[17:15],一共 16 位。

通过配置筛选尺度寄存器 CAN_FS1R 的 FSCx 位可以设置筛选器工作在哪个尺度。

根据过滤的方法分为以下两种模式:

 (1) 标识符列表模式,它把要接收报文的 ID 列成一个表,要求报文 ID 与列表中的某一个标识 符完全相同才可以接收,可以理解为白名单管理。

 (2) 掩码模式,它把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键 字搜索,只要掩码 (关键字) 相同,就符合要求,报文就会被保存到接收 FIFO。 通过配置筛选模式寄存器 CAN_FM1R 的 FBMx 位可以设置筛选器工作在哪个模式。

不同的尺度和不同的过滤方法可使筛选器工作在下图的 4 种状态。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值