2.1 CAN总线报文格式说明。
说起CAN总线通信,就不得不说明一下CAN设备之间通信的报文格式。如同我们通常接触的RS-232串口通信,当我们通过串口尝试发送“Hello world”的时候,其实串口线上帧组成由起始位+数据位(这里的例子就是"Hello world"的ASSIC码)+奇偶校验位以及停止位。我们的CAN总线上的报文格式比串口的上的帧格式要复杂的多,BOSCH 公司《CAN Specification V2.0》文档分为A、B两个部分来介绍两种在CAN总线上会出现的帧格式。A部分按照CAN1.2规范的定义,说明了CAN的报文格式,也有人称为CAN2.0A协议。B部分对比A部分定义的标准帧格式,介绍扩展帧以及扩展帧与标准帧的兼容设计。总得来说,符合B部分定义的CAN控制器可以不适用扩展帧,依旧通过标准帧与根据A部分设计的CAN控制器进行通信。
在这两种报文的格式下,CAN总线上的报文(帧)种类又分为下面的四种:
数据帧:数据帧携带数据,由发送器传送至接收器。下图简单说明了数据帧所包含的场空间有那些。
数据帧根据遵循协议的不同,分为标准格式帧和扩展格式帧,他们的区别在于仲裁场以及控制场,具体的内容分布如下:
RTR为远程发送请求位,数据帧为显性,遥控帧为隐性位。
SRR是一隐性位。它在扩展格式的标准帧RTR位的位置,因此,标准帧与扩展帧的冲突是通过标准帧优先于扩展帧这一途径得以解决的,扩展帧的基本ID如同标准帧的识别符。
IDE:标准帧格式里的IDE为“显性”,而扩展格式里的IDE为隐性。
远程帧:远程帧用以请求总线上的相关单元发送具有相同标示的数据帧。
出错帧:由检测出总线错误的单元发送。
超载帧:超载帧用于提供当前和后续的数据帧的附加延迟。
2.2 一种CAN主控制器的实际寄存器组成。
我们以NXP公司的LPC21xx处理器的CAN控制器为例说明。
因为CAN控制有一个比较特殊的“滤波功能”,所有我们把CAN控制器的寄存器组成分为“滤波功能”相关以及接收发送数据相关寄存器和其他类寄存器。
2.2.1 针对这个其他类寄存器。咱们首先讨论配置类寄存器,包括CAN模式配置寄存器,总线时序寄存器,错误警告阈值寄存器等。
CAN模式配置寄存器能够配置的内容主要包括CAN控制器的使能以及相关的运行模式,模式包括侦听模式(Can控制器不会发送ACK在CAN总线上,即使完整的收到一个帧,并且节点处于被动错误模式,这个侦听模式是为了波特率的监测以及热插拔。)、自检测模式(发送帧不需要收到ACK即算发送成功)、睡眠模式以及回环测试模式。其中自测试的模式分为全局自测试和局部自测试,全局自测试设置自接收请求位(控制器在发送的时候并不停止接收功能,所以如果发送的帧满足帧过滤的要求,即被接收)就可以,这样不仅能接收到自己发送的报文,还能接收到远端发送的报文, 局部自测试为测试模式+自接收模式,这样就不需要总线上挂接其他的CAN设备,只需要转发器就可以了。我们常用的模式一般为回环测试模式,用于测定CAN控制器初始化正常。
总线时序寄存器。首先介绍一个基本概念,对于总线上传输的数,一位有效的数据(1或者0)由四个段构成,同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)、相位缓冲段2(PBS2)这些段又由称之为Time Quantum(以下称Tq最小时间单位构成。1位分为4个段,每个段由若干个Tq构成,这称为位时序。
同步段SS:隐形电平到显性电平的变化边沿被期望出现在本段。
传输时间段PTS:用于吸收网络上的物理延迟的段。
PBS1与PBS2:当信号边沿不能出现在SS 段时,此段用来矫正误差。由于各单元以各自独立的时钟来工作,细微的时钟误差都会累积起来,PBS 段可用于吸收此误差。为了吸收一个时钟误差,在SJW设置的范围内增减PBS1和PBS2,PBS1和PBS2越大,允许误差越大,但是通讯速度会降低。
总线时序寄存器配置包括预分频,以及四段相关的参数,针对NXP 的LPC21XX的Can通信的位时间等于位TESG1+TESG2+3。
中断使能寄存器,包括CAN控制器能发出的中断(接收中断,发送中断,总线错误中断等)。
错误警告阈值寄存器,在CAN工作时,这个值将一直跟TX和RX的错误计数值进行比较,如果有一致的情况,则发送错误警告。当发生CAN错误的时候,控制器递增接收错误计数器或者发送错误计数器,当没有检测到错误的时候递减。如果发送错误计数器计数到了255并且又有一个错误发生,则CAN控制器被强制置为Bus-Off状态。并且这个时候的发送错误计数为127,并且接收错误计数器为0.软件必须清除RM这一位。在那之后错误计数器会从128往下递减证明是否在总线的空闲状态下(11个连续的隐形位)。BS置位的时候,往其写入任意的0到254的数据清除BUS-OFF状态,当软件在清除BUS-OFF状态时,则只需要检测一个数据总线空闲即可以继续。RM置位并且Can控制器被禁能大部分的功能,并且发送总线错误中断。总线上的设备根据TX和RX的错误计数值会进入不同的状态,如下图所示:
主动错误模式当检测到总线发生错误的时候,会发送错误帧,而被动错误模式作为一种过渡模式,其不能主动向其他设备发送错误帧,并且在发送正常的报文的时候还需要在间隔帧期间内必须插入“暂停发送期”(由8个位的隐性位组成)。
2.2.2 下一类寄存器介绍接收相关类寄存器。
发送命令寄存器,包含三个发送缓存寄存器的选择,控制发送,并且停止发送,释放BUFF,发送寄存器的作用就是当准备好发送数据写入相应寄存器之后,操作这个寄存器完成发送操作。
接收帧数据寄存器,包含接收帧是否为旁路模式接收的数据,以及包含如果不是旁路模式,匹配AF中的过滤条目的index。包含接收帧是数据帧还是遥控帧。如果是遥控帧,则包含期待以相同ID发送的数据帧包含的数据个数,如果是数据帧则包含接收数据的字节数。同时还包含接收帧是标准帧还是扩展帧的信息。
接收ID寄存器,包含接收帧的ID信息,标准帧为11位,扩展帧为29位。
接收数据寄存器A,接收到的低32位,4字节数据寄存器。
接收数据寄存器B,接收到的高32位,4字节数据寄存器。
发送帧信息寄存器(三个,每个发送缓存区一个),包括发送帧是遥控帧还是数据帧,如果是遥控帧则包含发送的遥控帧期待以相同ID发送的数据帧包含的数据个数,如果是数据帧,则包含发送数据的字节数。以及发送数据为标准帧还是扩展帧,以及发送缓存区的优先级。
发送帧的ID寄存器(三个),标准帧11位,扩展帧为29位。
发送寄存器TDA和TDB:存储需要发送的8字节数据。
发送状态寄存器CANTxSR:表征所有CAN控制器是正在发送数据,还是发送buff可以写入,还是发送已经完成。
接收状态寄存器CANRxSR:表征所有CAN控制器是正在接收一个数据,还是完整的接收了一个数据,还是出现了接收数据溢出的情况。
综合状态寄存器:表征TX与RX的错误值是否超出了设定的阈值,或者总线处在busoff状态。
2.2.3 “滤波功能”相关寄存器。
首先介绍一下NXP的芯片特殊的一种概念“Full CAN”模式,类似STM的DMA,NXP将一个特殊的过滤表匹配的报文直接放到了RAM空间,程序能够随机存取。所以NXP的过滤表由4+2部分组成,分别为1.FullCAN ID'S 2.独立11bit ID匹配 3.组11bit ID匹配 4.独立29bit ID匹配 5.组29bit ID匹配 6.FullCAN 接收数据,每种的数据组成如下图。
FullCAN 过滤表的条目组成如下图,若CAN控制器接收到匹配其中条目的CAN ID,则放至FullCAN 接收数据表中:
独立11bit ID匹配条目,若接收到的标准帧匹配条目中的CAN ID 就将其接收,否则过滤掉:
组11Bit ID匹配条目,若接收到的标准帧在条目指示的ID范围内,将接收报文,否则报文被过滤掉。
独立29bit ID匹配条目,若接收到的扩展帧与条目匹配,则接收。
组29bit ID匹配条目,若接收到的扩展帧在两个条目指示的ID范围之间,则接收,否则就会被过滤掉。
验收滤波模式寄存器,包含了能够关闭所有接收操作的控制位(只有在关闭CAN控制器的接收操作,才能修改过滤相关的寄存器),同时包含了旁路模式控制位(旁路模式下不进行过滤),是否使能FullCAN的控制。
独立标准帧的过滤表起始地址寄存器,AF Lookup RAM中,独立的标准帧起始的地址。如果这个表为空,则将这个值与组标准帧过滤表起始地址中的值写成一样。若使用Fullcan,则这一位也能指示Fullcan表的大小。
组标准帧过滤表起始地址寄存器,如果此表为空,则这个寄存的值与独立扩展帧寄存器地址的值一样。这个最大的值为0x800,此时为后边的表都为空。
独立扩展帧寄存器地址寄存器,独立扩展帧过滤表起始地址。如果为空,则写入与组扩展帧过滤表表起始地址一样的值。最大值为0x800。
组扩展帧过滤表表起始地址寄存器,如果这个表为空,则将其与ENDofTable寄存器的值写成一样的。
过滤表RAM结束地址寄存器,这个地址的上面是最后一个AF表。如果fullCAN没有使用,这个值最大值为0x800。如果Fullcan得以使用,这个地址代表了AF将符合第一个fullcan表中的数据保存在这个地址的后边。
还有一些FullCan的中断控制寄存器,以及过滤表访问错误的寄存器,这里就不多做介绍了
下一期针对一个实际的应用场景,来说明一下针对CAN总线的驱动部分代码(CAN寄存器的配置),以及在实际应用过程中会遇到的一些问题
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注『十六宿舍』,大家喜欢的话,给个,更多关于嵌入式相关技术的内容持续更新中。