garfield

【原创】【飞思卡尔】MCF52235 CAN模块使用教程【2】

0
阅读(4094)

续上节

数据帧发送/接收
数据帧发送的过程:
FlexCAN模块16个报文缓冲区(MB)中的任意一个都可以被配置成发送缓冲区,且每个MB每次最多可以发送8字节数据。以第0个缓冲区MB0为例(其他MB的配置与MB0配置方法相同),将MB0配置为发送缓冲区并进行标准/扩展数据帧发送的步骤是:
(1)写MB0控制/状态字段的4位CODE域=1000,配置MB0为发送报文缓冲区且为空闲状态;
(2)如果要通过MB0发送一个扩展帧则需进行如下设置:写标准ID和扩展ID到MB0的ID字段;写待发送数据字节到MB0的数据字段;将MB0控制/状态字段的IDE位和SRR位置位;将待发送数据长度写入MB0控制/状态字段的4位LENGTH域。如果要通过MB0发送一个标准帧则需进行如下设置:写标准ID到 MB0的标准ID字段;写MB0的扩展ID字段为0;写待发送数据字节到MB0的数据字段;将待发送数据长度写入MB0控制/状态字段的4位LENGTH域。
(3)写MB0控制/状态字段的RTR位=0,4位CODE域=1100,激活报文缓冲区,启动数据帧发送。
(4)由于发送过程需要一定时间,所以需要延时一定时间然后再判断发送是否完成。一旦MB0发送数据帧成功则中断标志寄存器IFLAG中的BUF0I位(即MB0发送完成标志位)将被置位。此时若允许中断(中断掩码寄存器IMASK的BUF0M位被置位),将触发MB0中断。
(5)一次发送完成,需清中断标志寄存器IFLAG中BUF0I位。
数据帧接收的过程:
MCF52235 FlexCAN模块的16个报文缓冲区(MB)也可以独立配置成接收缓冲区,并支持标准/扩展帧接收。仍以MB0为例(其他MB的配置与MB0配置方法相同),将MB0配置为接收缓冲区并进行标准/扩展帧接收的步骤如下:
(1)写该MB0的控制/状态字段的4位CODE域=0000,配置MB0为接收缓冲区且为空闲状态;
(2)如果要通过MB0接收一个扩展帧,则首先写标准ID和扩展ID到MB0的ID字段,然后将控制/状态字段的IDE位和SSR位置位。如果要发送一个标准帧,则需写标准ID到 MB0的标准ID字段,并写MB0的扩展ID字段为0;
(3)写MB0的控制/状态字段的4位CODE域=0100,激活接收缓冲区,启动接收。
(4)一旦MB0接收到数据,则中断标志寄存器IFLAG中的BUF0I位将被置位,此时若允许中断(中断掩码寄存器IMASK的BUF0M位被置位)将触发MB0中断,用户可以通过查询相应标志位,或通过中断读取接收报文缓冲区数据。

远程帧发送/接收
远程帧发送的过程:
MCF52235 FlexCan模块有16个报文缓冲区(MB),每个报文缓冲区都可以独立配置成发送缓冲区,可发送数据帧/远程帧,并支持发送标准帧/扩展帧。以MB0为例,其他MB的配置与MB0配置方法相同,将MB0配置为发送缓冲区并进行标准/扩展远程帧发送的步骤如下:
(1)写MB0控制/状态字段的4位CODE域=1000,配置MB0为发送报文缓冲区且为空闲状态;
(2)如果MB0发送一个扩展远程帧则需进行如下设置:写标准ID和扩展ID到MB0的ID字段;将MB0控制/状态字段的IDE位和SRR位置位;写远程请求数据字节长度写入MB0控制/状态字段的4位LENGTH域。如果要发送一个标准远程帧则进行如下设置:写标准ID到 MB0的标准ID字段;写MB0的扩展ID字段为0;将远程请求数据字节长度写入MB0控制/状态字段的4位LENGTH域。
(3)写控制/状态字段的RTR= 1,写4位CODE域=1010,激活报文缓冲区启动远程帧发送。
(4)由于发送过程需要一定时间,所以需要延时一定时间后再判断发送是否完成。一旦MB0发送远程帧成功,则中断标志寄存器IFLAG中的BUF0I位(即MB0发送完成标志位)将被置位。此时若允许中断(即中断掩码寄存器IMASK的BUF0M位被置位),将触发MB0中断。一旦发送完毕,MB0将变为接收具有相同ID的接收报文缓冲区。
(5)一次发送完成,需清中断标志寄存器IFLAG中BUF0I位。
远程帧接收的过程:
仍以MB0为例,其他MB的配置与MB0配置方法相同,将MB0配置为应答一个远程帧的报文缓冲区的步骤如下:
(1)写MB0控制/状态字段的4位CODE域=1000,配置MB0为发送报文缓冲区且为空闲状态。
(2)如果设置应答帧为数据帧,则将应答帧数据写入MB0的数据字段。
(3)写允许应答的标准/扩展远程帧的ID到MB0的ID字段;如果应答数据帧为扩展帧则将控制/状态字段的IDE位和SSR位置位。将应答数据帧长度写入MB0控制/状态字段的4位LENGTH域。
(4)写控制/状态字段的RTR=0或1,写4位CODE域=1010,激活报文缓冲区,当收到ID匹配的远程帧时则启动发送数据帧/远程帧作为应答。应答帧将被发送远程帧的报文缓冲区所接收。

