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