作者:唐苗
引言
TMS320F2812是TI公司新推出的DSP芯片,内嵌CAN总线控制器eCAN模块(以下简称为eCAN),性能较已有的DSP(如TMS320C24x)内嵌的控制器有很大的提高;数据传输更加灵活方便,数据量较大,可靠性更高,功能更加完备。而SJA1000是Philips半导体公司推出的新型独立CAN控制器,是PCA82C200的替代产品,支持CAN2.0B协议,完全兼容CAN2.0A,是目前应用比较多的CAN独立控制器之一。
CAN总线系统通信的软件一般可以分为三个主要模块:系统初始化模块、信息发送模块和信息接收模块。下面以TMS320F2812内嵌的eCAN模块与广州周立功公司的DP51+仿真实验仪之间的CAN通信为例,主要就eCAN和SJA1000在这三个部分的操作进行比较。
1 eCAN简介
eCAN同时支持11位和29位的标识码,是一个32位的控制器。eCAN的有些寄存器(如控制寄存器)必须以32位方式访问;一些寄存器(如时间标识寄存器)和邮箱所在的RAM范围可以以8位、16位或32位方式访问。eCAN对信息的接收和发送是基于邮箱的,共有32个邮箱,占用512字节RAM。每一个邮箱都可以有自己独立的ID,独立配置成接收邮箱或者发送邮箱,也可以禁止不用。这样大大增加了数据的容量和信息的处理能力。
TMS320F2812内嵌的eCAN还有一种SCC模式。它是eCAN的缺省工作模式,功能有所简化,同样支持11位和29位的标识码;但只有16个(0~15)邮箱可用,有些寄存器(如CANTSC)也保留不用,可以通过主控制寄存器(CANMC)中SCB位的置“1”来进入eCAN模式。本文若没有特别说明指的就是全功能eCAN工作模式。
2 系统初始化
CAN控制器有两种状态模式,即工作模式和复位模式(eCAN是初始化配置模式)。不同的状态模式,对寄存器的访问操作功能是不同的。无论是eCAN还是SJA1000,在使用之前,也就是进入工作模式之前,必须对它们进行初始化。
仅当eCAN处于初始化模式下,初始化才能进行。DSP复位后就激活了初始化模式,此时对eCAN进行初始化。首先必须将主控制寄存器的改变配置请求位(CCR)置“1”,且CANES的改变配置使能位(CCE)也必须为“1”时才能正式进入配置模式,就可以对位定时器配置寄存器进行操作了。要返回工作模式,必须将CCE和CCR依次成功清“0”。图1(a)为eCAN初始化的流程。
将模式寄存器的复位位置“1”,就可以使SJA1000进入复位模式。在复位模式,需要设定时钟分频寄存器、总线定时寄存器、报文验收寄存器、验收屏蔽寄存器和输出控制寄存器等。设置好各个寄存器后,就可以将复位位清“0”,进入正常的工作模式。进入复位模式后,需要立即设置时钟分频寄存器,将CAN模式位置“1”才能进入PeliCAN模式,否则进入SJA1000的缺省工作模式,即BasicCAN;而其他寄存器的设置则没有严格的次序限制。在这两种工作模式中,SJA1000寄存器从数量、地址分配到功能等方面是有较大区别的。这里主要讨论的是SJA1000的PeliCAN模式。图1(b)给出了SJA1000初始化的流程。
由图1可以看出,eCAN的初始化在操作上比SJA1000要复杂一点,需要成功地将CCR和CCE先后置“1”,才能进行配置操作;而SJA1000只需要将复位位置“1”就可以进行初始化操作了。
3 信息发送
eCAN要发送信息,首先须将某个邮箱配置成发送邮箱,写邮箱标识符寄存器和报文控制寄存器以及数据。使能该邮箱后,将发送寄存器(CANTRS)相应的位置“1”,eCAN就将该邮箱中的数据发送到总线上。报文控制寄存器中的TPL用来设定消息发送的优先级,数字越大,优先级越高。当多个邮箱需要向总线发送消息时,虽然同时将CANTRS相应的位置“1”,优先级高的邮箱先将消息发送;如果邮箱的优先级相同,则邮箱号数大的,先发送。以0号邮箱为例,其发送消息的流程如图2 (a)所示。
SJA1000一般可以采用查询方式来发送信息。不过每一次操作只能向总线上发送1帧信息,而不像eCAN那样,可以一下子向总线发送多帧消息。当SJA1000的发送缓冲区为空时,CPU就可以将要发送的信息写入该缓冲区,然后置命令寄存器的发送请求位,即可将消息发送到总线上。发送完毕后,清空发送缓冲区,等待CPU写入新的信息。SJA1000发送信息时的流程如图2(b)所示。
对于eCAN,如果邮箱需要发送另一条信息,就需要将邮箱的RAM更新。一般只需要更新数据场,即重新写MDL和MDH中的内容。更新数据时,须将CANMC中的CDR位置“1”,并在MBNR处写入需要更新数据的邮箱号,就可以写入新的数据了。之后,将CDR清“0”,使能该邮箱就可以按正常步骤发送信息了。由此可见,对eCAN发送的信息进行数据更新比SJA1000复杂得多。
4 信息接收
eCAN和SJA1000在接收总线上的信息时,都可以采用查询方式或者中断方式。这里仅讨论各自的中断方式。
eCAN要接收信息时,相应的邮箱需要配置成接收邮箱并使能,还需要设定信息标识符寄存器(MID)。局部接收屏蔽寄存器(LAM),用来存储局部接收屏蔽位。覆盖保护寄存器(CANOPC)相应位,当其为1时,保护相应邮箱里的数据不被新的数据覆盖,此时还需要另一个邮箱来接收新的后续信息,否则会引起数据丢失;有数据丢失时CANRML相应的位会置1。当eCAN邮箱接收到信息时,就会产生相应的中断,继而CPU判断是哪个邮箱接收到信息,再读取邮箱里的数据。以31号邮箱为例,eCAN的信息接收的流程如图3 (a)所示。
SJA1000接收信息时,在接收中断使能的情况下,当总线上的信息满足报文验收的接收条件,无论该信息是数据帧还是远程帧,都会将信息存放在接收缓冲区,并产生接收中断。CPU就可以读取接收缓冲区中的信息并保存,然后可以清空接收缓冲区,等待接收下一条信息。SJA1000的信息接收流程如图3(b)所示。
SJA1000在PeliCAN模式下有两种滤波方式:单滤波方式和双滤波方式。当验收屏蔽寄存器的某位为1时,验收代码寄存器的相应位“不起作用”,即信息标识符相应位无论是“0”还是“1”都会被接收;当验收屏蔽寄存器的某位是0时,信息标识符相应位与验收代码寄存器的相应位必须一致,该信息才被接收。有关这两种滤波方式的具体内容请参见相关手册或论文。eCAN的验收条件比SJA1000相对复杂。当邮箱标识符寄存器中的AME位为0时,LAM将不起到作用,此时只有标识符与邮箱的标识符完全一样的信息才被邮箱接收或者存储;当AME为1时,eCAN将使用LAM,此时对信息的接收情况与SJA1000的单滤波方式相似,只接收符合条件的信息。
此外,eCAN与SJA1000在对远程帧的处理上也有较大的差别。eCAN处理远程帧时分为两种情况:向其他节点请求数据和自动应答远程帧。这两种情况必须将报文控制寄存器中RTR位置“1”。要向其他节点请求数据,必须将某邮箱配置成接收邮箱,写入标识符,使能该邮箱,将CANTRS相应的位置“1”,就向总线上发送了一个远程帧。eCAN会将对方的应答信息存在这个邮箱(这得保证没有相同ID的其他接收邮箱)。自动应答远程帧时,邮箱配置成发送邮箱,且邮箱标识符寄存器中的AAM位必须置“1”,写入需要发送的数据。当该邮箱接收到其他节点发送来的远程帧时,CANTRS中的相应位自动置位,将报文发送到总线上。而SJA1000接收到1帧信息后,根据RTR位来判断是否是远程帧,如果是远程帧,则根据制定的通信协议对该远程帧作出相应的回答,不能自动应答远程帧。
结语
eCAN和SJA1000都是功能十分强大的CAN总线控制器,都有各自的优点,可以应用在不同的场合。虽然它们在CAN总线通信中具体操作上有较大的差别,但其基本思路是一致的。在软件编程上大致可分为初始化、信息发送和信息接收三个基本模块,再加上总线睡眠与唤醒处理、总线出错处理和总线超载处理等功能模块,就可以构成一个比较完整的CAN总线通信软件。随着CAN总线技术的推广,eCAN和SJA1000都将有不错的表现。