基于uCOSII的CAN驅(qū)動程序設(shè)計_第1頁
基于uCOSII的CAN驅(qū)動程序設(shè)計_第2頁
基于uCOSII的CAN驅(qū)動程序設(shè)計_第3頁
基于uCOSII的CAN驅(qū)動程序設(shè)計_第4頁
基于uCOSII的CAN驅(qū)動程序設(shè)計_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、基于uC/OS-II的CAN驅(qū)動程序設(shè)計 成進(jìn) 施國梁 摘要:實時性是衡量CAN現(xiàn)場總線系統(tǒng)性能的一個重要標(biāo)準(zhǔn)。本文提出了一種采用uC/OS-II并結(jié)合I-CAN協(xié)議在應(yīng)用層面上提高CAN總線系統(tǒng)實時性的驅(qū)動程序設(shè)計方案,并以分層的方式逐層闡述CAN驅(qū)動程序的設(shè)計過程。關(guān)鍵字:CAN總線,uC/OS-II,實時性,驅(qū)動程序CAN-Driver Design Based on uC / OS-II Cheng Jin Shi Guoliang(College of Electronic and Information,Soochow University,Suzhou 215006) Abstr

2、act: Real-time is an important standard of measuring the performance of CAN field bus system. This paper presents a can driver design by using uC / OS-II in combination with I-CAN protocol which improve the real-time of CAN bus system at the application level, and describes CAN driver design process

3、 layer by layered approach described in hierarchical way.Keywords: can bus; uC/OS-II; real-tine; drivers引 言CAN-BUS是德國Bosch公司于1983年為汽車應(yīng)用而開發(fā)的一種能有效支持分布式控制實時控制的串行通信網(wǎng)絡(luò),屬于現(xiàn)場總線的范疇。通信距離與波特率有關(guān),最大通信距離可達(dá)10Km,最大通信波特率可達(dá)1Mbps。CAN總線仲裁用11位(CAN2.0A協(xié)議)和29位(CAN2.0B協(xié)議)標(biāo)志和非破壞性仲裁總線結(jié)構(gòu)機(jī)制,可以確定數(shù)據(jù)塊的優(yōu)先級,保證在網(wǎng)絡(luò)節(jié)點沖突時最高優(yōu)先級節(jié)點不需要沖突等

4、待。CAN總線上任何節(jié)點可在任意時刻主動向網(wǎng)絡(luò)上其他節(jié)點發(fā)送信息而不分主次,因此可實現(xiàn)各節(jié)點之間的自由通信。目前,CAN總線協(xié)議已被國際標(biāo)準(zhǔn)化組織認(rèn)證,技術(shù)比較成熟,已被大量應(yīng)用于汽車、工業(yè)環(huán)境、高速網(wǎng)絡(luò)和低價位多路連線的應(yīng)用中。uC/OS-II是Jean J.Labrosse開發(fā)的一種小型的嵌入式操作系統(tǒng),它實質(zhì)上是基于優(yōu)先級的可剝奪型內(nèi)核,系統(tǒng)中的所有任務(wù)都有一個唯一的優(yōu)先級別,它適合應(yīng)用在實時性要求較強(qiáng)的場合。正是由于uC/OS-II的這些特點,筆者采用它來設(shè)計CAN的驅(qū)動程序以滿足系統(tǒng)的實時要求。1 CAN節(jié)點的硬件設(shè)計CAN節(jié)點是分布在CAN網(wǎng)絡(luò)進(jìn)行相互通信的基本單元。它主要有主控制

