久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区

以文本方式查看主題

-  曙海教育集團(tuán)論壇  (http://m.rfoamep.cn/bbs/index.asp)
--  Wince技術(shù)討論區(qū)  (http://m.rfoamep.cn/bbs/list.asp?boardid=9)
----  主要討論在WinCE設(shè)計和開發(fā)C...WindowsCE.Net下CAN卡的驅(qū)動程序設(shè)計31028  (http://m.rfoamep.cn/bbs/dispbbs.asp?boardid=9&id=1392)

--  作者:wangxinxin
--  發(fā)布時間:2010-11-16 14:31:36
--  主要討論在WinCE設(shè)計和開發(fā)C...WindowsCE.Net下CAN卡的驅(qū)動程序設(shè)計31028
3、4、5、6、7、9、10、11、12、15,同時1000V的光電隔離提供系統(tǒng)高可靠性。在CAN卡通信中,要用到CAN控制器中的很多寄存器,各個寄存器的含義和作用可以參考控制芯片的說明書。圖1列出驅(qū)動程序設(shè)計中用到最主要的寄存器結(jié)構(gòu)。

2 CAN卡驅(qū)動底層函數(shù)設(shè)計

本方案設(shè)計CAN驅(qū)動是放在Windows CE操作系統(tǒng)的內(nèi)核下層,圖片點(diǎn)擊可在新窗口打開查看位于OEM adaptation layer(OAL)層的一個真正的驅(qū)動,而不是在主程序中的串口操作。在Windows CE的設(shè)備管理器可以看到CAN1和CAN2兩個端口,并且可以查看其工作的正常與否和對其進(jìn)行配置。如:中斷號和I/O地址。

2.1 CAN卡寄存器讀寫函數(shù)

CAN卡的通信是通過操作CAN卡上的CAN控制器進(jìn)行的。在CAN控制器中有很多寄存器,如控制寄存器、命令寄存器、狀態(tài)寄存器、中斷寄存器等,通過讀寫這些寄存器中的命令狀態(tài)字可以檢測和控制CAN卡的行為。在Windows CE.NET下,通過調(diào)用DOK中的API函數(shù)HalTranslateBusAddress,將CAN卡分配的物理地址映射為邏輯地址。這樣各個寄存器對應(yīng)的就是CAN卡基地址的偏移地址,因此,對寄存器的讀寫就轉(zhuǎn)化為對內(nèi)存地址的讀寫。下面是CAN卡寄存器的讀寫函數(shù):

*在偏移量為off的地址讀取一個字節(jié)的數(shù)據(jù)inline BYTE CANR(LPCAN_HW_OPEN_INFO hCan,DWORD off)

{

return hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr[off];

*將一個字節(jié)數(shù)據(jù)寫到偏移量為off的地址中inline VOID CANW(LPCAN_HW_OPEN_INFO hCan,DWORD off,BYTE val)

{

hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr[off]=val;

}

參數(shù)LPCAN_HW_OPEN_INFO定義的是CAN卡的數(shù)據(jù)結(jié)構(gòu),其中成員lpMappeBaseAddr[0]表示的是映射后基地址,lpMappedBaseAddr[1]就是基地址+1的地址,對應(yīng)CAN卡的寄存器是命令寄存器。通過上述兩個函數(shù)可操作CAN卡上的所有寄存器。

2.2 CAN卡初始化

CAN卡的控制器比較復(fù)雜,在通信前必須確認(rèn)硬件信息正確性、初始化各寄存器。初始化函數(shù)的基本流程如圖3所示。

第一步,檢查端口號和硬件信息的正確性,主要是CAN卡中斷號是否有效。

第二卡,設(shè)置CAN卡默認(rèn)參數(shù):

CanCardConfigInfo CAN_DEFAULT_SETTING=

{0X00,0XFF,0X03,0X1C};/*設(shè)置默認(rèn)波特率為125Kbps*/

DWORD dwThreadID =0;

PHYSICAL_ADDRESS phyAddr={hwInfo->dwIOBaseAddr *16,0 };

第三卡,用WinCE API函數(shù)LocalAlloc為CAN卡驅(qū)動中用到的數(shù)據(jù)結(jié)構(gòu)分配緩沖區(qū);通過HalTranslateBusAddress和MmMapIoSpace函數(shù)映射I/O地址,提供直接訪問設(shè)備的虛擬地址:

if(!HalTranslateBusAddress(Isa,0,phyAddr,0,&phyAddr))

goto _ExitInit;

hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr=

(LPBYTE)MmMapIoSpace(phyAddr,CANCARDADDRLEN,FALSE);

if(!hCan->lpCanHWInfo->lpCanObj->lpMappedBaseAddr)

goto _ExitInit;

如果分配內(nèi)存或映射邏輯地址失敗,則退出初始化程序,CAN卡初始化失敗。

第四步,初始化讀寫屬性、共享模式、讀超時時間和第二個CAN口的基地址。

第五步,創(chuàng)建CAN卡事件和數(shù)據(jù)接收事件:hCan->lpCanHWInfo->hCanEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

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

第六步,初始化中斷,如果CAN卡有復(fù)位請求就退出初始化程序。設(shè)置好中斷后啟動數(shù)據(jù)接收線程,設(shè)置線程優(yōu)先級繼續(xù)線程處理;最后配置CAN卡參數(shù),進(jìn)入正常運(yùn)行狀態(tài)。

2.3 CAN卡信息發(fā)送

CAN卡的信息發(fā)送分為兩個步驟。在對CAN卡基本信息進(jìn)行檢查后,首先設(shè)置發(fā)送緩沖的ID號。CAN標(biāo)準(zhǔn)模式的ID號為11位,偏移地址10中存放的是ID號的高8位,偏移地址11的高3位存放的是ID號的低3位,剩下5位分別是RTR位(遠(yuǎn)程傳送請求位)和數(shù)據(jù)長度。通過CANW函數(shù)將處理后的數(shù)據(jù)寫入到相應(yīng)的偏移地址,設(shè)置完相應(yīng)的地址數(shù)據(jù)后,通過循環(huán)將偏移地址12~19的數(shù)據(jù)采集回來存到數(shù)組中。然后,設(shè)置CAN卡的傳輸請求為允許并不斷偵測狀態(tài)寄存器的變化,當(dāng)傳輸緩沖滿標(biāo)志或傳輸結(jié)束標(biāo)志為1時通出程序,完成一次數(shù)據(jù)采集。傳輸緩沖區(qū)的寄存器如表1所列。

表1

ID號 10 ID.10 ID.9 ID.8 ID.7 ID.6 ID.5 ID.4 ID.3
RTR,數(shù)據(jù)長度碼 11 ID.2 ID.1 ID.0 RTR DLC.3 DLC.2 DLC.1 DLC.0
數(shù)據(jù)1~8 12~19 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù)

表2

ID號 20 ID.10 ID.9 ID.8 ID.7 ID.6 ID.5 ID.4 ID.3
RTR,數(shù)據(jù)長度碼 21 ID.2 ID.1 ID.0 RTR DLC.3 DLC.2 DLC.1 DLC.0
數(shù)據(jù)1~8 22~29 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù) 數(shù)據(jù)

CAN消息發(fā)送函數(shù)的實現(xiàn)如下:

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); /*進(jìn)入臨界區(qū)*/

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

CANW(hCan,10,byV); /*設(shè)置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);/*設(shè)置ID值低3位、RTR及數(shù)據(jù)長度*/

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

{

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

} /*采集數(shù)據(jù)*/

CANW(hCan,1,1);/*重置傳輸請求*/

while(TRUE)

{byV=CANR(hCan,2);

if(byV & 0X40) /*傳輸緩沖區(qū)滿,退出*/

{break;}

if(byV & 0X8){ /*傳輸結(jié)束,正確返回退出*/

bSuc = TRUE;

break;}

}

::LeaveCriticalSection(&hCan->lpCanHWInfo->TransmitCritSec); /*離開臨界區(qū)*/

return bSuc;

}

