基于WINCE的CAN驱动的研究与实现

时间:2012-03-24来源:网络

4 接口设计

4.1软硬件环境

CAN驱动的开发依托于北京昆仑通态公司现有的软硬件平台进行项目设计,具体平台环境描述如下:

①硬件软件平台:北京昆仑通态公司的nTouch HMI TB33H和TD33H;嵌入式组态软件:Mcgsce.exe。

②CAN控制器:SJA1000。 SJA1000是PHILIPS公司早期CAN控制器PCA82C200的替代品,功能更强。

③实时操作系统:WINCE。WINCE是一个高效率的实时操作系统,拥有多线程、多任务、确定的实时性和完全抢占式优先级的环境,专门面向只有有限的资源的硬件系统。

4.2 接口设计

下面列举了主要的用户接口和外部接口,外部接口提供给父设备调用,完成CAN控制功能:

(1)SvrGetCanID( )得到当前设置的Can ID,成功返回0,失败返回-1。

(2)SvrClearCanInBuff( )读Can卡数据并清空Can卡输入缓冲区,成功返回0,失败返回-1。

(3)SvrWriteAndRead( )写并且读Can卡操作,发送一个消息包,然后接收指定长度数据。成功返回接收到的字节数,失败返回-1。

(4)SvrRegisterID( ),注册用户ID。只有注册了ID的用户,父设备才会收到接收缓冲中。在子设备开发时,必须先注册,才能做接收数据的操作。

(5)SvrUnregisterID( )注销用户ID。

用户只需要学会使用上面的五个接口,就可以开发驱动了。

SvrGetCanID接口可以得到父设备的地址ID。象串口操作一样,发送前需要清空Can卡缓冲区,需要调用SvrClearCanInBuff接口。发送子设备数据需要调用SvrWriteAndRead接口。先把目的子站ID放入dwID变量中,要发送的数据放入缓冲区buf中,通过dwLen 设置需要读数据长度,通过dwDelayTime设置延时时间(单位为毫秒)。

第一步:组态初始化设置,在MCGS_DLL_FUNC 的SvrGetDevInfo( )函数中,定义Can卡子设备驱动:devType = DEV_CHILD定义为子设备;devStyle = DEV_CAN定义为父设备。

第二步:得到接口的指针。

第三步:清空Can卡缓冲区:调用SvrClearCanInBuff( )。

第四步:发送子设备数据(发子设备数据可能需要父设备地址:调用SvrGetCanID),并得到它的返回:调用SvrWriteAndRead( )。

第五步:解析上面的返回数据,按照子设备协议继续进行处理。

4.3 工作方式

驱动程序由三部分组成:在Windows内核中工作的windows设备驱动程序、MCGS中的CAN父设备、MCGS中的CAN子设备。

windows设备驱动程序:由于使用多主通讯,通讯的发生时间是不可预知的,而且sja1000的通讯缓冲区有限(64字节),因此最好在中断中处理通讯事务。建议将大部分工作在windows设备驱动程序中完成。可以建立一块内存如:unsigned char can_data[60][2][64][4]。将所有收到的I/O模块的寄存器数据解包后保存到该内存中,数组下标依次是模块地址(实际应减4)、过程或参数、寄存器编号、寄存器数据字节序号。MCGS可以通过windows设备驱动程序直接用读文件操作函数读出寄存器值,用写文件操作函数将可写的参数寄存器值写入windows设备驱动程序,windows设备驱动程序将其打包为命令数据帧发出。windows设备驱动程序还要完成对设备状态的监视,可使用一个60个元素的char数组来标识I/O设备(最大60个设备)的状态,值0为正常,其它为异常。当6秒内未收到模块的节拍帧时,应将模块对应的状态置成1。MCGS应能通过windows设备驱动程序读出设备状态。

MCGS中的CAN父设备:建议在MCGS中的CAN父设备中做改变通讯速率的工作。父设备通过windows设备驱动程序的ioctl函数来改变通讯速率。

MCGS中的CAN子设备:建议为了简化组态工作,为每一种不同类型的I/O模块定制不同的CAN子设备。Can子设备包含了模块名称、生产厂家、版本等信息,其中最重要的是模块的过程和参数寄存器的数量和数据类型。

1 2 3

关键词: WINDOWSCE 嵌入式系统 CAN MCGS

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版