APP下载

基于S3C6410 及Wince 系统的CAN 驱动的设计与优化

2021-05-12刘海龙吴海波张蕾

电子设计工程 2021年8期
关键词:驱动程序中断总线

刘海龙,吴海波,张蕾

(湖南铁道职业技术学院,湖南株洲 412001)

控制器局域网(Controller Area Network,CAN)总线是国际上应用最广泛的现场总线之一,其属于多主机半双工异步串行通信总线,具有通信实时性好、传输速度快、抗干扰能力强和成本低等优点[1]。Wince 系统作为嵌入式系统中的重要组成部分,稳定性好,在工业应用领域占有重要地位,如车机系统、工业控制等领域应用广泛[2]。CAN 总线通信可以集成于各类嵌入式软硬件平台,在多种嵌入式软硬平台上均有成熟研究和设计[3]。文献[4]中介绍了基于VxWorks 系统平台下CAN 驱动程序的设计方法[4];文献[5]中给出了基于Linux 系统平台下的独立CAN控制器驱动设计和优化方案[5];文献[6]中介绍了基于SPARC V8 硬件构架平台下CAN 模块的驱动设计方法[6]。上述关于CAN 的设计方案通道数大多是在2路以内,适合一些通信功能相对简单,具有一定通用性的领域。文中CAN 通信应用于基于工业机器人的数控机床上下料过程中,需要满足多六维力觉传感器、双目机器人视觉数据和机器人系统反馈信号等多路信号的实时通信要求,硬件平台的I/O 也需要复用通道,因此现有的驱动设计方案无法满足应用需求。

该文采用S3C6410 为硬件核心,Wince8 为软件系统平台研究开发CAN 总线驱动程序,S3C6410 是一款基于ARM1176JZF-S 核的终端设备通用处理器,16/32 位RISC,可稳定运行在667 MHz 主频以上,性价比高,在工业终端领域有广泛的应用[7-8]。CAN通信模块采用Microchip 的MCP2515,该芯片有6 个验收屏蔽寄存器和6 个验收滤波寄存器,功能完全满足现场应用需求[9]。以S3C6410 硬件平台对Wince系统下的CAN 总线驱动的研究成果较少,在多板多通道CAN 通信过程中,存在中断频率高导致数据传输效率低下问题[10]。针对该问题,该文也在驱动设计中通信效率环节上进行了优化设计和验证,提高整个系统通信的稳定性和高效性。

1 硬件设计

模块采用的Microchip MCP2515,是一款独立局域网络协议控制器,支持CAN V2.0B 技术规范,能发送和接收标准、扩展数据帧及远程帧[11-12]。收发器采用TAJ1051T,收发器的功能是提供控制器区域网络CAN 协议控制S3C6410和物理双线CAN MCP2515总线之间的接口,该收发器高速达1 Mbit/s,为控制器核心S3C6410 和CAN 协议控制器MCP2515 提供差分发射和接收功能[13]。其部分关键电路设计图如图1 所示,其中TXCAN 和RXCAN 连接S3C6410 收发I/O 引脚;连接CAN 通信的下位机分别为工业机器人上下料工作站传感器信号采集终端、视觉信号采集终端,上位机为工业机器人信号控制器端,整个工作站通过CAN总线通信实现分布式结构。

图1 硬件部分电路设计图

2 CAN驱动程序设计

基于Microchip MCP2515 驱动程序设计首先完成MCP2515 工作原理的流程结构设计,根据工作流程按功能分为地址映射、I/O 接口设计、系统接口处理、中断处理功能和初始化函数等设计。

2.1 地址映射与配置

在基于Wince8 下的MCP2515 驱动程序设计中,由于系统内核程序不能直接读取物理地址,需要将物理地址映射到虚拟空间,地址是由译码器确定的[14]。内核程序中设计了MmMapIoSpace()函数实现该功能,并配置了MCP2515 的两种工作模式,分别为回环和标准模式,其中回环模式用于多终端的CAN 组网通信,标准模式用于标准的CAN 联机通信[15]。其关键代码如下:

随后配置MODBUS 通信内容协议的位时间tbit参数,表示CAN 每帧数据组成段构成的时间分配参数,组合公式如下:

以上式中的各时间参数分别对应为同步段、传播段、相位缓冲段PS1、相位缓冲段PS2,Microchip MCP2515 数据手册中规定须满足PS1>PS2 条件,因此该参数配置的关键代码如下:

2.2 关键接口函数

I/O 接口涉及的关键函数有CAN_Open、CAN_Close、CAN_Write、CAN_Read 和Init_MCP2515 共5 个,其中部分功能采用函数调用的方式实现,如CAN_IOControl 函数,用于上位机应用程序对I/O 端口的控制,使用中通过I/O 接口函数间接调用。

1)CAN_Open 函数设计

函数原型为DWORD CAN_Open(DWORD dwData,DWORD dwAccess,DWORD dwShareMode),主要是配置MCP2515 的工作模式,并提供上位机应用程序打开该驱动的接口;打开CAN_Open 函数时,需要对通信的波特率进行配置,调用波特率配置函数。

2)CAN_Close 函数设计