2.4 CAN卡信息接收

CAN卡的信息接收是發(fā)送的逆過程,當(dāng)接收緩沖區(qū)標(biāo)志為1時,表示緩沖區(qū)已滿可以接收數(shù)據(jù),將數(shù)據(jù)接收到數(shù)組后釋放接收緩沖區(qū),然后對接收到的數(shù)據(jù)進(jìn)行分解并存儲到CAN卡信息緩沖區(qū)的結(jié)構(gòu)體。接收緩沖區(qū)的寄存器結(jié)構(gòu)如表2所列。

CAN消息接收函數(shù)的實現(xiàn)如下:

BOOL CAN_RecvRecvMessage(LPCAN_HW_OPEN_INFO

HCan,OUT LPCanCardMessageBuflpMsg)

{……

if(CANR(hCan,2)&1){ /*判斷接收緩沖區(qū)是否已滿*/

for(UINT i=0;i<10;++i)

recvBuf[i]=CANR(hCan,20+i);/*將數(shù)據(jù)暫存到臨時緩沖區(qū)*/

CANW(hCan,1,4); /*釋放接收緩沖區(qū)*/

LpMsg->dwMsgID=recvBuf[0]<<3; /*取出ID的高8位*/

BYTE byV =recvBuf[1];

LpMsg->dwMsgID+=byV >>5;/*取出ID低3位,然后和高8位合并*/

LpMsg->bRTR =byV &0x10?TRUE:/*返回RTR狀態(tài)*/

LpMsg->dwMessageLen = byV &0XF; /*返回數(shù)據(jù)長度*/

……

}

else

{++hCan->lpCanHWInfo->dwErrorMsgCount;}/*沒有收到數(shù)據(jù),錯誤計數(shù)加1*/

::LeaveCriticalSection(&hCan->lpCanHWInfo->

ReceiveCritSec); /*離開臨界區(qū)*/

Return bSuc;

}