5、器、CAN控制器和CAN收發(fā)器組成。本設(shè)計的節(jié)點結(jié)構(gòu)如圖1所示。 圖1 CAN節(jié)點基本結(jié)構(gòu)框圖 CAN節(jié)點采用NXP公司的LPC2368作為主控制器。LPC2368是一款基于ARM7 TDMI-S內(nèi)核的RISC處理器,它包含兩個兼容CAN2.0B規(guī)范的CAN控制器。每個CAN控制器擁有雙重接收緩沖器和三態(tài)發(fā)送緩沖器,快速的硬件實現(xiàn)的搜索算法,支持大量的CAN標(biāo)識符。在電壓兼容方面,由于LPC2368是一款3.3V器件,雖然其對應(yīng)的CAN收發(fā)器接口引腳能夠承受5V電壓,但為了讓CAN節(jié)點能夠更穩(wěn)定得運(yùn)行,這里采用TI公司的3.3伏CAN收發(fā)器SN65HVD230D與之配合使用。SN65HVD23

6、0D的高輸入阻抗特性可以在一條總線上支持多達(dá)120個CAN節(jié)點,并且能夠和5V的CAN收發(fā)器良好地兼容。由于硬件設(shè)計不是本文的重點,所以這里不再詳述。下面將詳細(xì)介紹CAN驅(qū)動程序的設(shè)計。2 CAN驅(qū)動程序設(shè)計總體思想 為了使軟件可移植性強(qiáng)、易維護(hù),采用分層的方法編寫CAN驅(qū)動程序。驅(qū)動程序分層結(jié)構(gòu)見圖2。圖2 驅(qū)動程序分層結(jié)構(gòu)圖雙向線表示實時操作系統(tǒng)uC/OS-II與CAN驅(qū)動程序之間的數(shù)據(jù)交換。單向箭頭表示上層軟件對下層軟件的調(diào)用。這樣的驅(qū)動程序結(jié)構(gòu)分明,可讀性強(qiáng)且易于維護(hù)。下面將從下往上分析各層軟件的設(shè)計和實現(xiàn)方法。3 CAN設(shè)備控制層和接口控制層CAN設(shè)備控制層主要任務(wù)是:初始化主控制器

7、與CAN控制器之間的連接配置、復(fù)位CAN控制器、建立主控制器和CAN控制器之間的通信函數(shù)。由于LPC2368內(nèi)部集成了CAN控制器,CPU通過內(nèi)部APB總線接口能夠?qū)AN控制器的所有寄存器進(jìn)行訪問,所以不再需要編寫設(shè)備控制驅(qū)動層程序,已經(jīng)完全由硬件實現(xiàn)了。CAN接口控制層主要任務(wù)是實現(xiàn)CAN控制器的各種功能。如設(shè)置控制模式、發(fā)送數(shù)據(jù)、釋放接收緩沖區(qū)、配置驗收濾波器等等。這些操作都是通過對CAN控制器的內(nèi)部相關(guān)寄存器的讀寫來實現(xiàn)。程序清單3.1展示的是應(yīng)用層中實現(xiàn)CAN控制器初始化操作的程序,內(nèi)部調(diào)用的函數(shù)都是在這一層中進(jìn)行編寫。 程序清單3.1 CAN初始化程序void CAN20B_Ini

8、t() #if CAN1_EN > 0while(CAN1MOD & CAN_MOD_RM)!=1) CAN1_MOD_RM (); /進(jìn)入復(fù)位模式CAN1_BTR (); /配置總線定時寄存器 ID_RAM (); /配置驗收濾波器 while(CAN2MOD & CAN_MOD_NM)!=1) CAN1_MOD_NM_SET(); /進(jìn)入正常模式CAN1_INT_EN (); /中斷使能寄存器設(shè)置 #endif 為了使程序更加簡潔,可讀性強(qiáng),一般可以通過宏定義的形式進(jìn)行編寫。例如:#define CAN_MOD_RM () CAN1MOD |= 1,CAN1MOD是C