函数原型为BOOL CAN_Close(DWORD dwData),主要是配置MCP2515 驱动程序,关闭时为控制进行复位操作,调用了复位清零函数。上位机应用程序关闭该驱动的接口函数为CloseHandle(HANDLE),执行成功返回TURE,执行失败则返回FALSE。

3)Init_MCP2515 函数设计

函数原型为void Init_MCP2515 (CanBandRate bandrate),主要用于配置MCP2515 的通道I/O 参数状态初始化、波特率设定、滤波及工作模式参数等,该函数在执行CAN_Open 时需要被调用。其中涉及的所有S3C6410 连接I/O 端口均需要对其状态进行初始化,否则可能会因为I/O 状态不确定导致通信错乱的现象,I/O 初始化部分代码如下。

4)CAN_Write 函数设计

函数原型为DWORD CAN_Write(DWORD hOpen Context,LPCVOID pSourceBytes,DWORD NumberOf Bytes),主要用于向接收终端发送数据帧,数据缓存为pSourceBytes,数据位为NumberOfBytes,用于发送接收端数据校验,提高通信的准确性。在应用程序中执行WriteFile()函数写入设备数据,其写入关键程序如下。

为降低中断频率,MCP2515 的发送中断被禁用,发送前先查询寄存器的缓冲器的状态,缓冲器清零则立即发送帧数据,若缓冲器锁定则轮询方式循环查询状态,达到超时数值后返回并提示,函数的发送流程如图2 所示。

5)CAN_Read 函数设计

图2 CAN_Write函数发送流程

函数原型为DWORD CAN_Read(DWORD hO penContext,LPVOID pBuffer,DWORD count),主要用于读取总线上的数据帧,pBuffer 为数据缓冲区,count 为数据位,用于校验准确性。MCP2515 收到数据帧后触发中断,中断处理发送消息列队,该函数则读取消息列队,将数据读取至缓冲区中。应用程序中执行ReadFile()函数读取设备数据,由于系统采用分布式多设备的组网通信,在数据读取时需要先读取CAN 总线ID,每个ID 为唯一的,且对应具体的设备终端,其关键代码如下。

其工作流程和CAN_Write 函数类似,其流程图此处不再赘述。

2.3 中断处理优化

对于嵌入式实时操作系统,为了满足系统对硬件的实时性响应需求,需要通过高效的中断服务程序来满足要求[16]。MCP2515 的中断类型有发送中断、接收中断、错误中断等,采用低电平中断[17-18]。中断处理的设计思路为先判断中断状态再执行相应的处理,对于发送与接收中断,当发送或接收数据缓冲区释放后自动执行中断的清除。

S3C6410 的WINCE BSP 中已经对CPU 中断端口进行了定义和事件绑定,在该文的应用中对CPU 中断I/O 进行了效率优化,所有外部中断均集成至一个CPU,避免了外部中断过多导致的可维护性差、运行效率低的缺点。中断的事件创建和等待事件部分关键程序如下:

3 测试与分析

该文在S3C6410 主板上对CAN 通信进行驱动调试与测试分析,主要测试CAN 总线的帧传输效率和驱动程序的稳定性。传输速率主要是测试数据帧的发送、接收速度以及中断响应频率。由于CAN 总线通信是采用多终端组网数据采集和控制,若各个通信终端中断频率高,会占用过多的系统硬件资源导致性能下降,甚至出现死机现象。通过中断处理优化,在数据通信时,CAN 上位机中断响应明显下降,几乎不存在丢帧问题,性能稳定。

驱动程序的组网稳定性测试则主要是测试多设备联机情况下CAN 运行情况,该文测试采用了单台S3C6410 主机连接6 台STM32 数据采集终端,当任意断开1~3 台STM32 终端,造成CAN 通信模块异常。测试优化前当1 号CAN 模块异常时,第2 号CAN 模块通道则变为8~15,造成通道冲突报错。优化后当1号CAN 模块异常时,第2 号CAN 模块正常工作,不会受影响,异常模块则被隔离。具体结果如表1 所示。

表1 优化前后测试数据

测试结果表明,驱动程序中的接口功能函数、中断服务程序优化后,能够有效提高CAN 多终端设备的稳定组网和高速通信,降低系统中断频率,提高了系统性能,保证了整个系统的稳定运行。

4 结束语

该文以S3C6410 为硬件平台,在Wince8 嵌入式系统下,提出一种针对Microchip MCP2515 的CAN 驱动程序的设计与优化方案,该驱动程序集成于BSP中。该驱动程序支持多设备终端的组网和CAN 总线通信,实现了多种STM32 终端与S3C6410 上位机之间的数据通信,且下位机终端设备具有良好的扩展性,通信协议确定后终端设备具有通用性。实验结果表明,该驱动程序能够稳定运行,性能可靠。

猜你喜欢

驱动程序中断总线
基于PCI Express总线的xHC与FPGA的直接通信
机载飞控1553B总线转以太网总线设计
计算机硬件设备驱动程序分析
跟踪导练(二)(5)
千里移防,卫勤保障不中断
多通道ARINC429总线检查仪
基于EtherCAT总线的ROV控制系统设计
基于MPC8280的CPU单元与内部总线驱动程序设计
AT89C51与中断有关的寄存器功能表解
FPGA内嵌PowerPC的中断响应分析