2.5 CAN卡事件處理

CAN卡事件處理函數(shù)是CAN卡驅(qū)動程序中很重要的部分。驅(qū)動設(shè)計要求具有消息通知的功能,當(dāng)事件發(fā)生時及時捕獲事件并進(jìn)行消息處理。

下面是事件處理函數(shù)的實現(xiàn):

staric DWORD WINAPI CAN_EventHanle(LPVOID lpParam)

{

ASSERT(lpParam);

LPCAN_HW_OPEN_INFO hCan=(LPCAN_HW_OPEN_INFO)lpParam;

CanCardMessageBuf bufMsg;

while(TEUE)

{ /*循環(huán)等待CAN卡消息產(chǎn)生,然后進(jìn)行處理*/

::WaitForSingleObject(hCan->lpCanHWInfo->hCanEvent,0XFFFFFFFF);

if(hCan->lpCanHWInfo->bKillCanThread) break; /*若CAN線程已關(guān)閉則中斷*/

if(CAN_RecvMessage(hCan,&hufMsg)){ /*正確接收數(shù)據(jù)后*/

CAN_RecvBufPush(hCan,&bufMsg);} /*將數(shù)據(jù)壓入緩沖*/

BYTE byV=CANR(hCan,3); /*將3號寄存器讀出然后立即寫入*/

CANW(hCan,3,byV);/*能夠獲取每次中斷*/

InterruptDone(hCan->lpCanHWInfo->lpCanObj->dwSysIrqt);

} /*本次中斷結(jié)束,等待下次中斷*/

return 0;

}

2.6 其它函數(shù)

為了提供更多的功能和更方便地使用CAN卡進(jìn)行通信,在CAN卡驅(qū)動程序中還設(shè)計了一些函數(shù)如CAN_Config用CAN卡信息配置、CAN_RecvBufPop用于處理接收緩沖區(qū)、CAN_Reset用于復(fù)位CAN卡、CheckHWInfo用于硬件信息檢查等。這些函數(shù)提供了對CAN通信卡的設(shè)置、檢查等功能,在這里不再詳述了。

3 CAN卡驅(qū)動封裝設(shè)計

CAN卡底層驅(qū)動函數(shù)雖然功能完整,但是對于用戶使用比較復(fù)雜并且一般用戶不需要了解底層實現(xiàn)的機(jī)制。為了便于使用,最后對CAN卡的驅(qū)動進(jìn)行了封裝,提供CanOpenFile、CanSendMsg等五個函數(shù)用于CAN總線的通信,以動態(tài)連接庫(DLL)的形式提供給用戶調(diào)用。封裝函數(shù)及功能如下:

*CanOpenFile;初始化并打開CAN卡的一個端口。

*CanCloseFile;關(guān)閉由CanOpenFile打開的CAN卡端口。

*CanRecvMsg;接收CAN卡數(shù)據(jù),打開CAN卡時必須具有GENERIC_READ權(quán)限。