仲裁处理、匹配处理及报文缓冲区管理
1.报文缓冲区管理:
报文缓冲区管理(Message Buffer Managing,MBM)是为了保证数据的一致性和FlexCAN操作的正确性。为对报文实现双缓冲,FlexCAN设置了两个串行报文缓冲区(Serial Message Buffer,SMB)。这两个缓冲区用于存放FlexCAN接收到的报文和待发送的报文。某一时刻只能有一个串行报文缓冲区处于激活状态。
1)报文缓冲区失活
在当前匹配/仲裁期间,任何CPU写MB的控制/状态字段都将使得MB从发送/接收过程中移除。这种机制称为MB失活。
2)锁定和释放报文缓冲区
当CPU读一个已激活且不为空的接收报文缓冲区的控制/状态字段时,FlexCAN假定CPU想要以一种原子操作读整个报文缓冲区,然后置要读报文缓冲区的内部锁定标志,这种操作称为锁定。CPU读自由运行计数器(全局解锁操作),或读另一个报文缓冲区的控制/状态字段时将解除锁定,这种操作称为释放。
2. 仲裁处理:
仲裁处理是报文缓冲区管理执行的一个算法,它扫描整个MB内存,寻找具有最高优先级的报文并发送。仲裁处理发生在以下过程中:CAN帧的CRC校验过程;CAN帧的错误界定过程;在仲裁中获胜的MB失活的间隙,或没有MB需要发送,但是在前一次仲裁结束后CPU写了某一个MB的控制/状态字段的间隙;报文缓冲区管理(MBM)空闲或者总线关闭且CPU写了某一个MB的控制/状态字段时;冻结模式退出过程。
3. 匹配处理:
匹配处理是扫描整个MB内存,寻找与CAN总线上接收到的帧的ID相匹配的接收缓冲区的一个算法。只有被设置为接收的MB才参与匹配。 CAN总线上的帧的ID、DLC和数据字段都被检索,并暂时保存在串行报文缓冲区SMB中。

初始化函数设计
1.FlexCAN初始化过程:
FlexCAN的初始化包括复位以后报文缓冲区的初始化配置和CAN通信参数的配置,以及在操作过程中可能需要再次配置的选项。FlexCAN可通过以下三种方式来复位:
(1)设备级硬件复位—同步复位所有的内存映像寄存器
(2)设备级软件复位—同步复位部分内存映像寄存器
(3)CANMCR的SOFTRST位—与设备级软件复位等效

对FlexCAN模块的任何配置改变或初始化操作,都必须在冻结模式下进行。下面是通用的初始化配置步骤:
(1)初始化CANCTRL寄存器中的操作模式
(2)初始化报文缓冲区
(3)根据接收掩码的需要初始化RXGMASK、RX14MASK和RX15MASK
(4)初始化FlexCAN中断处理
(5)清CANMCR.HALT(FlexCAN配置寄存器的HALT位)
2.FlexCAN错误/状态寄存器(ERRSTAT)
ERRSTAT显示各种错误条件以及CAN节点的一些状态信息。
3.FlexCAN错误计数器寄存器(ERRCNT)
该寄存器有两个8位的字段,用于显示FlexCAN接收错误计数器(RXECTR)和发送错误计数器(TXECTR)的值。

为了保证数据的完整性和传输的可靠性,CAN总线提供了错误标定、故障界定和错误恢复机制,任何节点发生错误都会报错。CAN总线中存在5种错误类型:
(1)位错误(Bit Error)
(2)填充错误(Stuff Error)
(3)CRC错误(CRC Error)
(4)形式错误(Form Error)
(5)应答错误(Acknowledgment Error)