基于WinCE環(huán)境的CAN適配卡驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)
3.2 CAN_Read模塊的實(shí)現(xiàn)
如果CAN接收到一個(gè)報(bào)文,該報(bào)文通過驗(yàn)收濾波器驗(yàn)收并放入接收FIFO,則產(chǎn)生一個(gè)接收中斷。中斷服務(wù)程序接收到這個(gè)中斷后,將這個(gè)接收到的報(bào)文傳送到由驅(qū)動(dòng)程序維護(hù)的報(bào)文存儲(chǔ)區(qū)中,并置位命令寄存器的釋放緩存區(qū)標(biāo)志RRB。CAN_Read函數(shù)并不等待來自CAN控制器的接收?qǐng)?bào)文成功中斷,而是讀取保存在由驅(qū)動(dòng)程序維護(hù)的報(bào)文存儲(chǔ)區(qū)中的報(bào)文。CAN_Read函數(shù)的流程圖如圖4所示。
圖4 CAN_Read函數(shù)的流程圖
3.3中斷服務(wù)線程模塊的實(shí)現(xiàn)
在CAN適配卡的SJA1000控制器中,報(bào)文的發(fā)送與接受是采用中斷方式來完成的。以報(bào)文的中斷發(fā)送為例,在向CAN數(shù)據(jù)寄存器中寫入報(bào)文并且向命令寄存器寫入發(fā)送命令后,系統(tǒng)通過調(diào)用WaitForSingleObject函數(shù)將當(dāng)前的發(fā)送線程掛起在某個(gè)事件的任務(wù)隊(duì)列中,觸發(fā)該事件將會(huì)使系統(tǒng)調(diào)度掛起在該事件的任務(wù)隊(duì)列中的任務(wù)繼續(xù)執(zhí)行,而該事件只有在CAN控制器產(chǎn)生發(fā)送成功中斷后在中斷服務(wù)線程中觸發(fā)。中斷服務(wù)線程程序流程圖如圖5所示。
圖5 中斷服務(wù)線程程序流程圖
驅(qū)動(dòng)程序中的另外兩個(gè)模塊主要由CAN_Close 、CAN_IoControl函數(shù)來完成,前者主要負(fù)責(zé)在關(guān)閉CAN句柄時(shí)資源的回收任務(wù),后者主要用于設(shè)置CAN的工作參數(shù),如波特率,報(bào)文格式等,在此不作過多介紹。
4 結(jié)束語
本文的CAN適配卡驅(qū)動(dòng)程序的開發(fā)環(huán)境:上位機(jī)是普通的PC機(jī),下位機(jī)的操作系統(tǒng)是WinCE,硬件是深圳藍(lán)天工控有限公司的嵌入式PC/104總線主板PCM3568。驅(qū)動(dòng)程序已經(jīng)過測(cè)試、驗(yàn)收。CAN適配卡驅(qū)動(dòng)程序運(yùn)行可靠、通信穩(wěn)定。產(chǎn)品已經(jīng)被多個(gè)產(chǎn)家應(yīng)用于實(shí)際的工業(yè)控制領(lǐng)域。
參考文獻(xiàn)
[1] 李蒙 Windows CE驅(qū)動(dòng)程序開發(fā)[J] 計(jì)算機(jī)工程與設(shè)計(jì),2004
[2] 徐平 WindowsCE.Net下CAN卡的驅(qū)動(dòng)程序設(shè)計(jì)[J] 單片機(jī)及嵌入式系統(tǒng)應(yīng)用 2004-12
[3] 鄔寬明.CAN總線原理和應(yīng)用系統(tǒng)設(shè)計(jì)[M]. 北京航空航天大學(xué)出版社,1996
[4] 繞運(yùn)濤 現(xiàn)場(chǎng)總線CAN原理與應(yīng)用技術(shù)[M] 北京航空航天大學(xué)出版社,2002
[5] 孫光武 現(xiàn)場(chǎng)總線適配器的軟硬件設(shè)計(jì)[J] 電子技術(shù)應(yīng)用 1999.8
評(píng)論