*CanSendMsg;通過CAN卡發(fā)送數(shù)據(jù)。打開CAN卡時必須具有GENERIC_WRITE權(quán)限。

*CanIOControl;設(shè)置或獲取CAN卡I/O參數(shù)支持的I/O控制包括:IOCTL_CAN_CONFIG,IOCTL_CAN_RESET,IOCTL_CAN_TIMEOUT,IOCTL_CAN_SENDREADY,IOCTL_CAN_RECVREADY。

下面是CanSendMsg函數(shù)實現(xiàn)的代碼:

BOOL CanSendMSg(

HANDLE hCan,

LPCanCardMessageBuflpMsg)

{

if(!hCan||INVALID_HANDLE_VALUE= =hCan||

!lpMsg||lpMsg->dwMessageLen>8)return FALSE;

return CAN_SendMessage(LPCAN_HW_OPEN_INFO)

hCan,lpMsg);

該函數(shù)就是通過封裝CAN卡的底層驅(qū)動函數(shù)SendMessage來實現(xiàn)的,這樣將功能集中的五個函數(shù)更方便了用戶使用。

結(jié)語

程序開發(fā)的上位機(jī)是普通的PC機(jī),軟件環(huán)境是:Windows2000 Professional、Embedded Visual C++4.0、與下位機(jī)中WinCE.NET對應(yīng)的SDK,該SDK是在用Platform Builder 4.0定制WinCE時編譯生成的。下位機(jī)使用的硬件是研華的嵌入式PC104主板PCM3346N,操作系統(tǒng)為WinCE.ENT。

本文設(shè)計開發(fā)的驅(qū)動已經(jīng)在北京懷柔的變電站項目中得到成功的應(yīng)用,CAN卡通信穩(wěn)定,系統(tǒng)在WINCE.NET下運(yùn)行可靠,保證了項目的順利實施。


