3 CAN总线控制器sJAl000驱动程序设计
CAN总线控制器SJAl000驱动采用流接口驱动程序模型,要实现的流接口函数分别为CAN_Init,CAN_Deinit,CAN_Open,CAN_Close,CAN_Read,CAN_write,CAN_IOControl等。应用程序使用CreatFile()函数以文件的方式打开CAN控制器驱动,以获取驱动文件的句柄,然后使用该句柄调用DeviceloControl(),ReadFile(),WriteFile()函数来CAN控制器的各种功能。
由于篇幅有限,下面仅针对CAN_Init,CAN_Read和CAN_IntrThread函数的实现进行详细的设计。
3.1 CAN_Init函数的设计实现
当用户开始使用CAN总线控制器时,设备管理器调用这个函数来初始化控制器设备SJAl000。这个函数是通过设备管理器提供的ActiveDeviceEx()函数来调用的。函数执行后,如果成功就返回设备的句柄。CAN_Init函数的流程如图2所示。

根据CAN协议规范,报文的接收由CAN控制器SJAl000独立完成,收到的报文放在接收缓冲器。可以发送给主控制器的报文由状态寄存器的接收缓冲器状态标志“RBS'’和接收中断标志“RI”标出(如果使能)。主控制器会将这条信息发送到本地的报文存储器,然后释放接收缓冲器并对报文操作。发送过程能被SJAl000的中断请求或查询SJAl000的控制段状态标志来控制。cAN_Read函数操作成功则返回实际读取的字节数,否则返回值为-1。CAN_Read函数程序的流程图如图3所示。

在SJAl000控制器中,报文的发送和接收是采用中断方式来完成的。内核函数InterruptInitialize()外部中断事件和将逻辑中断号绑定,这一步就会使能该中断。当该中断发生时,ISR就触发该事件生效。完成以上工作后,驱动程序中的IST就可以使用WaitForsin-gleObject()函数等待中断的发生。中断处理结束后,IST需要调用InterruptDone()告诉操作系统中断处理结束。中断服务线程CAN_IntrThread函数程序流程图如图4所示。

4 驱动程序的封装及加载
通过上面的工作,能够编译得到一个DLL函数,但它的接口函数还没有导出,还需要告诉链接程序需要输出什么样的函数。为此,必须建立一个def文件,使用WindoWS下自带的记事本程序编辑一个文件名为“Can.def”的文件:

