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

Rss & SiteMap

曙海教育集團論壇 http://www.bjzhda.cn

曙海教育集團論壇
共2 條記錄, 每頁顯示 10 條, 頁簽: [1]
[瀏覽完整版]

標題:主要討論在WinCE設計和開發C...WindowsCE.Net下CAN卡的驅動程序設計31028

1樓
wangxinxin 發表于:2010-11-16 14:31:36
3、4、5、6、7、9、10、11、12、15,同時1000V的光電隔離提供系統高可靠性。在CAN卡通信中,要用到CAN控制器中的很多寄存器,各個寄存器的含義和作用可以參考控制芯片的說明書。圖1列出驅動程序設計中用到最主要的寄存器結構。

2 CAN卡驅動底層函數設計

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

2.1 CAN卡寄存器讀寫函數

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

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

{

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

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

{

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

}

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

2.2 CAN卡初始化

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

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

第二卡,設置CAN卡默認參數:

CanCardConfigInfo CAN_DEFAULT_SETTING=

{0X00,0XFF,0X03,0X1C};/*設置默認波特率為125Kbps*/

DWORD dwThreadID =0;

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

第三卡,用WinCE API函數LocalAlloc為CAN卡驅動中用到的數據結構分配緩沖區;通過HalTranslateBusAddress和MmMapIoSpace函數映射I/O地址,提供直接訪問設備的虛擬地址:

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;

如果分配內存或映射邏輯地址失敗,則退出初始化程序,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[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);/*將數據暫存到臨時緩沖區*/

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

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

BYTE byV =recvBuf[1];

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

LpMsg->bRTR =byV &0x10?TRUE:/*返回RTR狀態*/

LpMsg->dwMessageLen = byV &0XF; /*返回數據長度*/

……

}

else

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

::LeaveCriticalSection(&hCan->lpCanHWInfo->

ReceiveCritSec); /*離開臨界區*/

Return bSuc;

}

2.5 CAN卡事件處理

CAN卡事件處理函數是CAN卡驅動程序中很重要的部分。驅動設計要求具有消息通知的功能,當事件發生時及時捕獲事件并進行消息處理。

下面是事件處理函數的實現:

staric DWORD WINAPI CAN_EventHanle(LPVOID lpParam)

{

ASSERT(lpParam);

LPCAN_HW_OPEN_INFO hCan=(LPCAN_HW_OPEN_INFO)lpParam;

CanCardMessageBuf bufMsg;

while(TEUE)

{ /*循環等待CAN卡消息產生,然后進行處理*/

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

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

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

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

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

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

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

} /*本次中斷結束,等待下次中斷*/

return 0;

}

2.6 其它函數

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

3 CAN卡驅動封裝設計

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

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

*CanCloseFile;關閉由CanOpenFile打開的CAN卡端口。

*CanRecvMsg;接收CAN卡數據,打開CAN卡時必須具有GENERIC_READ權限。

*CanSendMsg;通過CAN卡發送數據。打開CAN卡時必須具有GENERIC_WRITE權限。

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

下面是CanSendMsg函數實現的代碼:

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);

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

結語

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

本文設計開發的驅動已經在北京懷柔的變電站項目中得到成功的應用,CAN卡通信穩定,系統在WINCE.NET下運行可靠,保證了項目的順利實施。

共2 條記錄, 每頁顯示 10 條, 頁簽: [1]

