RSS

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

来源:深圳电子技术网 作者:不详 时间:2007-03-03 Tag: 点击:

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[i]);
} /*采集数据*/
CANW(hCan,1,1);/*重置传输请求*/
while(TRUE)
{byV=CANR(hCan,2);
if(byV & 0X40) /*传输缓冲区满,退出*/
{break;}
if(byV & 0X8){ /*传输结束,正确返回退出*/
bSuc = TRUE;
break;}
}
::LeaveCriticalSection(&hCan->lpCanHWInfo->TransmitCritSec); /*离开临界区*/
return bSuc;
}
2.4 CAN卡信息接收
CAN卡的信息接收是发送的逆过程,当接收缓冲区标志为1时,表示缓冲区已满可以接收数据,将数据接收到数组后释放接收缓冲区,然后对接收到的数据进行分解并存储到CAN卡信息缓冲区的结构体。接收缓冲区的寄存器结构如表2所列。
CAN消息接收函数的实现如下:
BOOL CAN_RecvRecvMessage(LPCAN_HW_OPEN_INFO
HCan,OUT LPCanCardMessageBuflpMsg)
{……
if(CANR(hCan,2)&1){ /*判断接收缓冲区是否已满*/
for(UINT i=0;i<10;++i)
recvBuf[i]=CANR(hCan,20+i);/*将数据暂存到临时缓冲区*/
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
教程下载