目录
一、物理层
CAN总线与常见的SPI或I2C不同,CAN总线是一种异步通信,所以没有时钟线。CAN总线由CAN_H和CAN_L两根信号线构成的差分信号进行通讯,CAN的一个 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过 CAN_Tx 及CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。其中CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号。
在物理层面上,CAN总线有两种不同的模式,一种是高速、短距离的闭环通讯网络(CAN2.0A),它的总线最大长度为 40m,通信速度最高为 1Mbps。其网络是闭环的,并且网络的起始与结束段都串联了一个阻值为120欧的电阻。120 欧的电阻式为了模拟无限远的传输线。
一种是低速、长距离的开环通讯网络(CAN2.0B),它的最大传输距离为 1km,最高通讯速率为 125kbps。它两根总线是独立的、不形成闭环,要求每根总线上各串联有一个2200欧的电阻。
当CAN节点发送数据时,CAN控制器将需要发送的二进制编码发送给CAN收发器,收发器会将收到的电平信号转换为网络中使用的差分信号。CAN收数据的方式则流程相反 。
差分信号
差分信号区别于传统的一根信号线一根地线的做法,差分传输在两根信号线上都传输信号,这两个信号的振幅相反,相位相反。信号接收端通过比较这两根线上信号的差值来判断信号发送端发送的逻辑状态。(因为比较的是两根信号线线上信号的差值,因此一般在布线的时候,两根信号线应该等长同宽)
差分信号的优势在于,在受到外界的干扰时,由于差分信号的信号线是紧密排列的,此时干扰几乎会同时耦合到两根差分信号的信号线上,此时虽然单个信号产生了变化,但两根信号的差值仍然未发生变化,因此接收端几乎受不到干扰的影响,抗干扰能力强。
差分信号的电压差值为0V,即时,其代表的逻辑为1,称为隐性电平,此时CAN_H与CAN_L上的电压都是2.5V。差分信号的电压差值为2V时,即
时,其代表的逻辑为0,称为显性电平,此时CAN_H的电平为3.5V,CAN_L的电平为1.5V。
当总线上,一根线输出显性电平,一根输出隐性电平时,总的表现出的电平为显性电平。(例如CAN_H输出隐性电平2.5V,CAN_L输出显性电平2.5V,电压差为0,是显性电平)因此在同一时间内,只能有一个通讯节点发送信号,其余节点都只能够接收。
CAN收发器
CAN收发器的传输特性主要为三个参数:发送延迟、接收延迟、循环延迟。在CAN协议中,发送节点通过TXD发送数据的同时,RXD也在监测总线状态。若RXD监位与发送位不一致,则节点检测到一个位错误。若在仲裁场监测到的与实际发送不符,则节点停止发送,即总线上有多个节点同时发送数据,该节点没有获得数据发送优先权。
显性超时
显性超时的增加主要是为了防止CAN总线网络由于硬件或软件故障使得TXD长期处于“0”电平状态。TXD保持“0”意味着CAN网络为显性电平,整个网络的所有节点都不能收发数据,即总线处于瘫痪状态。显性超时可以通过收发器的硬件计时避免总线出现这种情况。
如图所示,Tdom为显性超时时长,每次TXD为“0”时收发器开始计时,超过Tdom时收发器内部释放总线,总线状态处于隐性电平。不同收发器的显性超时时间不同,实际应用需要考虑显性超时时间对总线最低波特率的影响。CAN协议规定错误帧最多可以有11个连续的显性位,为了避免显性超时不对其造成影响,可以根据收发器的最小显性超时时间计算实际使用的最低波特率。
BPSMin = 11/Tdom_min
如CTM1051Q的显性超时时间为0.3ms,则计算最小波特率为11/0.3=36.67kbps。
(若想对收发器有更深层次了解,看参考文献1)
二、协议层
由于CAN是异步通信的一种,没有时钟信号显进行同步,因此在一个网络中的各个节点会使用约定好的波特率进行通讯。
在说帧类型前说一下CAN的“位同步”,为了实现“位同步”,CAN会把每一个数据位的时许都分解成四个段,如图所示有SS段、PTS段、PBS1段、PBS2段,这四段加起来的长度为CAN的一个数据位。在分解后,最小的时间单位为1Tq,一个完整的位由8~25个Tq组成。
图中的一个位长度位19Tq,SS段占1个Tq,PTS段占6个Tq,PBS1段占5个Tq,PBS2段占7个Tq。信号的采样点位于PBS1和PBS2之间,可以通过控制各段的长度来对采样点进行偏移。而只要约定了1个Tq的长度和一个数据位占据多少Tq,就可以确定CAN通讯的波特率。例如假设1Tq=1us,一个位有19Tq,则传输一位即1bit需要的时间为19us,从而可以算出其波特率是多少。
(波特率指每秒可以传输的数据位的个数)
SS段(SYNC SEG)(同步段):多个连接在总线上的单元通过此段实现时序调整,同步进行收发的工作,电平跳变的边沿最好出现在这一段中。(通过显性电平向隐性电平的跳变沿进行同步)长度为1Tq。
PTS段(PROP SEG)(传播时间段):用于吸收网络中的物理延迟的段。指发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟。这个段的时间最好是以上延迟的和的两倍以上。此段长度一般为1~8Tq。
PBS1段(PHASE SEG1)(相位缓冲段):当信号跳变沿不能包含与SS段时,可以在此段进行补偿。由于各单元的时间误差会累计,PBS段可用于吸收此误差。
PBS2段:同PBS1段
数据同步
CAN的数据同步分为硬同步和重新同步两种。其中硬同步仅在SS段起作用,无法保证后面的位时序都是同步的,且当跳变沿不落入SS段时,后面的位时序也都不同步。重新同步可以解决以上问题。
(1)硬同步
若某个 CAN 节点通过总线发送数据时,它会发送一个表示通讯起始的信号 (即下一小节介绍的帧起始信号),该信号是一个由高变低的下降沿。而挂载到 CAN 总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。见图 ,可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的 SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的 SS 段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。
(2) 重新同步
前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步 (帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用 SS 段来进行检测,同步的目的都是使节点内的 SS 段把跳变沿包含起来。重新同步的方式分为超前和滞后两种情况,以总线跳变沿与 SS 段的相对位置进行区分。第一种相位超前的情况如图 ,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2Tq,这时控制器在下一个位时序中的 PBS1 段增加 2Tq 的时间长度,使得节点与总线时序重新同步。
第二种相位滞后的情况如图 ,节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长度,获得同步。
在重新同步的时候,PBS1 和 PBS2 中增加或减少的这段时间长度被定义为“重新同步补偿宽度SJW(reSynchronization Jump Width)。一般来说 CAN 控制器会限定 SJW 的最大值,如限定了最大 SJW=3Tq 时,单次同步调整的时候不能增加或减少超过 3Tq 的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。当控制器设置的 SJW 极限值较大时,可以吸收的误差加大,但通讯的速度会下降。
CAN将对数据、操作命令以及同步信号进行打包后的内容成为报文,在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。
CAN通信帧
1、数据帧:用于发送单元向接收单元传送数据的帧,标准格式有8位
2、遥控帧:用于接收单元向具有相同ID(标识符)的发送单元请求数据的帧
3、错误帧:用于通知其它节点校验错误,请求重新发送上一个数据
4、过载帧:用于接收单元通知远端节点:其尚未做好接收准备的帧
5、帧间隔:用于将数据帧及遥控帧与前面的帧分离开来
其中数据帧和结构帧有两种格式,一种是标准格式、一种是扩展模式。标准模式有11个位的标识符(ID),扩展模式有29个格式的ID。
数据帧构
数据帧一共有7个段
1、帧起始(SOF):表示数据帧开始的段,此段是一个显性电平,它将通知各个节点有数据即将开始传输。其它节点会通过帧起始的电平跳变沿来进行硬同步。此段只有1个位
2、仲裁段:表示该数据帧的优先级(当两个报文被同时发送时,总线才会根据仲裁段的ID进行优先级的仲裁),如果发送时间一前一后,则先发送报文的取得优先权。数据帧的标准格式与拓展格式区别就在与ID的长度,标准格式的ID有11位,拓展格式的ID有29位。
在优先级仲裁中,仲裁的内容是各数据帧中的ID。在仲裁时,那一个报文先出现了隐性电平,那一个报文便失去了优先权。 (相对与总线电平而言)
由于CAN总线的报文是以广播的形式向外发送的,因此ID还具有过滤报文的作用,控制器可以只接收某些ID的报文。除了ID外,仲裁段还有RTR、IDE 和 SRR 位。
(1) RTR 位 (Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。
(2) IDE 位 (Identifier ExtensionBit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。
(3) SRR 位 (Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的 RTR位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
3、控制段:表示数据的字节数及保留位的段,控制段中有r1、r0为保留位,默认为显性位,各占一个位的空间。还有数据段长度代码位(DLC),DLC主要用于表示本报文中的数据包含多少字节,占四个位的空间。DLC段表示的数字为0~8.(一个报文中数据的长度可选范围是0~8)
4、数据段:要发送的原始信息,由0~8个字节组成,一般为MSB(最高有效位)先行。
数据段是否是MSB先行需要看是Motolola格式还是Intel格式(后面再说)
5、CRC段:共有16位,有一个15位的CRC校验码,和一个1位的CRC界定符。校验码原理点这儿,当节点算出的CRC码和接收到的CRC码不同,它会向发送节点反馈一个错误帧,请求它重新发送。CRC的计算一般由CAN的控制器硬件完成。在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK段间隔起来。
6、ACK段:ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。共两位
7、帧结束:EOF 段 (End Of Frame),译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。
因此CAN总线的一个数据帧以一个显性位 (逻辑 0) 开始,以 7 个连续的隐性位 (逻辑 1) 结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和 ACK 段。
遥控帧
接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。遥控帧的接收方以遥控帧的ID判断需要发送的数据帧。即遥控帧可以请求具有相同ID的数据帧。
数据帧与遥控帧的区别
1、遥控帧的 RTR 位为隐性位(为1),没有数据段。
2、没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。
3、遥控帧的数据长度码以所请求数据帧的数据长度码表示。
4、没有数据段的数据帧可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。
过载帧
当节点没有做好接收准备时,将发送过载帧,以用来通知发送节点。过载帧主要由过载标志和过载帧界定符两个部分组成,其中过载标志占用6个位,且6个位都是显性电平位,过载帧界定符包含8个连续隐性电平位。当多个节点先后发送过载帧时,可能会出现过载标志叠加后超过6个位的现象。
帧间隔
用于隔离数据帧、远程帧和他们前面的帧,错误帧和过载帧前面不加帧间隔。
1、帧间隔过后,如果无节点发送帧,则总线进入空闲
2、帧间隔过后,如果被动错误节点要发送帧,则先发送8个隐性电平的传输延迟,再发送帧
CAN总线的五种错误
CRC错误:发送与接收的CRC值不同发生该错误;
格式错误:帧格式不合法发生该错误;
应答错误:发送节点在ACK阶段没有收到应答信息发生该错误;
位发送错误:发送节点在发送信息时发现总线电平与发送电平不符发生该错误;
位填充错误:通信线缆上违反通信规则时发生该错误。
当五种错误之一发生之后,发送节点或接受节点将发送错误帧,而为了防止某些节点自身出错而一直发送错误帧,干扰其它节点的通信,CAN协议规定了节点的三种状态和行为
CAN信号矩阵编码
CAN信号矩阵编码有两种编码格式:Intel格式和Motorola格式,在使用CAN之前,首先要知道协议采用的是那种格式,否则传输数据可能会出错。一般情况下,对于一个字节的传输,CAN通常是先传输该字节的低位(Lsb),然后传输其高位(Msb)。如果一个信号只有8位(一个字节),那么不管是采用Intel 格式还是Motorola格式,它的传输方式都是一样的,该信号的高位(S_msb)1将被放在该字节的高位,信号的低位(S_lsb)2将被放在该字节的低位。这样,信号的起始位3就是该字节的低位。;如果要传输的信号超过一个字节,那么就要看采用哪种编码方式了。
信号的高位,即最能表达信号特性的因子,比如:车速信号500km/h按照给定的公式,转换成十六进制数为0x6A5,因为6代表的数量级最大(162),那么其中6就是其信号的高位。
信号的低位,即最不能表达信号特性的因子,比如:车速信号500km/h按照给定的公式,转换成十六进制数为0x6A5,因为5代表的数量级最小(160),那么其中5就是其信号的低位。
信号的起始位,一般来讲,主机厂在定义整车CAN总线通信矩阵时,其每一个信号都从其最低位开始填写,这样也符合使用习惯。所以信号的起始位就是信号的最低位。
Intel格式
当一个信号的数据长度超过1个字节(8位)或者数据长度不超过一个字节但是采用跨字节方式实现时,该信号的高位(S_msb)将被放在高字节(MSB)的高位,信号的低位(S_lsb)将被放在低字节(LSB)的低位。这样,信号的起始位就是低字节的低位。
Motolora格式
当一个信号的数据长度超过1个字节(8位)或者数据长度不超过一个字节但是采用跨字节方式实现时,该信号的高位(S_msb)将被放在低字节(MSB)的高位,信号的低位(S_lsb)将被放在高字节(LSB)的低位。这样,信号的起始位就是高字节的低位。
CAN过滤器与邮箱
过滤器
CAN节点可以通过ID过滤指定地接收消息,CAN过滤器有两种模式:列表模式和掩码模式。
(1)列表模式
列表模式只接收符合指定ID的帧
(2)掩码模式
掩码模式只接受符合掩码要求的帧
因为过滤器是用来删选标识符的,而标识符有标准模式(11位)和扩展模式(29位)两种,所以过滤器同样有两种模式。一种是“列表模式”,还有一种是“掩码模式”。
“掩码模式”的过滤器有两个值,“ID值” & “掩码值“。通过这两个值的配合与报文中的标识符进行比较从而删选出想要的报文。那么他们是如何配合的呢?其实掩码值就是对ID值进行限定的,即掩码值的为”1“的位表示对应ID值上的这个位的值报文中的标识符必须与其完全相同,即视为”关心位“。反之为”0“就是”不关心“位,标识符中对应的位可以相同也可以不相同。由于这样的特性,这种模式下所能匹配的标识符就不止唯一的一个了,就可以是一组标识符,这是与列表模式最大的不同的地方。
过滤器仅在接收时使用,在发送时不需要配置过滤器!过滤器会根据标识符而决定要不要发送者发过来的报文。
过滤器按照硬件的不同可以分为32位与16位寄存器,位宽为32位的过滤器,其优先级高于16位的过滤器。对于相同位宽的过滤器,列表模式的优先级高于掩码模式。位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级更高。
邮箱
邮箱是软件和硬件之间传递报文的接口。邮箱包含了所有跟报文有关的信息:标识符、数据、控制、状态和时间戳信息。CAN总线有接收邮箱和发送邮箱的区别。
发送邮箱:用于CAN总线的数据发送,数量与芯片有关,存在优先级关系。数据在发送前都会被送到优先级高且空闲的发送邮箱,然后依次进行发送。每个邮箱只能装一个报文
接收邮箱:在接收数据端会有一个过滤器处于“接收邮箱”的前面,过滤器是用于删除“标识符”的,只有标识符符合的报文才会被放入接收邮箱中,接收邮箱数量与芯片有关,但是每一个有三层,每层可以存放一个报文,即每个接收邮箱可以接收三个报文。但读取时要遵守FIFO原则。
CAN通讯矩阵
CAN通信矩阵(CAN Communication Matrix)通常由整车厂完成定义,车辆网络中的各个节点需要遵循该通讯矩阵才能完成信息的交互和共享。