Copyright © 2000 - 2009 曙海教育集團
Powered By 曙海教育集團 Version 2.2
Processed in .03125 s, 2 queries.
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
精品va天堂亚洲国产| 亚洲大片一区二区三区| 中文字幕在线视频一区| 日本特黄久久久高潮| 91麻豆免费看片| 欧美在线观看你懂的| 中文字幕一区二区视频| 成人免费视频视频在线观看免费 | 美国av一区二区三区| 日韩欧美专区在线| 日韩av中文在线观看| 久久riav二区三区| 国产亚洲欧美激情| 国产·精品毛片| 欧美亚洲日本国产| 亚洲大型综合色站| 女同一区二区| 亚洲欧洲av在线| yy111111少妇影院日韩夜片 | 亚洲风情在线资源站| 成人91视频| 久久久久久久性| 成人综合婷婷国产精品久久免费| 欧美视频日韩视频| 奇米影视一区二区三区| 亚洲精品成人久久久998| 亚洲人妖av一区二区| www.成人三级视频| 久久免费看少妇高潮| 国产suv一区二区三区88区| 欧美午夜精品一区二区蜜桃| 丝袜诱惑制服诱惑色一区在线观看| 欧美成人第一区| 有坂深雪av一区二区精品| 久久久婷婷一区二区三区不卡| 亚洲国产精品成人综合色在线婷婷| k8久久久一区二区三区 | 久久久.com| 成a人片国产精品| 日韩视频123| 成人国产视频在线观看| 精品国产一区二区三区忘忧草| 国产v综合v亚洲欧| 日韩欧美国产综合| 成人av免费观看| 欧美精品一区二区三区蜜桃| 99国产精品久久久久久久久久| 精品电影一区二区| 91视频在线观看免费| 久久精品欧美一区二区三区麻豆 | 91黄色免费观看| 日韩精品1区2区3区| 欧美在线看片a免费观看| 久久精品二区亚洲w码| 欧美日韩国产电影| 国产成人av电影在线观看| 精品久久久久久久久久久久久久久久久 | 四虎影院一区二区三区| 亚洲一级二级在线| 色婷婷久久久综合中文字幕| 精品一区二区在线免费观看| 欧美一级日韩免费不卡| av欧美精品.com| 中文字幕欧美一区| 日韩国产美国| 精品一区免费av| 精品国产乱码久久久久久免费| 国产精品国产一区二区| 一区二区免费在线| 在线观看日韩高清av| 国产iv一区二区三区| 国产女人18毛片水真多成人如厕 | 99高清视频有精品视频| 中文字幕亚洲成人| 亚洲在线视频一区二区| 国内精品免费在线观看| 久久精品网站免费观看| 欧美一区二区三区四区五区六区| 亚洲成人一区在线| 538在线一区二区精品国产| 91网站在线播放| 亚洲综合丁香婷婷六月香| 欧美伊人久久久久久午夜久久久久| 国产成人无遮挡在线视频| 国产精品日日摸夜夜摸av| 一区二区在线观看网站| 高清成人免费视频| 亚洲三级电影全部在线观看高清| 色婷婷久久综合| av欧美精品.com| 亚洲国产色一区| 欧美成人艳星乳罩| 欧美性bbwbbwbbwhd| 国产一区高清在线| 国产精品美日韩| 欧美亚洲一区二区三区四区| 99国精产品一二二线| 亚洲mv在线观看| 久久一日本道色综合| 丝袜美腿玉足3d专区一区| 国产成人综合精品三级| 亚洲女性喷水在线观看一区| 欧美日韩一区二区三区四区| 国产一区二区三区无遮挡| 久久99精品久久久久久国产越南 | 日韩一区二区三区av| 好看的日韩精品| 精品亚洲免费视频| 综合久久综合久久| 欧美一区二区三区视频免费播放 | 久久色.com| 一本高清dvd不卡在线观看| 99精品视频在线观看| 日本中文字幕一区二区视频| 日本一区二区三区四区在线视频| 一本大道久久a久久精品综合| 91麻豆国产香蕉久久精品| 美日韩一区二区| **欧美大码日韩| 日韩美一区二区三区| 一区二区精品在线| 波多野结衣久草一区| 国产另类ts人妖一区二区| 亚洲图片欧美综合| 日本一二三不卡| 日韩免费福利电影在线观看| 在线观看日韩电影| 日本一区二区三区视频在线播放| 97精品久久久午夜一区二区三区| 午夜视频一区二区| 中文字幕亚洲在| 久久午夜电影网| 91精品国产一区二区| 亚洲一区在线直播| 麻豆传媒一区| 国产精品美女诱惑| 成人免费毛片a| 久久av老司机精品网站导航| 亚洲成人动漫一区| 中文字幕在线一区免费| 久久久久久亚洲综合影院红桃| 7777精品伊人久久久大香线蕉的| 色婷婷亚洲精品| 亚洲精品国产精品久久| 国产伦精品一区二区三区视频免费| 成人午夜激情视频| 国产一区在线不卡| 麻豆91在线播放免费| 天天做天天摸天天爽国产一区 | 麻豆成人av| 99re热精品| 99re热视频精品| www.在线欧美| 成人黄色在线看| 国产99精品国产| 国产91精品在线观看| 国产精一区二区三区| 久久www免费人成看片高清| 免费日韩伦理电影| 日韩1区2区日韩1区2区| 午夜精品福利在线| 亚洲大片在线观看| 亚洲成人精品在线观看| 亚洲午夜久久久久久久久电影网| 亚洲欧美国产三级| 夜夜操天天操亚洲| 一区二区成人在线| 亚洲成在人线免费| 午夜私人影院久久久久| 日韩高清一区二区| 蜜臀a∨国产成人精品| 久久精品99久久久| 国产精品一区不卡| 成人一区二区三区在线观看| 成人av网站免费| 999精品在线观看| 国产综合av一区二区三区| 欧美日韩日本网| 中文字幕不卡每日更新1区2区| 色呦呦网站一区| 在线不卡中文字幕| 精品动漫一区二区三区在线观看| 国产亚洲短视频| 亚洲天堂2014| 亚洲成av人片www| 免费在线观看一区二区三区| 国产一区二区三区免费在线观看| 成人免费高清在线| 国产精品亚洲一区| 日韩精品一区二区三区色偷偷| 亚洲国产一区二区三区在线播| 在线日韩av片| 欧美一区午夜视频在线观看| 国产亚洲欧洲一区高清在线观看| 亚洲人成影院在线观看| 日韩av中文在线观看| 国产麻豆91精品| 91精品黄色| 日韩三级电影免费观看| 欧美色手机在线观看|