宋富強++熊武++馮宇飛++彭思苑++黃海波
摘要:飛思卡爾MC9S12(X)單片機的控制器局域網(wǎng)(MSCAN)是一種通信控制器,介紹基于使用該單片機的MSCAN模塊構(gòu)建小型網(wǎng)絡(luò)的研究,實現(xiàn)三塊單片機的實時交互通信。三塊單片機包括一塊主控制器和兩塊輔控制器,系統(tǒng)將兩塊輔控制器掛在主控制器的CAN總線上,與主控制器進行數(shù)據(jù)交換。其中,數(shù)據(jù)包括采集的環(huán)境溫度和用電壓模擬的車速。
關(guān)鍵詞:MC9S12(X);CAN總線;通信
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2016)20-0210-03
CAN全稱為Controller Area Network,即控制器局域網(wǎng),是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。最初,CAN是由德國的Bosch公司提出,被設(shè)計為汽車環(huán)境中的微控制器通信,在車載各電子控制裝置ECU之間交換信息,形成汽車電子控制網(wǎng)絡(luò)。本文按照CAN總線協(xié)議設(shè)計了一個小型的CAN總線網(wǎng)絡(luò),正文從硬件設(shè)計和軟件流程來進行闡述。
1 硬件電路設(shè)計
1.1 CAN接口電路
本文采用TJA1050作為CAN總線的接口芯片,它是一種標準的高速CAN收發(fā)器,可以為總線提供差動發(fā)送性能和為CAN控制器提供差動接收性能。
TJA1050的3引腳和2引腳分別為電源的正極和負極,連接5V電源和地。1引腳和4引腳為CAN模塊的發(fā)送和接收引腳,分別用于從CAN總線控制器中輸入發(fā)送到總線上的數(shù)據(jù)和將從總線接收的數(shù)據(jù)發(fā)送給CAN總線控制器,連接單片機的PM1和PM0引腳。7引腳和6引腳連接到CAN總線的CANH和CANL線上,信號使用差分電壓傳送,因此兩條信號線被稱為CAN_L和CAN_H。8引腳是工作模式選定引腳,該CAN接口芯片一共有高速、斜率控制和待機3種工作模式,把該引腳直接接地可選擇高速工作模式。在總線接口部分還要接一個120歐姆的匹配電阻。J_CAN是與CAN總線連接的接口。CAN總線接口電路見圖1:
1.2 電源模塊
電源模塊采用LM2940穩(wěn)壓芯片,將電壓從12V穩(wěn)到5V。原理圖中C11、C12、C13、C14、C15、C16分別為濾波電容,F(xiàn)11為濾波電感,D12是電源指示燈,防止指示燈被燒,串聯(lián)一個1K的電阻。其中PAD02接MC9S12(X)單片機的71引腳PAD02,采用固定電壓的AD轉(zhuǎn)換輸入。電源模塊電路圖見圖2:
1.3 AD采集電路
本文所設(shè)計的CAN小型網(wǎng)絡(luò)只用到兩路AD采集。因此電路圖中PAD00和PAD01分別接MC9S12(X)單片機的67腳和69腳,R44和R47采用1K的電阻,而R43和R46采用10K的電位器來進行分壓調(diào)節(jié)。AD采集電路見圖3:
1.4 溫度傳感器模塊
設(shè)計中,我們用的溫度傳感器是DS18B20。用DS18B20有以下幾個優(yōu)點:①獨特的單線接口方式,只需一個接口引腳即可通信;②可用數(shù)據(jù)線供電,電壓范圍:+3.0V—+5.5V;③測溫范圍:-55℃—+125℃,在-10℃—+85℃圍內(nèi)精度為范圍內(nèi)精度為+0.5℃,分辨率為0.0625℃;④通過編程可實現(xiàn)9-12位的數(shù)字讀數(shù)方式。⑤多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點測溫。溫度傳感器模塊原理圖見圖4:
1.5 LED顯示模塊
本設(shè)計的顯示模塊采用LCD12864液晶顯示屏,顯示的內(nèi)容有兩個輔控制器采集到的溫度和經(jīng)過兩個輔控制器AD轉(zhuǎn)換以及計算模擬出來的車速。經(jīng)過液晶屏的顯示,可以方便的知道CAN總線上的數(shù)據(jù)傳輸是否正確。LED顯示模塊原理圖見5:
2 軟件設(shè)計
2.1 MSCAN初始化程序的編寫
初始化按照下列過程實現(xiàn):
1)首先檢測MSCAN是否處于工作模式;
2)進入初始化模式中,正在進行的任何發(fā)送或接收都會立即中止,與CAN總線失去同步。在進入初始化模式時,必須要保證MSCAN不在工作狀態(tài),否則中止正在發(fā)送的報文可能導(dǎo)致錯誤發(fā)生。在初始化模式中,雖然MSCAN被停止,但是其接口寄存器仍然可以訪問;
1)設(shè)置相應(yīng)寄存器,依次設(shè)置CAN總線波特率、接收濾波方式、標識符接收寄存器和標識符掩碼寄存器;
2)使能CAN模塊,設(shè)置運行模式(初始化、睡眠和工作三種模式)。MACAN初始化流程圖見圖6。
2.2 MSCAN發(fā)送程序的編寫
MACAN用報文來發(fā)送數(shù)據(jù),首先選擇空閑的發(fā)送緩沖區(qū),然后向該空閑緩沖區(qū)寫入數(shù)據(jù),最后設(shè)置改緩沖區(qū)的發(fā)送標志位來將報文發(fā)送至CAN總線上。因此,用戶在發(fā)送報文緩存區(qū)寫入數(shù)據(jù)前,只需要通過相應(yīng)的寄存器(CANTBSEL)設(shè)置一個指針來訪問任何一個緩沖區(qū)。此算法不僅簡化了發(fā)送緩沖器選擇功能,而且這種機制還使程序軟件處理更為簡單。
MSCAN的發(fā)送流程:
首先,在發(fā)送前要檢測判是否存在可用緩沖區(qū)的寄存器(CANTDLG&7)是否為0。若該寄存器(CANTDLG&7=0),則說明三個緩沖區(qū)已滿,并且報文未被發(fā)出。此時若繼續(xù)選擇向緩沖區(qū)裝填數(shù)據(jù),將導(dǎo)致先前發(fā)送的報文丟失。在沒出現(xiàn)問題的情況下,寄存器CANTDLG&7的值都為1,即存在可用的緩存區(qū)。檢測到CANTDLG&7=0,原因可能為:
①MSCAN還沒來得及將報文發(fā)出;
②總線上的節(jié)點出現(xiàn)問題,沒有及時應(yīng)答,導(dǎo)致報文發(fā)送不成功。
⑴若沒有可用的緩存區(qū),檢查硬件系統(tǒng)和程序是否出現(xiàn)問題,直到報文能順利發(fā)出;
⑵若有可用的緩沖區(qū),則使用對應(yīng)的選擇緩沖區(qū)語句“CANTBSEL=CANTFLG”,選擇相應(yīng)的發(fā)送緩沖區(qū)。若有多個緩沖區(qū)空閑時,選擇的緩沖區(qū)的序號是最小的,即用“CANTBSEL=CANTFLG”和“CANTBSEL=1”語句,MSCAN會自動選擇了第一個發(fā)送緩沖區(qū)。
接著,要向緩存區(qū)寫入數(shù)據(jù),具體有:CPU標識符、數(shù)據(jù)段長度和需要發(fā)送的數(shù)據(jù)。數(shù)據(jù)是以報文形式裝入的,而且用何種方式寫的報文,接收也會用同樣的方式,并且還要檢測發(fā)送或者接收數(shù)據(jù)是否有誤。
最后,將已選擇的緩沖區(qū)標記為發(fā)送,即置位發(fā)送標志“CANTFLG=CANTBSEL”,與此同時,TXE標志也會被清零。
此后MSCAN會自動把數(shù)據(jù)裝入傳送隊列,傳送成功后將TXE置1,若用戶在先前使能發(fā)送中斷,則在此這個過程中會產(chǎn)生一個發(fā)送中斷。當然,在這個中斷過程中,發(fā)送用戶還可以繼續(xù)加載數(shù)據(jù)到發(fā)送緩沖區(qū)并重新發(fā)送。
當然,在發(fā)送數(shù)據(jù)時也會出現(xiàn)同時有多個緩存區(qū)準備發(fā)送,這時候如果同時發(fā)送必然導(dǎo)致錯誤。為了解決這個問題,MSCAN模塊就給每個緩存區(qū)分配了一個8位的優(yōu)先級域,這就決定了在數(shù)據(jù)建立之前,用戶首先要對此域?qū)懭雰?yōu)先級。通過判斷域內(nèi)的優(yōu)先級即可判斷數(shù)據(jù)的優(yōu)先級,優(yōu)先級的值越小,則表示此緩沖區(qū)的優(yōu)先級越高。當MSCAN每次參與總線仲裁和發(fā)生發(fā)送錯誤時,都會進行內(nèi)部的數(shù)據(jù)排列。若準備發(fā)送的緩沖區(qū)不止一個,則MSCAN模塊會使用內(nèi)部的優(yōu)先級來決定先發(fā)送哪個緩沖區(qū)。
當用戶有重要的數(shù)據(jù)需要發(fā)送時,就必須給該數(shù)據(jù)較高的優(yōu)先級。如果MSCAN的三個緩存區(qū)都在發(fā)送數(shù)據(jù)。此時,就需要三個緩存區(qū)中優(yōu)先級比較低的數(shù)據(jù)停止發(fā)送來讓優(yōu)先級比較高的數(shù)據(jù)先發(fā)送。如果優(yōu)先級低的數(shù)據(jù)發(fā)送過程不能終止,用戶就需要對相應(yīng)的寄存器中的相應(yīng)位進行設(shè)置(本單片機為CANTARQ寄存器中的ABTRQ位)來強行終止發(fā)送。
發(fā)送流程圖見圖7:
2.3 MSCAN 接收程序的編寫
同MSCAN有3個發(fā)送緩沖區(qū)的發(fā)送機制類似,MSCAN有5個接收緩沖區(qū),而且這5個接收緩沖區(qū)被交替映射到單個存儲器區(qū)域CANRXFG中。同發(fā)送緩存區(qū)一樣,這種機制也簡化了應(yīng)用軟件的編寫,提高了接收數(shù)據(jù)的效率。
接收已滿標志CANRFLG寄存器的RXF位指示了前臺接收緩沖區(qū)的狀態(tài),當緩沖區(qū)中有正確的報文被接收時就設(shè)置接收已滿標志,即將RXF置1。報文的接收有兩種方式:中斷接收和查詢接收。接收時,首先要檢查每條報文的標識符是否通過濾波器。如果標識符通過了濾波器,就將有效的報文寫入后臺接收緩存器中,MSCAN將后臺接收緩沖器中的報文內(nèi)容轉(zhuǎn)移到前臺接收緩沖器中,并設(shè)置接收已滿標志(CANRFLG寄存器的RXF位)。而接收報文時必須從前臺接收緩沖器讀取報文,接收完后,將接收器已滿標志(CANRFLG寄存器的RXF位)清零來釋放前臺接收緩沖器。而背景臺接收緩沖器接收到無效的報文時,該報文會被下一條覆蓋。用戶的中斷服務(wù)程序可以把數(shù)據(jù)從前臺緩沖區(qū)讀出,并置位RXF標志以響應(yīng)中斷并釋放前臺緩沖區(qū)。
MSCAN接收流程:
①首先,要檢測接收器已滿標志(CANRFLG寄存器的RXF位),當接收器已滿標志(CANRFLG寄存器的RXF位)置1時,表示接收緩沖器接收到了正確的報文;
②然后,檢測 CAN協(xié)議報文的模式,讀標識符,讀取數(shù)據(jù)長度,讀取數(shù)據(jù);
③最后,清接收器已滿標志(CANRFLG寄存器的RXF位),以便接收下一個報文。
注意:對報文的檢測和讀取一定要在清接收器已滿標志(CANRFLG寄存器的RXF位)之前進行,否則該報文會被下一個報文覆蓋,從而丟失信息。讀取報文流程圖見圖8:
3 系統(tǒng)測試與總結(jié)
經(jīng)過一段時間的研究與設(shè)計,終于將“利用飛思卡爾MC9S12(X)單片機構(gòu)建CAN總線小型網(wǎng)絡(luò)”這個課題做完并經(jīng)過了測試。測試過程中,利用了CAN總線構(gòu)建了3個節(jié)點的小型網(wǎng)絡(luò),實現(xiàn)了對溫度和用電壓模擬的速度這些數(shù)據(jù)進行了測量、傳輸和顯示。測量工具有:示波器、萬用表、溫度計、秒表等。經(jīng)過測試,利用飛思卡爾MC9S12(X)單片機CAN總線構(gòu)建的小型網(wǎng)絡(luò)工作狀態(tài)良好,通信無誤且具有實時性,達到了預(yù)期的目標。
參考文獻:
[1]馮沖,段曉敏.飛思卡爾MC9S12(X)開發(fā)必修課[M].北京航空航天大學(xué)出版社,2014.
[2]羅峰,孫澤昌.汽車CAN總線系統(tǒng)原理、設(shè)計與應(yīng)用[M].電子工業(yè)出版社,2010.