邢荣峰
太原航空仪表有限公司 030000
CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一,是由德国Bosch公司最早提出的[1]。它是一种多主方式的串行通讯总线,基本设计规范要求有较高的位速率、高抗电磁干扰性,而且能够检测出产生的任何错误。当信号传输距离达到10km时,CAN仍可提供50Kbit/s的数据传输速率。其总线规范已被ISO国际标注化组织制定为国际标准ISO11898(高速应用)和ISO11519(低速应用)。
因为CAN总线具有很高的实时性能,所以它在汽车电子、航空工业、工业控制、安全防护等领域中得到广泛应用。但是,在常用的微处理器中有很多微处理器内部并没有集成CAN控制器,如基于ARM1176JZF-S内核的微处理器S3C6410。因此,将这类微处理器和CAN独立控制进行组合设计就成为必要。
微处理器S3C6410是基于ARM1176JZF-S内核的16/32-bit RISC微处理器,具有低成本、低功耗、高性能的特点。S3C6410具有极佳的外部存储器接口,同时提供了丰富的硬件外设接口,非常适合对成本、功耗敏感的应用。
SJA1000T是使用较为广泛的一种CAN独立控制器,主要用于移动目标和一般的工业环境[2]。SJA1000T与微处理器的接口可设置为Intel模式或Motorola模式。本文的接口设计是基于Intel模式的,在此模式下,SJA1000T的数据和地址信号是分时复用的。
S3C6410和SJA1000T之间的硬件设计需要解决两个问题,一个是电平转换问题,一个是读写时序问题。
S3C6410的工作电压是3.3V,而SJA1000T是5V供电,两者之间不能直接相连,需要进行电平转换。如果需要总线双向传输数据,则在S3C6410和SJA1000T之间需要使用带有方向控制的转换芯片,例如SN74LVC245。如果总线是单向传输数据的,则可以使用SN74LVC541实现两者的相连。
前面已提到SJA1000T的接口在Intel模式下数据和地址信号是分时复用的,而S3C6410为数据和地址信号分离的结构[3],且S3C6410不提供ALE信号。因此,设计的关键就是S3C6410要把SJA1000T的地址当成数据写入并同时产生ALE信号,S3C6410的地址信号只作为译码控制信号使用。本设计使用S3C6410的NGCS4对应的地址空间(地址范围为0x20000000~0x27FFFFFF)、地址总线ADDR0、NOE和NWE来实现SJA1000T的ALE、写使能控制信号)读使能控制信号)和片选信号)。
对于SJA1000T,ALE信号需要在发送其地址是有效(此时为高有效),在发送和接收其数据时无效。规定当ADDR0=1时发送地址,ALE可以通过如下逻辑组合实现:
对于微处理器而言,CAN独立控制器是基于事件触发的。CAN独立控制器会在本身状态发生改变时,将变化的结果通知微处理器。因此微处理器处理CAN信息时,可以采用中段的方式,也可以采用轮询的方式来完成相应处理。在软件编写之前先确定SJA1000T的基地址及复位引脚,然后正确初始化SJA1000T,填写要发送的报文,使能发送请求,即可进行CAN接收和发送。
SJA1000T的初始化流程见图1。其中,配置CAN工作模式和设定中断使能这两个步骤可以根据需要进行裁剪,其余步骤则是必须的初始化工作。
图1 SJA1000T的初始化流程
当完成SJA1000T的初始化后,就可以使用发送缓存寄存器和接收缓存寄存器进行报文数据的接收和发送。
CAN总线将数据发送到发送缓存寄存器,然后对发送缓存寄存器赋值以启动发送。CAN独立控制器只负责发送,不保证发送成功。要验证发送是否成功,可以查询SJA1000T状态寄存器的TCS位,或者配合中断来判断。
CAN总线接收数据时,先通过读取状态寄存器信息来确认当前缓存器中是否有数据。当有数据时,将数据读出并放入CAN接收数据存储区,待需要时从该存储区读出。
本文介绍了微处理器S3C6410和CAN独立控制器SJA1000T之间接口的差异,提出了SJA1000T和S3C6410总线设计方案。该设计方案可以作为内部没有集成CAN控制器的微处理器和CAN独立控制器之间组合设计的参考。
[1]饶云涛,邹继军,郑勇芸.现场总线CAN原理及应用技术[M].北京:北京航空航天大学出版社,2003.
[2]NXP Company.SJA1000 Data Shee t[Z].2004.
[3]Samsung Electronics Company.S3C6410X USER'SMANUAL[Z].2008.