<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=5 width="90%" align=center borderColorLight=#000000 border=0>
讯享网
WinCE系统双CAN构建方案 文章来源: http://www.emtronix.com/case/case2008190.html CAN(Controller Area Network)即控制器局域网,由于具有高性能、高可靠性以及简单的网络结构,在工业系统中越来越受到人们的重视,并迅速成为了目前国际上应用最广泛的现场总线之一。 英创提供的EM9000系列ARM9嵌入式主板,包括EM9000、EM9260、EM9360等多种型号,都预装了正版WinCE操作系统,且带有标准CAN。与板上其他标准通讯接口一样,英创公司为所有EM9000系列的CAN接口配置了标准的WinCE流式驱动程序,可以通过打开文件的进行读写的标准方式实现对CAN总线接口的数据通讯。本文侧重于介绍CAN通讯接口,下面以EM9000嵌入式主板为例,介绍如何利用英创的ARM9嵌入式主板快速构建双CAN接口的方案。 英创提供的系列ARM9嵌入式主板,除EM9160嵌入式主板外,所有的ARM9主板上均可直接支持一个CAN接口。ETA701是英创公司提供的基于ISA总线扩展的一个CAN模块,可以通过ISA总线外接一个ETA701模块,即可构成一个双CAN系统。
CAN 接口驱动函数
一、 CAN 报文的帧格式 在CAN2.0B中存在两种不同的帧格式,其主要的区别在于标识符的长度,具有11位标识符的帧称为标准帧,而包括有29位标识符的帧称为扩展帧。下面分别介绍的格式。 1、CAN2.0B标准帧 CAN标准帧信息为11个字节,包括两部分:信息和数据部分。前3个字节为信息部分,如图所示:| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
| 字节1 | FF | RTR | X | X | DLC() | |||
| 字节2 | (报文识别码)ID.10~ID.3 | |||||||
| 字节3 | ID.2~ID.0 | RTR | ||||||
| 字节4 | 数据1 | |||||||
| 字节5 | 数据2 | |||||||
| 字节6 | 数据3 | |||||||
| 字节7 | 数据4 | |||||||
| 字节8 | 数据5 | |||||||
| 字节9 | 数据6 | |||||||
| 字节10 | 数据7 | |||||||
| 字节11 | 数据8 | |||||||
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
| 字节1 | FF | RTR | X | X | DLC(数据长度) | |||
| 字节2 | (报文识别码)ID.28~ID.21 | |||||||
| 字节3 | ID.20~ID.13 | |||||||
| 字节4 | ID.12~ID.5 | |||||||
| 字节5 | ID.4~ID.0 | |||||||
| 字节6 | 数据1 | |||||||
| 字节7 | 数据2 | |||||||
| 字节8 | 数据3 | |||||||
| 字节9 | 数据4 | |||||||
| 字节10 | 数据5 | |||||||
| 字节11 | 数据6 | |||||||
| 字节12 | 数据7 | |||||||
| 字节13 | 数据8 | |||||||
NULL, OPEN_EXISTING, 0, NULL); 对于CAN2通讯接口,只需将其中的名称换成 _T(“CAN2:”)即可。在创建CAN设备得到有效的handle之后,就可以调用can_api.h中定义的相应函数来启动CAN设备接口。 BOOL CAN_StartChip (HANDLE hDevice); 至此CAN通讯接口进入工作模式。 三、设置 CAN 通讯接口参数 在进行CAN数据通讯之前,需要设置和CAN通讯相关的一些参数,包括CAN通讯的波特率设置以及对接收过滤器的设置。 BOOL CAN_SetBaudRate(HANDLE hDevice, BYTE *index); 用于设置CAN通讯的波特率,波特率的设置范围包括:10kbps~1Mbps。具体的定义请参见can_api.h文件中的注释说明。 通过配置接收过滤器,CAN通讯接口可以实现只接收标识符也接收过滤器预设值相一致的报文。接收过滤器由接收码寄存器ACRn和接收屏蔽码寄存器AMRn来定义的,还可以选择两种不同的过滤器模式,单过滤器模式或者双过滤器模式。关于ACR、AMR中各位的定义,请参见SJA1000的数据手册,这里就不再赘述。在英创提供的API函数中,用户可以调用以下函数来实现接收过滤器的设置: BOOL CAN_SetGlobalAcceptanceFilter( HANDLE hDevice, BYTE *AcceptanceFilter, BYTE size) 四、 CAN 通讯接口的数据收发 在英创公司提供的双CAN方案中,CAN通讯的数据收发均采用的中断方式,驱动程序中已自动完成了数据的收发,以及内部定义的CAN接收缓冲区和发送缓冲区的管理。对于用户开发应用程序来说,只需要调用英创公司提供的CAN通讯API函数中的收发函数即可。下图为CAN驱动程序的数据流和事件的关系图。
在进行CAN通讯应用程序的开发时,对于CAN通讯数据接收线程可以采用两种方式:一种可以采用定时查询,即定时调用函数CAN_GetNextReceivedFrame( …)检测是否有接收到CAN报文数据;一种可以利用操作系统的消息机制,采用事件响应的方式,一旦硬件接收的数据报文,底层的驱动接收程序会自动读取报文,同时发送一个接收事件。作为应用程序的接收线程在等待到该事件后,调用CAN_GetNextReceivedFrame(…)即可进行CAN数据报文的读取。需要注意的是函数CAN_GetNextReceivedFrame每执行一次,只是读取了一帧CAN数据报文,如果在应用程序中需要将最新的数据全部读出,只需反复调用该函数,直到该函数的返回值为FALSE。
接收线程部分代码: DWORD CEM9000_CAN::ReadThreadFunc( LPVOID lparam ) { CEM9000_CAN ceCAN = (CEM9000_CAN)lparam; BOOL bResult; while ( 1 ) { if (WaitForSingleObject(ceCAN->m_hReadCloseEvent,0 )==WAIT_OBJECT_0 ) { break ; } // 等待接收事件触发,使用以下代码 WaitForSingleObject( ceCAN->m_hRxEvent, INFINITE ); // 若采用定时查询,则调用Sleep(..)即可,Sleep的时间由应用程序确定 // Sleep( 50 ); ceCAN->m_nRxCounter = 0; for ( ; ; ) { // 读取已接收的所有数据帧 bResult=CAN_GetNextReceivedFrame(ceCAN->m_hCAN, &ceCAN->RxMFrame[ceCAN->m_nRxCounter] ); if ( !bResult ) { break ; } ceCAN->m_nRxCounter++; } if (ceCAN->m_nRxCounter>0 ) { // 调用回调函数,进行必要的数据处理 ceCAN->OnRead( ceCAN->m_pCANOwner ); } } return 0; } CAN数据报文的发送比较简单,应用程序直接调用函数CAN_SendFrame(…)即可。 英创公司针对CAN总线的应用提供图形化的测试程序,用户可以直接利用该程序进行CAN接口通讯基本收发测试。EM9000下的测试界面如下图所示:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/154753.html