9、AN控制器的模式寄存器,對它的最低位置1使CAN控制器進(jìn)入復(fù)位模式,這種模式下可以對控制器的所有寄存器進(jìn)行寫操作。其他的對于CAN控制器內(nèi)部寄存器的操作可以參照LPC2368的技術(shù)手冊,這里不再詳述。4 CAN協(xié)議層 從OSI網(wǎng)絡(luò)模型的角度來看,現(xiàn)場總線網(wǎng)絡(luò)一般實現(xiàn)了第1層(物理層)、第2層(數(shù)據(jù)鏈路層)、第7層(應(yīng)用層)。而CAN現(xiàn)場總線僅僅定義了第1層、第2層,這兩層分別由CAN收發(fā)器和CAN控制器實現(xiàn)。CAN沒有規(guī)定應(yīng)用層,本身并不完整,需要一個高層協(xié)議來定義CAN報文中的11/29位標(biāo)識符、8字節(jié)的使用。目前已經(jīng)存在一些國際上標(biāo)準(zhǔn)的CAN-BUS高層協(xié)議,例如DeviceNet協(xié)議和C

10、ANopen協(xié)議。但是這個協(xié)議規(guī)范比較復(fù)雜,理解和開發(fā)難度都比較大,對于一些并不復(fù)雜的基于CAN總線的控制網(wǎng)絡(luò)不太適合。本設(shè)計采用國內(nèi)周立功CAN開發(fā)組織根據(jù)實際應(yīng)用制定的一簡單的CAN應(yīng)用層協(xié)議I-CAN協(xié)議作為軟件設(shè)計的CAN協(xié)議層。I-CAN協(xié)議中的29位幀標(biāo)識符定義如表4.1所示。位 符號功能描述28:21SrcMACID(源節(jié)點編號)發(fā)送節(jié)點的編號20:13DestMACID(目標(biāo)節(jié)點編號)接收節(jié)點的編號12:5FUNC ID(功能碼)指示報文的功能4:0SourceID(資源節(jié)點編號)指示操作設(shè)備內(nèi)部單元 表4.1 I-CAN協(xié)議中的標(biāo)識符定義CAN總線仲裁是從標(biāo)識符的最高位(28

11、位)開始逐位進(jìn)行。每一個發(fā)送器都對發(fā)送位的電平與被監(jiān)控的總線電平進(jìn)行比較。如果電平相同,則這個單元可以繼續(xù)發(fā)送。如果發(fā)送的是“隱性”(邏輯1)電平而監(jiān)控到為“顯性”(邏輯0)電平時,那么該單元就失去了仲裁,必須退出發(fā)送狀態(tài)。再根據(jù)I-CAN源節(jié)點編號部分可以看出,節(jié)點的地址編號越小優(yōu)先級也就越高,在仲裁時能夠優(yōu)先獲得總線使用權(quán)。在CAN網(wǎng)絡(luò)系統(tǒng)中越重要的節(jié)點應(yīng)該分配優(yōu)先級越高的地址編號,譬如車載網(wǎng)絡(luò)中的發(fā)動機(jī)電控單元就應(yīng)該比定向大燈電控單元的優(yōu)先級高,這樣才能保證重要的報文及時傳送出去。在節(jié)點接受到報文之后,應(yīng)用程序依據(jù)I-CAN協(xié)議解析報文標(biāo)識符并實現(xiàn)其指定的功能。 5 應(yīng)用層應(yīng)用層實現(xiàn)CA

12、N控制器的所有功能。CAN設(shè)備控制驅(qū)動層、CAN接口驅(qū)動層和CAN協(xié)議層都在應(yīng)用層的控制之中。應(yīng)用層主要實現(xiàn)的任務(wù)包括:(1)初始化CAN控制器以及初始化應(yīng)用層相關(guān)的全局變量。(2)編寫CAN控制器的中斷服務(wù)程序。(3)報文處理任務(wù)。該任務(wù)基于I-CAN協(xié)議來解析報文,并實現(xiàn)報文指示的功能。(3)報文發(fā)送任務(wù)。該任務(wù)存儲未能發(fā)送的報文,并在發(fā)送緩沖區(qū)可用的情況下自動發(fā)送報文。初始化CAN控制器的程序可以參照程序清單3.1,這里不再詳述。但是由于初始化CAN控制器直接和CAN物理層及鏈路層的性能掛鉤,必須要依據(jù)具體應(yīng)用環(huán)境正確地配置CAN控制器才能使系統(tǒng)穩(wěn)定地運(yùn)行。5.1 中斷服務(wù)程序中斷服務(wù)程

