基于PCI总线的CAN卡的设计与实现
(7)5个局部地址空间 基址和地址范围及其映射可以由串行EEPROM或主控设备进行设置。
(8)Big/Little Endian模式的字节交换 适合不同计算机体系。
(9)局部总线等待状态 降了等待信号LRDYi#用于握手之外,PCI9052还有一个内部等待产生器(包括地址到数据周期、数据到数据周期和数据到地址周期的等待)。
(10)延迟读模式 PCI9052支持PCI2.1规范的延迟读模式。
(11)FIFO PCI9052包括一个64Byte的写FIFO和一个32Byte的读FIFO,从而支持预取模式、即突发操作。
(12)PCI锁定机制 主控设备可以通过锁定信号占有对PCI9052的唯一访问权。
由于CAN总线的迅猛发展,许多芯片厂商开发了很多系列的CAN通信控制器芯片。如表2所示。
表2 主要CAN总线芯片
制造商 | 芯片型号 | 芯片功能及特点 |
Intel | 82527 8XC196CA/CB | CAN通信控制器,符合CAN2.0B 扩展的8XC196+CAN通信控制器,符合CAN2.0B |
Philips | SJA1000 82C250 P51XA-C3 | CAN通信控制器,符合CAN2.0B 高性能CAN总线收发器 16位微控制器+CAN通信控制器,符合CAN2.0B |
Motorola | 68HC05X4系列 | 68HC05微处理器+CAN通信控制器 |
NEC | 72005 | CAN通信控制器,符合CAN2.0A/B |
由于PCI9052可以启动局部总线的读写,CAN卡不再需要微控制器,采用CAN通信控制器即可,本CAN卡采用SJA1000.SJA1000支持BasicCAN和PeliCAN模式,具有FIFO、支持热插拔等功能,不但可以实现CAN总线接口功能,而且芯片可以根据晶振的频率,输出可编程的CLKOUT信号,该信号正好可作为PCI9052的局部总线的总线频率,节省了器件,方便了设计。CAN总线的总线频率可为12MHz、16MHz或24MHz,PCI9052自动实现局部总线与PCI总线的访问同步。CAN总线收发器采用82C250.该芯片是CAN总线控制器和物理总线的接口,可以提供对CAN总线的差动发送和接受能力,具有抗瞬间干扰、保护部的能力,可以通过调整CAN总线通讯脉冲的边沿斜率来降低射频干扰。
由于PCI设备在计算机中的硬件资源是系统动态分配的,因此在设计出基本的硬件框架后,要进行PCI配置设计。CAN卡的硬件资源为映射SJA1000内部寄存器的内存映射间和一个中断源。PCI9052提供5个局部地址空间,可以选用其中的一个作为SJA1000的地址空间,分配32个8位地址。同时设置相应的初始化,PCI配置寄存器中的寄存器PCIBAR2设置为0XFFFFFFE0,向系统请求分配内存的数量为32,类型为不可预读,其它寄存器的值可设置为0。设置局部地址空间的范围为0X00000000~0X00000020。PCI9052提供2个局部中断源,利用LINTi1即可,注意的是:LINTi1信号线没有驱能力,SJA1000的INT引脚也没有驱动能力,因此该信号线必须加上拉电阻,否则该信号线的电平不确定,工作肯定不正常。SJA1000提供电平触发中断信号,因此PCI9052的中断触发模式设置为电平触发。利用PCI9052的局部设备片CS0#作为SJA1000的片选信号。CS0#片选信号的起始地址和地址范围为CS0 Base Address寄存器设置,值为0x00000002。另外,PCI9052的LRDYi#信号为局部总线数据准备信号,SJA1000的寄存器地址映射成地址,数据传输不存在延迟等待,因此LRDYi#引脚可接地,表示SJA1000的寄存器总是立即可读写。PCI9052寄存器的初始值由串行EEPROM提供,在PCI9052加电后读取。EEPROM必须采用支持连读功能的芯片,本用Microchip的93LC46B。用PCX公司提供的开发工具PlxMon可对93LC47B进行读写。
PCI9052的硬件调试可采用PlxMon。利用它可以对PCI设置的配置资源进行检验。利用PLX提供的SDK,可以对PCI9052的局部寄存器、局部总线及EEPROM进行读写,这样可以调试硬件。借助开发工具,不必开发PCI设备的调试软件,可节省很多时间。同时,SDK也为驱动程序的开发提供了程序框架,加快了开发进度。
CAN卡的电路框图如图1所示。
javascript:window.open(this.src);" style="cursor:pointer;"/>
2 软件设计
软件设计包括驱动程序的设计和COM组件程序设计。
由于PCI设备的中断、I/O端口、映射内存等资源都是动态分配的,必须编写驱动程序管理硬件,才能供用户编程使用。为了通用性和兼容性,CAN卡驱动程序的开发采用支持Windows XP、Windows2000和Windows98的WDM驱动程序。开发工具采用Visual C++6.0和Win2000 DDK。由于CAN卡上没有微控制器,因此对CAN总线端口的所有操作都是由驱动程序来完成的。这不仅可以由计算机来实现复杂的功能,例如,错误检测、断点续传等,同时节省了硬件,而且有利于CAN卡的升级——只要更换驱动程序即。驱动程序的功能主要是配置SJA1000的CAN接口、收发CAN总线上的数据、对发数据和CAN总线错误均采用中断处理,驱动程序可以快速响应,通过事件(Event)内核对象直接通知给用户程序。由于WDM驱动程序运行在系统的内核态,编写非常复杂,限于篇幅,仅给出软件的框图(见图2)。
为了方便用户的使用,还应编写相应的API函数或ActiveX控件等其它应用层的程序提供给用户。由于ActiveX控件基于先进的COM技术,具有良好的封装性、使用灵活性等特点,可使用户编程简单、方便,因此在CAN卡的设计中编写了ActiveX控件,ActiveX控件负责与驱动程序的通信,通过控件的事件把CAN卡接收的数据通知给用户程序,利用控件的属性设置CAN通信控制器,按照设置的方法发送用户程序的数据。
根据以上的设计,开发名为Can1000的CAN卡。经使用证明,该卡设计简单明了、性能较高、成本低廉、驱动程序ActiveX控制使用方便,达到了设计和用户的要求。