久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
欧美一二三四在线| 91福利在线导航| 国内精品视频一区二区三区八戒| 亚洲一区电影777| 亚洲精品国久久99热| 国产精品久久久久久久久免费丝袜 | 婷婷成人激情在线网| 亚洲一区二区三区四区中文字幕| 中文字幕一区二区三区视频| 中文字幕一区二区三区四区不卡 | 色噜噜久久综合| 色av成人天堂桃色av| 亚洲综合视频一区| 亚洲一区二区三区精品在线| 国产精品白丝在线| 尤物在线观看一区| 五月综合激情婷婷六月色窝| 麻豆国产精品视频| 国产伦精品一区二区三区视频青涩| 国产成人超碰人人澡人人澡| 99久久精品国产导航| 国产伦精品一区二区三区高清版 | 91高跟黑色丝袜呻吟在线观看| 91丨porny丨户外露出| 福利视频一区二区三区| 欧美高清性xxxxhd| 中文字幕中文字幕在线中心一区| 欧美三级日韩三级国产三级| 精品日韩在线观看| 国产精品国产三级国产专播品爱网| 亚洲精品免费在线播放| 奇米四色…亚洲| 不卡一区中文字幕| 免费成人看片网址| 欧美三级中文字幕| 久久久久九九视频| 夜夜嗨av一区二区三区网页| 美女精品一区二区| 91小视频免费观看| 亚洲欧美在线网| 日韩欧美综合在线| 一区二区三区丝袜| 国产精品77777| 精品一区二区久久久久久久网站| 一道本成人在线| www久久精品| 亚洲综合成人在线视频| 国产乱码精品一区二区三 | 国产一区二区精品久久| 99高清视频有精品视频| 一本一生久久a久久精品综合蜜 | 午夜国产不卡在线观看视频| 丁香六月综合激情| 少妇精品久久久久久久久久| 日韩美女视频在线| 亚洲国产人成综合网站| 东方欧美亚洲色图在线| 欧美一区1区三区3区公司| 欧美一区二区三区小说| 国产精品美女久久久久av爽李琼| 日韩高清不卡一区二区| 成人在线视频网址| 欧美日韩国产经典色站一区二区三区 | 99久久精品免费| 欧美一区国产一区| 精品少妇一区二区三区在线播放 | 一本色道久久加勒比精品 | 国产精品视频免费一区二区三区| 在线一区二区三区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 美腿丝袜一区二区三区| 精品国产_亚洲人成在线| 欧美精品黑人性xxxx| 一区二区三区蜜桃网| 91免费在线播放| 欧美精品乱码久久久久久按摩| 亚洲男女毛片无遮挡| av一区二区三区四区| 欧美影视一区在线| 一级精品视频在线观看宜春院| 91在线观看一区二区| 欧美精品久久99| 午夜精品视频在线观看| 精品高清视频| 2020国产精品| 国产乱对白刺激视频不卡| 日韩影院一区| 最好看的中文字幕久久| 99国产视频| 日韩一区二区免费高清| 久久99久久99精品免视看婷婷| 日韩激情久久| 亚洲色图欧美偷拍| 91久色国产| 26uuu另类欧美亚洲曰本| 国产一区二区看久久| 在线观看视频欧美| 丝袜美腿高跟呻吟高潮一区| 日本一区二区三区四区在线观看| 国产视频一区二区三区在线观看| 国产精品一区在线观看你懂的| 国产伦理久久久| 精品国产髙清在线看国产毛片| 奇米色一区二区三区四区| 日产中文字幕在线精品一区| 一区二区中文字幕在线| 91入口在线观看| 久久精品夜色噜噜亚洲a∨| 处破女av一区二区| 精品人伦一区二区色婷婷| 粉嫩一区二区三区性色av| 欧美精品1区2区| 国产成人av福利| 日韩欧美国产一区在线观看| 岛国av在线一区| 精品国产百合女同互慰| www.日韩av| 久久亚洲精品小早川怜子| 91精品国产综合久久久久久丝袜| 久久久影院官网| 91嫩草视频在线观看| 国产精品蜜臀在线观看| 国产一区福利视频| 亚洲欧美日韩国产综合| 色播亚洲视频在线观看| 天堂久久久久va久久久久| 在线观看成人免费视频| 国产精品一区在线| 精品盗摄一区二区三区| 114国产精品久久免费观看| 中国色在线观看另类| 日本高清久久一区二区三区| 日欧美一区二区| 91精选在线观看| 91亚洲国产成人精品一区二三| 中文字幕精品一区二区精品绿巨人 | 成人欧美一区二区三区黑人免费| 国产欧美精品区一区二区三区| 成人片在线免费看| 亚洲午夜精品一区二区三区他趣| 一本久久a久久免费精品不卡| 久久99久久精品| 欧美sm美女调教| 精品国产乱码久久久久久郑州公司 | 成人激情免费视频| 国产精品久久久久久久岛一牛影视 | 久久久久久久电影| 女女同性女同一区二区三区91| 三级亚洲高清视频| 日韩视频在线一区二区| 九九久久99| 麻豆精品国产91久久久久久| 欧美精品一区二区三区四区| 欧美第一黄网| 韩国成人福利片在线播放| 精品日韩成人av| 欧美乱偷一区二区三区在线| 国内精品国产成人国产三级粉色 | 欧美中文字幕一区二区三区| 成人激情小说乱人伦| 亚洲女人的天堂| 精品视频1区2区| 91福利视频导航| 日韩av在线免费观看不卡| 精品区一区二区| 亚洲欧美日韩在线综合| 成人av网站免费| 亚洲一区二区在线免费观看视频| 91精品在线一区二区| 国外成人在线视频网站| 六月丁香综合在线视频| 国产欧美精品一区二区色综合朱莉| 亚洲一区二区三区免费看| 国产91丝袜在线播放九色| 中文字幕精品一区二区三区精品| 欧美在线一区二区| 久久99精品久久久久久水蜜桃| 黄色资源网久久资源365| 中文字幕欧美一| 日韩一区二区三区视频在线| 日韩精品不卡| 91亚洲永久精品| 精品综合久久久久久8888| 一区二区在线观看不卡| 欧美r级电影在线观看| 一区二区三区不卡在线| 国产伦精品一区二区三区免 | 欧美电影免费观看高清完整版在线观看| 精品一区日韩成人| 成年人午夜久久久| 精品制服美女丁香| 樱桃视频在线观看一区| 久久综合九色综合欧美就去吻| 色综合色综合色综合| 精品一区久久久久久| 99久久免费精品| 奇米影视7777精品一区二区| 一区二区三区精品视频在线| 精品乱人伦小说| 欧美视频一区二区三区四区|