13、序判斷CAN控制器的中斷類型,作出相應(yīng)的響應(yīng)。其函數(shù)見程序清單5.1。程序清單5.1 中斷服務(wù)程序void CAN1_ISR() INT32U can1_i_st; VICVectAddr =0x0; /更新VIC優(yōu)先級硬件OSIntEnter(); can1_i_st = CAN1ICR; /讀中斷和捕獲寄存器if (can1_i_st!=0)if(can1_i_st&CAN_RI) /接受中斷 CAN1_RI_HANDLE(); if(can1_i_st&CAN_TI1) /發(fā)送中斷1 if(TX_CNT>0)OSSemPost(CAN_TX_OVER);if(can

14、1_i_st&CAN_TI2) /發(fā)送中斷2 if(TX_CNT>0) OSSemPost(CAN_TX_OVER;if(can1_i_st&CAN_TI3) /發(fā)送中斷3if(TX_CNT>0) OSSemPost(CAN_TX_OVER);if(can1_i_st&CAN_BEI) /總線錯誤中斷 CAN1_BEI_HANDLE(); OSIntExit(); /中斷級任務(wù)切換這里只對接受中斷發(fā)送中斷以及總線錯誤中斷進(jìn)行闡述,其他類型的CAN中斷處理應(yīng)根據(jù)具體系統(tǒng)進(jìn)行針對性設(shè)計,不具有通用性。CAN1_RI_HANDLE()負(fù)責(zé)接收報文,并將報文發(fā)送到任

15、務(wù)的消息隊列中。其代碼如程序清單5.2所示。程序清單5.2 接受中斷處理函數(shù)void CAN1_RI_HANDLE() RI_DATA.FRAME = CAN1RFS;RI_DATA.ID = CAN1RID;RI_DATA.DataA = CAN1RDA;RI_DATA.DataB = CAN1RDB;OSQPost(CAN1_Q_RX,&RI_DATA); /向消息隊列發(fā)送消息CAN1_COMMAND_RRB(); /釋放接收緩沖區(qū) 其中RI_DATA為定義的結(jié)構(gòu)體CAN_MSG變量,CAN_MSG結(jié)構(gòu)如程序清單5.3所示。CAN1RFS、CAN1RID、CAN1RDA和CAN1R

16、DB分別為CAN控制器存儲接收報文幀信息、標(biāo)識符、數(shù)據(jù)字節(jié)的寄存器。程序清單5.3 CAN_MSG結(jié)構(gòu)體struct CAN_MSGINT32U FRAME; /存放報文幀信息INT32U ID; /存放報文標(biāo)識符INT32U DataA; /存放報文前4個字節(jié)數(shù)據(jù)INT32U DataB; /存放報文后4個字節(jié)數(shù)據(jù); 當(dāng)發(fā)送中斷處理函數(shù)通過TX_CNT判斷出報文發(fā)送函數(shù)(程序清單5.4所示)的消息隊列中有待發(fā)送報文時,通過函數(shù)OSSemPost(CAN_TX_OVER)向其發(fā)送信號量,通知其可以發(fā)送報文了。若TX_CNT為0,說明消息隊列中沒有待發(fā)送的報文,則不發(fā)送信號量。CAN1_BEI_

17、HANDLE()通過查詢中斷和捕獲寄存器判斷是何種錯誤類型,并將它記錄下來便于系統(tǒng)診斷。由于CAN1_RI_HANDLE()和OSSemPost()都可能就緒等待中的任務(wù),所以為了保證系統(tǒng)能夠嚴(yán)格按照優(yōu)先級來執(zhí)行任務(wù),程序采用OSIntExit()函數(shù)進(jìn)行中斷級任務(wù)切換,在執(zhí)行完中斷服務(wù)程序后運(yùn)行一個具有最高級別的任務(wù)而不是返回被中斷的任務(wù)。關(guān)于接受中斷處理函數(shù)和發(fā)送中斷處理函數(shù)將在下面內(nèi)容中進(jìn)一步進(jìn)行闡述。5.2 應(yīng)用層面臨的問題及解決方法下面將結(jié)合應(yīng)用層面臨的實際問題對報文處理和報文發(fā)送函數(shù)進(jìn)行詳細(xì)闡述。(1)CAN節(jié)點將CAN中斷設(shè)為FIQ中斷,而其他中斷設(shè)為不同優(yōu)先級的IRQ中斷,由于

18、FIQ中斷能夠打斷IRQ中斷,所以節(jié)點在任何情況下都能盡快地響應(yīng)CAN中斷,以提高系統(tǒng)的實時性。但是編寫的CAN中斷服務(wù)程序應(yīng)該越短越好,在不影響系統(tǒng)性能的情況下盡量將中斷服務(wù)任務(wù)放到中斷服務(wù)程序外執(zhí)行,從而盡早得退出FIQ中斷模式,以使節(jié)點能夠響應(yīng)新的中斷,減少系統(tǒng)中的中斷延時。其中的接收中斷處理是最占用節(jié)點資源的,它不僅需要根據(jù)I-CAN協(xié)議對報文進(jìn)行解析,還需要執(zhí)行報文指定的功能,所以必須放到中斷服務(wù)程序外執(zhí)行。解決的辦法通過uC/OS-II中的OSTaskCreate()函數(shù)建立一個報文處理任務(wù),這個任務(wù)由一個請求消息隊列函數(shù)OSQPend()和一個報文解析處理函數(shù)組成。其示意代碼如下

19、所示:程序示意代碼5.1 報文處理函數(shù)void CAN_RMSG_HANDLE(void* ptmr)ptmr = ptmr;for( ; ; )OSQPend(CAN1_Q_RX,0,&CAN_Q_ERROR);根據(jù)I-CAN協(xié)議解析報文完成報文制定功能。若需要發(fā)送CAN報文,先查詢是否有可用的發(fā)送緩沖區(qū),若都被鎖定,則調(diào)用OSQPost()將報文發(fā)送到程序清單5.4所示函數(shù)的消息隊列MESSAGE_TX中并且執(zhí)行TX_CNT+操作,若有可用的發(fā)送緩沖區(qū)則直接發(fā)送;這里需要注意的是有任務(wù)需要發(fā)送報文時應(yīng)該先查詢發(fā)送緩沖區(qū)狀態(tài),若有發(fā)送緩沖區(qū)可用就直接發(fā)送,無須通過消息隊列作為中介發(fā)送

20、,這樣可以提高程序運(yùn)行效率。變量TX_CNT記錄MESSAGE_TX中的報文數(shù)目,任務(wù)向MESSAGE_TX發(fā)送一個報文,TX_CNT就加1,報文發(fā)送函數(shù)(見程序清單5.4)成功發(fā)送一個報文,TX_CNT就減1。這樣的話中斷服務(wù)程序(程序清單5.1)就可以根據(jù)TX_CNT來判斷是否有向 CAN_TX_OVER發(fā)送信號量的必要。這樣的細(xì)節(jié)處理可以減少程序不必要的冗余操作。(2)在繁忙的CAN網(wǎng)絡(luò)中,節(jié)點由于仲裁丟失不能及時將數(shù)據(jù)傳輸,必須要對代發(fā)送的數(shù)據(jù)進(jìn)行進(jìn)行存儲,等待節(jié)點獲得總線使用權(quán)的時候再發(fā)送出去。LPC2368的CAN控制器有一個三態(tài)發(fā)送緩沖區(qū),最多能夠存儲三個報文。但是若三個緩沖區(qū)都

21、處于鎖定狀態(tài)(報文正在等待發(fā)送或正處于發(fā)送過程),又有一個報文需要發(fā)送時,則需要額外的緩沖區(qū)先將它進(jìn)行存儲,以待節(jié)點獲得總線使用權(quán)時再發(fā)送。這里通過定義一指針數(shù)組,然后把建立的消息數(shù)據(jù)緩沖區(qū)的首地址存入這個數(shù)組中,然后再調(diào)用OSQCreate()函數(shù)來創(chuàng)建一個用于存儲發(fā)送報文的消息隊列MESSAGE_TX,最后通過OSTaskCreate()函數(shù)建立一個負(fù)責(zé)發(fā)送報文的任務(wù)。這個任務(wù)由一個請求消息隊列函數(shù)OSQPend()和一個請求信號量函數(shù)OSSemPend()組成。該任務(wù)函數(shù)如程序清單5.4所示。程序清單5.4 報文發(fā)送函數(shù)void CAN_MESSAGE_SEND(void* ptmr )

22、ptmr = ptmr;for( ; ; )S = OSQPend(MESSAGE_TX , 0 , & Q_ERROR);OSSemPend(CAN_TX_OVER , 0 , &SEM_ERROR);OS_ENTER_CRITICAL( ); /進(jìn)入臨界代碼區(qū)SEND_TX_BUFFER( S );TX_CNT-; OS_EXIT_CRITICAL( );除非在CAN節(jié)點任務(wù)中有比將處理好的CAN報文發(fā)送出去更重要的任務(wù)要做, 一般來講,報文發(fā)送任務(wù)在節(jié)點任務(wù)中應(yīng)該具有最高的優(yōu)先級,這樣才能保證CAN系統(tǒng)的實時性。 (3)LPC2368的最高運(yùn)行速率可達(dá)72MHz,而CAN

23、最高傳輸速率最高傳輸速率為1Mbit/s,一般情況下,即使連續(xù)接收到兩個報文,CPU也完全有能力在接受完第二個報文前將第一個報文處理完畢。所以這種情況下只需要建立一個報文處理任務(wù)就足夠了。但是對于要完成較復(fù)雜任務(wù)的節(jié)點,譬如車載網(wǎng)絡(luò)中的中央控制部件(BSI)來講, 在全CAN車載網(wǎng)絡(luò)中,它連接了內(nèi)部網(wǎng)、車身網(wǎng)和舒適網(wǎng)三個網(wǎng)絡(luò)。作為汽車車載網(wǎng)絡(luò)系統(tǒng)中樞,BSI任務(wù)繁重,對CAN報文的處理經(jīng)常會被各種中斷和內(nèi)部任務(wù)打斷,所以不能保證可以及時處理上一次接收的CAN報文。并且由于消息隊列是采取先進(jìn)先出(FIFO)或者后進(jìn)先出(LIFO)的方式來組織報文的,當(dāng)積消息隊列中積攢多個還沒處理的報文時無法先取出優(yōu)先級最高的報文進(jìn)行處理。為了能夠優(yōu)先處理重要設(shè)備發(fā)送過來的報文,必須針對系統(tǒng)中每個與本節(jié)點有進(jìn)行CAN通信關(guān)系的節(jié)點建立一個獨立的報文處理任務(wù),這個任務(wù)包含一個獨立的消息隊列,并且發(fā)送報文的節(jié)點優(yōu)先級越高,這個任務(wù)設(shè)置的優(yōu)先級也應(yīng)該越高。為此程序清單5.2所示的CAN1_RI_HANDLE()函數(shù)也應(yīng)該做出相應(yīng)的修改,修改之后的程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論