首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

WindowsCE.Net下CAN卡的驱动程序设计 02

WindowsCE.Net下CAN卡的驱动程序设计 02

如果分配内存或映射逻辑地址失败,则退出初始化程序,CAN卡初始化失败。

第四步,初始化读写属性、共享模式、读超时时间和第二个CAN口的基地址。

第五步,创建CAN卡事件和数据接收事件:hCan->lpCanHWInfo->hCanEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

hCan->lpCanHWInfo->hRecvMsgEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

第六步,初始化中断,如果CAN卡有复位请求就退出初始化程序。设置好中断后启动数据接收线程,设置线程优先级继续线程处理;最后配置CAN卡参数,进入正常运行状态。

2.3 CAN卡信息发送

CAN卡的信息发送分为两个步骤。在对CAN卡基本信息进行检查后,首先设置发送缓冲的 ID号。CAN标准模式的ID号为11位,偏移地址10中存放的是ID号的高8位,偏移地址11的高3位存放的是ID号的低3位,剩下5位分别是RTR位(远程传送请求位)和数据长度。通过CANW函数将处理后的数据写入到相应的偏移地址,设置完相应的地址数据后,通过循环将偏移地址12~19的数据采集回来存到数组中。然后,设置CAN卡的传输请求为允许并不断侦测状态寄存器的变化,当传输缓冲满标志或传输结束标志为1时通出程序,完成一次数据采集。传输缓冲区的寄存器如表1所列。



表1

ID号 10 ID.10 ID.9 ID.8 ID.7 ID.6 ID.5 ID.4 ID.3
RTR,数据长度码 11 ID.2 ID.1 ID.0 RTR DLC.3 DLC.2 DLC.1 DLC.0
数据1~8 12~19 数据 数据 数据 数据 数据 数据 数据 数据

表2

ID号 20 ID.10 ID.9 ID.8 ID.7 ID.6 ID.5 ID.4 ID.3
RTR,数据长度码 21 ID.2 ID.1 ID.0 RTR DLC.3 DLC.2 DLC.1 DLC.0
数据1~8 22~29 数据 数据 数据 数据 数据 数据 数据 数据

CAN消息发送函数的实现如下:

BOOL CAN_SendMessage(LPCAN_HW_OPEN_INFO hCan,LPCanCardMessageBuflpMsg)

{

BOOL bSuc=FALSE;

ASSERT(hCan && lpMsg && lpMsg->dwMessageLen <=8); /*防错处理*/

if(0= =(hCan->dwAccessCode & GENERIC_WRITE))

return FALSE;

:: EnterCriticalSection(&hCan->lpCanHWInfo->

TransmitCritSec); /*进入临界区*/

BYTE byV=static_cast<BYTE>(1pMsg->dwMsgID>>3);

CANW(hCan,10,byV); /*设置ID值高8位*/

byV=static_cast<BYTE>=((lpMsg->dwMsgID & 7)<<5);

if(lpMsg->bRTR) byV|=0x10;

byV+=static_cast<BYTE>(lpMsg->dwMessageLen);

CANW(hCan,11,byV);/*设置ID值低3位、RTR及数据长度*/

for(UINT i=0;<lpMsg->dwMessageLen;++i)

{

CANW(hCan,12+i,lpMsg->byMsg);

} /*采集数据*/

CANW(hCan,1,1);/*重置传输请求*/

while(TRUE)

{byV=CANR(hCan,2);

if(byV & 0X40) /*传输缓冲区满,退出*/

{break;}

if(byV & 0X8){ /*传输结束,正确返回退出*/

bSuc = TRUE;

break;}

}

:eaveCriticalSection(&hCan->lpCanHWInfo->TransmitCritSec); /*离开临界区*/

return bSuc;

}
返回列表