一种基于FPGA的ISA总线转CAN总线设计与实现
【摘 要】 本设计采用FPGA芯片及其技术实现了智能CAN通讯卡的设计和开发。本设计主要包括:ISA总线、主控制器模块、缓冲区模块、CAN协议控制器模块、以及CAN总线驱动器模块。本设计已在实际工程中得到运用。实践结果表明数据传输稳定,可靠性高。
【关键词】 CAN总线 FPGA VHDL 循环存储
ISA(Industry Standard Architecture,工业标准体系结构)总线是Intel/IEEE/和EISA在62线PC总线基础上经过扩展36根线而开发出的一种系统总线。ISA具有16位数据线,最高工作频率为8MHz,数据传输速率达16Mb/s。24根地址线,可寻址16Mb。使用ISA总线的外部设备不需要具有非常快的吞吐速率。
CAN(Controller Area Network)即控制器局域网络,是一种全数字化、多主和双向的现场总线。CAN总线数据通信具有很高的可靠性、实时性和灵活性,越来越广泛地应用于各种工业现场。
随着计算机应用技术的迅速发展,对高性能/高效率板卡的需求将会越来越大,微机中低性能的ISA总线必将被淘汰。但是在现实应用中仍有数量众多的支持ISA总线的板卡在使用。因此,CAN到ISA总线桥在一定时期内将扮演一种特殊的角色。
1 系统总体设计(图1)
2 工作原理
CAN模块共由四个部分组成:主控制器模块、缓冲区模块、CAN协议控制器模块、以及CAN总线驱动器。见图1。
2.1 主控制器
主控制器是整个模块的控制中心,通过访问CAN协议控制器来实现对CAN总线的访问;同时控制缓冲区,减少数据的丢失率、增加CPU的工作效率。
2.2 数据缓冲区
为了增加模块的数据吞吐量,减少数据丢失率,同时减少CPU的工作负担,在设计时增加了数据接收和发送缓冲器。该缓冲器应该同时满足CPU对其的读写,及CAN协议控制器对其的读写。
双口RAM有时会发生共享冲突问题。因此,将双口RAM作为缓冲区使用,利用FPGA控制程序,它不仅保证了数据的先后次序,也保证了数据流通的速度。
2.3 CAN协议控制器
CAN协议控制器实现CAN协议的数据链路层和物理层功能,对外具有与主控制器和总线接收器的接口。通过对其编程,主控制器可以设置它的工作方式,控制它的工作状态,进行数据的发送和接收,把应用层建立在它的基础之上。
2.4 CAN总线收发器
CAN控制器SJA1000并不能直接与总线连接,还要通过总线收发器才能接于总线上。CAN总线收发器提供CAN协议控制器与物理总线的接口,总线收发器的性能决定了总线接口、总线终端、总线长度和节点数,是影响整个总线网络通信性能的关键因素之一。
3 程序设计
程序可分为三个部分:(1)控制双口RAM。(2)控制SJA1000。(3)写SJA1000命令寄存器程序流程如图2所示。
由流程图可看出在发送CAN总线数据帧时,必须先从双口RAM中读出数据,所以需使双口RAM的片选信号、读信号有效:同时根据前两个字节中的信息获取数据帧信息;然后将读取的数据依次写入SJA1000发送缓冲区;最后写SJA1000命令寄存器,通知SJA1000可以发送CAN数据。
4 读写CAN数据
4.1 写CAN通道数据
如果模块未向CPU发中断以申明某路8KRAM已满,则CPU可以将数据写入该通道。每次最多只能写10个数据。CPU可以根据数据长度来写数据。当需要发送的数据写完后,CPU必须发写结束命令以终止写操作。这样可以节约CPU的操作时间。写数据过程为(以下以写第一通道为例):(1)查询数据状态寄存器(基址+2),看1通道是否能写。(2)向通道1命令口(基址+00)写入写操作开始命令(0x01)。(3)向通道1数据口(基址+01)连续写入1帧的数据(小于等于10字节)。(4)向通道1命令口(基址+00)写入写操作结束命令(0x00)。(5)其他通道的写操作与此类同。
4.2 读CAN通道数据
CPU可以采用扫描方式查询各个通道的状态,当某个通道内有数据时CPU可读取这些数据。CPU可以根据ID1和ID2的数据长度来读取数据。当读数据结束后,CPU必须发读结束命令以告诉CAN终止读操作。这样CPU可以尽早结束读操作,节约CPU的CAN操作时间。读数据过程为(以下以写第二通道为例):(1)查询数据状态寄存器(基址+10),看2通道是否有数据,如果没有数据结束操作,如果有数据则向通道2命令口(基址+04),写入读操作开始命令(0x02)。(2)从通道2数据口(基址+05),连续的读出1帧的数据(小于等于10字节),读完指定长度的数据后,向通道2命令口(基址+04),写入读操作结束命令(0x00)。
参考文献
[1]徐伟业.基于FPGA的CPU核及其虚拟平台的设计与实现[D].河海大学,2007年.
[2]贾晓宇.基于ISA总线的嵌入式智能型张力控制系统[D].武汉理工大学,2002年.
[3]安磊,梁尚军,邴洋海.一种基于FPGA的ISA航空总线设计方法[J].飞机设计,2012(4).