趙 城,張 凱
(揚(yáng)州大學(xué) 物理學(xué)院,江蘇 揚(yáng)州 225002)
工業(yè)測(cè)控設(shè)備和系統(tǒng)中長(zhǎng)期使用的RS-232傳輸協(xié)議是一種并不完備的低數(shù)據(jù)速率傳輸協(xié)議,抗干擾性能差,難以組成大規(guī)模的網(wǎng)絡(luò)系統(tǒng)。隨著控制系統(tǒng)復(fù)雜性和規(guī)模的增加,如果采用傳統(tǒng)的以太網(wǎng)組件構(gòu)建網(wǎng)絡(luò)拓?fù)?,則實(shí)時(shí)性難以保證。CAN是一種造價(jià)低、出錯(cuò)概率低又適于現(xiàn)場(chǎng)環(huán)境通信的總線,本文在此基礎(chǔ)上構(gòu)建了一種實(shí)時(shí)的令牌傳輸網(wǎng)。
控制器局域網(wǎng) CAN(Controller Area Net)是一種有效支持分布式控制的串行通信網(wǎng)絡(luò)。CAN起初是由德國(guó)Bosch公司為汽車的監(jiān)測(cè)、控制系統(tǒng)而設(shè)計(jì)的,由于其具有卓越的特性及極高的可靠性,后來漸漸應(yīng)用于工業(yè)過程監(jiān)控設(shè)備的互連。CAN總線只定義ISO/OSI模型中的第一層(物理層)和第二層(數(shù)據(jù)鏈路層)。CAN總線網(wǎng)絡(luò)的物理拓?fù)淙鐖D1所示。
圖1 CAN總線網(wǎng)絡(luò)的物理拓?fù)?/p>
CAN總線主要的特點(diǎn)有:(1)采用差分傳輸,抗干擾性強(qiáng);(2)采用短幀結(jié)構(gòu)和 CRC校驗(yàn)等檢錯(cuò)措施,出錯(cuò)概率低;(3)采用基于優(yōu)先權(quán)的非破壞性總線仲裁技術(shù),可工作于多主、一對(duì)一、一對(duì)多及全局廣播方式傳送接收數(shù)據(jù);(4)通信距離隨波特率而變,典型值為 10 km(5 kb/s)、40 m(1 Mb/s)。
令牌總線網(wǎng)絡(luò)的邏輯拓?fù)淙鐖D2所示。所有連到令牌總線上的站,在邏輯上將構(gòu)成一個(gè)首尾相連的環(huán),每個(gè)站都知道自己的前導(dǎo)站(PS)和后繼站(NS)。
令牌實(shí)際上是一個(gè)采用特殊編碼的控制幀。網(wǎng)上只有一個(gè)令牌沿邏輯環(huán)傳遞,得到令牌的站才能發(fā)送數(shù)據(jù),然后把令牌向下傳。在正常運(yùn)行時(shí),令牌按照站點(diǎn)地址的序列號(hào)從一個(gè)站點(diǎn)傳送到另外一個(gè)站點(diǎn)。這樣,這個(gè)令牌實(shí)際上是按照邏輯環(huán)而不是物理環(huán)進(jìn)行傳遞。在數(shù)字序列的最后一個(gè)站點(diǎn)將令牌返回到第一個(gè)站點(diǎn)。
圖2 令牌總線網(wǎng)絡(luò)的邏輯拓?fù)?/p>
結(jié)合CAN總線數(shù)據(jù)鏈路層對(duì)幀的封裝、差錯(cuò)的控制和令牌總線突出的實(shí)時(shí)性的優(yōu)點(diǎn),設(shè)計(jì)了一種基于CAN總線的實(shí)時(shí)令牌傳輸協(xié)議,基于此協(xié)議構(gòu)建的網(wǎng)絡(luò)拓?fù)淙鐖D3所示。
圖3 基于CAN總線實(shí)時(shí)令牌網(wǎng)的拓?fù)浣Y(jié)構(gòu)
圖4是驗(yàn)證此協(xié)議的一個(gè)實(shí)際網(wǎng)絡(luò)。主站由NXP LPC1769和收發(fā)器PCA82C250構(gòu)成,從站由51單片機(jī)、SJA1000 CAN控制器和收發(fā)器PCA82C250構(gòu)成。主站工作在濾波方式,即只有在標(biāo)識(shí)符(ID)通過濾波后接收信息。從站工作在廣播方式,即先接收總線上的信息再按照協(xié)議進(jìn)行處理。主站的作用是收集從站發(fā)過來的信息并提交給主機(jī)及監(jiān)視總線活動(dòng),當(dāng)網(wǎng)絡(luò)令牌丟失時(shí),發(fā)送開機(jī)復(fù)位幀。從站的作用是獲得令牌后,向主站或目的從站進(jìn)行數(shù)據(jù)通信。
圖4 實(shí)際驗(yàn)證網(wǎng)絡(luò)
PCA82C250是專門用于CAN總線的收發(fā)器,可與獨(dú)立CAN控制器組合使用,最高速率為1 Mb/s,還可根據(jù)Rs引腳調(diào)整3種工作模式。
SJA1000是NXP公司生產(chǎn)的獨(dú)立CAN控制器,是早期PCA82C200的升級(jí),支持收發(fā)11位標(biāo)識(shí)符的標(biāo)準(zhǔn)幀和29位標(biāo)識(shí)符的擴(kuò)展幀,通過驗(yàn)收屏蔽寄存器和驗(yàn)收代碼寄存器進(jìn)行單次/雙次濾波,能完成可靠的通信。
NXP LPC1769是基于ARM Cortex-M3的32位微控制器,工作頻率可高達(dá)120 MHz。片上集成了雙通道CAN 2.0B控制器,USB 2.0全速接口,4個(gè)可配置外部中斷等。CAN的編程是以32位的方式進(jìn)行的。在CAN的工程中,需要包含CAN的頭文件,此文件包含了波特率、驗(yàn)收濾波器模式等定義以及各項(xiàng)CAN函數(shù)的聲明。以下是一個(gè)CAN信息的定義:
在具體的CAN函數(shù)中,就可以用這個(gè)結(jié)構(gòu)體去定義數(shù)據(jù)緩沖區(qū),然后在主函數(shù)中進(jìn)行數(shù)據(jù)緩沖區(qū)的初始化。
SJA1000擴(kuò)展幀格式具有5個(gè)字節(jié)的描述符,本文將其進(jìn)行重定義,如表1所示。幀類型如表2所示,其中前8個(gè)幀是控制幀,某些控制幀還會(huì)使用數(shù)據(jù)字節(jié)1。
表1 重定義CAN描述符區(qū)
表2 幀類型
站在不同的時(shí)間會(huì)發(fā)送不同的類型幀,其中環(huán)路的建立過程是指環(huán)的初始化或站的添加和刪除過程。
令牌申請(qǐng)幀:硬件復(fù)位或收到開機(jī)復(fù)位幀的站,在總線空閑時(shí)發(fā)送,向總線申請(qǐng)令牌。
開機(jī)復(fù)位幀:令牌持有站發(fā)送完后繼幀的目的站后,在一定的時(shí)間內(nèi)監(jiān)視不到總線活動(dòng)時(shí)發(fā)送,通知環(huán)路站點(diǎn)環(huán)路嚴(yán)重出錯(cuò),需要進(jìn)行復(fù)位,重新組環(huán)。
請(qǐng)求后繼幀:環(huán)路建立過程中由令牌持有站發(fā)送,通知未入環(huán)的站以設(shè)置后繼幀響應(yīng)令牌持有站的詢問。
設(shè)置后繼幀:環(huán)路建立過程中由未入環(huán)的站或出錯(cuò)站的后繼站發(fā)送,用于添加或刪除一個(gè)站。
閉環(huán)宣示幀:環(huán)路建立過程中令牌持有站發(fā)送完請(qǐng)求后繼幀后,在一定的時(shí)間內(nèi)監(jiān)視不到總線活動(dòng)時(shí)發(fā)送,通知環(huán)路站點(diǎn)環(huán)路已經(jīng)建立,并由識(shí)別碼3標(biāo)示的目的站進(jìn)行閉環(huán)操作:將此站的前導(dǎo)站PS設(shè)置為此幀的識(shí)別碼2。
后繼幀:令牌持有站發(fā)送完令牌幀后,在一定的時(shí)間內(nèi)監(jiān)視不到總線活動(dòng)時(shí)發(fā)送,通知錯(cuò)誤站的后繼站以設(shè)置后繼幀響應(yīng)令牌持有站的詢問。
入環(huán)申請(qǐng)幀:發(fā)生總線錯(cuò)誤的站在總線恢復(fù)時(shí),向令牌持有站申請(qǐng)成為其后繼站。
令牌幀:令牌持有站收到設(shè)置后繼幀或發(fā)送完數(shù)據(jù)幀時(shí),將令牌傳遞給它的后繼站時(shí)發(fā)送。
數(shù)據(jù)幀:令牌持有站有數(shù)據(jù)需要發(fā)送時(shí),向目的站進(jìn)行發(fā)送。
為實(shí)現(xiàn)協(xié)議,每個(gè)從站中都需定義一個(gè)站狀態(tài)寄存器Station_State_Reg(SSR),其各位定義如圖 5所示。
圖5 站狀態(tài)寄存器SSR的位定義
Station_State用于指示站狀態(tài),0表示站未入環(huán),1表示站已入環(huán),此位在硬件復(fù)位或收到開機(jī)復(fù)位幀時(shí)置1,總線出錯(cuò)時(shí)置0。Ring_State用于指示環(huán)的狀態(tài),0表示環(huán)未閉合,1表示環(huán)已閉合,此位在硬件復(fù)位、收到開機(jī)復(fù)位幀和總線出錯(cuò)時(shí)置0。Token_State用于指示站是否持有令牌,0表示未持有,1表示持有,此位在硬件復(fù)位或收到開機(jī)復(fù)位幀時(shí)置1,總線出錯(cuò)時(shí)置0。Frame ID用于指示當(dāng)前/之前發(fā)送的幀類型,與幀類型字節(jié)的低4位相同,硬件復(fù)位或收到開機(jī)復(fù)位幀時(shí)置為令牌申請(qǐng)幀ID,總線錯(cuò)誤時(shí)置為入環(huán)申請(qǐng)幀ID。
圖6 仲裁中斷、總線錯(cuò)誤中斷和單片機(jī)定時(shí)器中斷處理流程
圖7 接收中斷處理流程
每個(gè)站設(shè)置3個(gè)站ID字節(jié)和一個(gè)臨時(shí)存儲(chǔ)字節(jié)Temp,它們?cè)谟布?fù)位、收到開機(jī)復(fù)位幀或總線出錯(cuò)時(shí)置為本站ID。PS記錄前導(dǎo)站ID,NS記錄后繼站ID,TS記錄本站ID。Temp對(duì)應(yīng)于環(huán)建立過程中令牌幀的數(shù)據(jù)字節(jié)1:在環(huán)初始化時(shí)令牌幀的數(shù)據(jù)字節(jié)1表示的是第一個(gè)獲得令牌的站ID,當(dāng)前令牌持有站把令牌傳給它的后繼站時(shí)會(huì)轉(zhuǎn)發(fā)此ID;當(dāng)有站發(fā)送入環(huán)申請(qǐng)幀申請(qǐng)?zhí)砑右粋€(gè)站時(shí),當(dāng)前令牌持有站會(huì)把它的后繼站ID放入令牌幀的數(shù)據(jù)字節(jié)1中轉(zhuǎn)給入環(huán)申請(qǐng)站,此ID的站會(huì)作為之后的閉環(huán)宣示幀的目的站進(jìn)行閉環(huán)操作;當(dāng)令牌持有站發(fā)送后繼幀刪除一個(gè)站時(shí),會(huì)把出錯(cuò)的后繼站ID放在數(shù)據(jù)字節(jié)1中,PS與此ID相同的站會(huì)以設(shè)置后繼幀響應(yīng)令牌持有站。
站程序中除定義了每個(gè)類型幀的發(fā)送函數(shù)外,還定義了一些其他重要的函數(shù):狀態(tài)偵測(cè)函數(shù),用于偵測(cè)總線是否錯(cuò)誤、是否空閑以及發(fā)送緩沖器是否釋放,它由每個(gè)類型幀的發(fā)送函數(shù)所調(diào)用;定時(shí)函數(shù),用于設(shè)定一個(gè)時(shí)間間隔,它僅由請(qǐng)求后繼幀、后繼幀、申請(qǐng)入環(huán)幀發(fā)送函數(shù)調(diào)用。SJA1000控制器開放接收中斷、仲裁中斷及總線錯(cuò)誤中斷3類中斷。發(fā)送中斷、仲裁中斷、總線錯(cuò)誤中斷和單片機(jī)定時(shí)中斷處理流程如圖6所示。
接收中斷處理流程如圖7所示,接收中斷對(duì)9類幀進(jìn)行了不同的處理。
基于CAN總線的實(shí)時(shí)令牌網(wǎng)可用于短數(shù)據(jù)幀的實(shí)時(shí)傳輸,如機(jī)器狀態(tài)傳感數(shù)據(jù)、過程控制信號(hào)等,基于此協(xié)議構(gòu)建的網(wǎng)絡(luò)既可保證傳輸?shù)膶?shí)時(shí)性又可保證正確性,因此具有很好的應(yīng)用價(jià)值。
[1]楊春杰,王曙光,亢紅波.CAN總線技術(shù)[M].北京:北京航空航天大學(xué)出版社,2010.
[2]關(guān)平.雙向HFC網(wǎng)絡(luò)中令牌總線接入方法研究 [D].成都:四川大學(xué),2004.
[3]王毅峰,李令奇.基于CAN總線的分布式數(shù)據(jù)采集與控制系統(tǒng)[J].工業(yè)控制計(jì)算機(jī),2000,13(5):34-35.
[4]SJA1000 Stand-alone CAN controller.pdf[EB/OL].[2000-01]http://www.nxp.com.
[5]LPC1769.pdf[EB/OL].[2012-08]http://www.nxp.com.