3.3 数据的接收
数据接收是从总线上接收数据,进行必要的协议转换,再将转换后的数据存人相应的缓冲区。网关中有3个接收子程序,分别对应两路CAN控制器及一路LIN发送器。数据接收采用中断方式,由于不同网络有不同的实时性要求,因此为3个接收程序设定了不同的中断级别。高速CAN的实时性要求最高,中断级别也设为最高;而LIN总线的实时性在三者中最低,故中断级别也最低。当一个接收中断发生后,进入接收中断子程序,判断相应的缓冲区是否已满(低速CAN的接收程序在接收到数据后需要根据数据的目的网络确定缓存区为BUF2还是BUF3)。如果缓冲区已满,则产生一个溢出错误标志;如果没有满,则将数据进行相应的协议转换,并将转换后的数据存入相应的缓存区,退出中断并完成接收。图6所示为低速CAN数据接收过程的简要流程。
3.4 数据的处理
网关的数据处理是指协议的转换和数据在缓冲区的存储与转发。每当接收到一组数据时,首先进行协议转换,然后再将其存入到相应的缓存区。高低速CAN的协议相同,并不需要转换,因此主要是进行CAN协议和LIN协议之间的转换。
CAN协议和LIN协议都是以帧(frame)为数据单位进行通信的。在进行LIN协议到CAN协议的转换时,首先是将LIN帧分解,从标识符场 (identfield)提取出其中的ID标识符,从数据场(data field)提取出有效数据,然后根据这些信息封装成符合要求的CAN帧格式。CAN协议到LIN协议的转换过程亦是如此。先将CAN帧分解,从仲裁域 (arbitration field)和数据域(data field)中提取出有用信息,然后封装成符合要求的LIN帧格式。
数据的4个缓冲区BUF1~BUF4为FIFO(First InFirst Out)缓冲区,本文采用循环队列(circular queue)来实现数据的先进先出。两个指针Read和Write分别指示队头元素和队尾元素在缓冲区空间中的位置,它们的初值在队列初始化时均应置为 0,每读取或写入一次数据,都要对缓冲区的参数进行调整。写数据时,将新元素插入Write所指的位置,然后将Write加1;读数据时,删去Read所指的元素,然后将Read加1并返回被删元素。
4 网关通信测试
将网关的高速CAN接口和低速CAN接口分别与单独的CAN节点电路相连,LIN接口与单独的LIN从节点相连,组成测试网络。测试的主要内容为高速 CAN和低速CAN之间的通信,低速CAN和LIN网络之间的通信。高速CAN网络采用速率为500 kb/s,低速CAN网络采用的速率为100kb/s,LIN网络采用的速率为10 kb/s。利用PC机的串口发送测试数据,同时在另一个串口终端上进行数据的监测。测试结果表明,发送数据内容与监测到的数据内容一致。
5 总 结
以AT91SAM7A3为核心设计的一款CAN/LIN混合网关,实现了汽车网络中高速CAN总线、容错CAN总线及LIN总线三类网络之间的通信,使汽车中的各类网络的信息能够有效共享,实现了不同性质网络的互联。