孫大元,閆 冬
(中國(guó)電子科技集團(tuán)公司第五十四研究所,河北 石家莊 050081)
?
基于FPGA的冗余CAN總線通信節(jié)點(diǎn)設(shè)計(jì)
孫大元,閆冬
(中國(guó)電子科技集團(tuán)公司第五十四研究所,河北 石家莊 050081)
摘要針對(duì)航天領(lǐng)域?qū)νㄐ畔到y(tǒng)可靠性要求高的特點(diǎn),提出了基于FPGA、SJA1000和PCA82C250的冗余CAN總線通信節(jié)點(diǎn)設(shè)計(jì)。介紹了CAN總線冗余方式的選擇原則,詳細(xì)給出了采用控制器級(jí)冗余方式的通信節(jié)點(diǎn)硬件設(shè)計(jì)和FPGA控制程序設(shè)計(jì),重點(diǎn)對(duì)SJA1000初始化流程、收發(fā)報(bào)文處理過程、SJA1000錯(cuò)誤處理過程和鏈路熱備份條件下的數(shù)據(jù)選擇策略進(jìn)行了說明。通過FPGA程序仿真,驗(yàn)證了收發(fā)報(bào)文時(shí)SJA1000的控制時(shí)序,進(jìn)行了高低溫條件下的節(jié)點(diǎn)傳輸性能測(cè)試和冗余數(shù)據(jù)處理功能測(cè)試。測(cè)試結(jié)果證明,節(jié)點(diǎn)工作穩(wěn)定性高、實(shí)時(shí)性強(qiáng),適用于航天和航空等高可靠性要求的領(lǐng)域。
關(guān)鍵詞CAN總線;FPGA;冗余;CAN控制器;SJA1000
0引言
Control Area Network(CAN)總線是一種采用異步串行方式工作的現(xiàn)場(chǎng)總線,最早由德國(guó)BOSCH公司提出用于實(shí)現(xiàn)汽車內(nèi)部控制[1],由于其傳輸速率高,抗電磁干擾性能強(qiáng),同時(shí)配置靈活,使用方便,所以被越來越多地應(yīng)用于航天領(lǐng)域,近年來我國(guó)發(fā)射成功的多顆小衛(wèi)星都采用了CAN總線通信系統(tǒng)[2]。星上設(shè)備長(zhǎng)時(shí)間在高低溫、真空和輻射等惡劣條件下工作,且故障后不可維護(hù),因此對(duì)總線可靠性提出了更高的要求。
在傳統(tǒng)的CAN總線通信系統(tǒng)中,通常采用單片機(jī)作為總線節(jié)點(diǎn)的處理器,但是單片機(jī)處理速度慢、抗干擾能力差的缺點(diǎn)使其在航天領(lǐng)域應(yīng)用中受到很大限制。本文針對(duì)航天應(yīng)用的特點(diǎn),提出了一種基于FPGA作為處理器的總線節(jié)點(diǎn)設(shè)計(jì)方案,同時(shí)為了進(jìn)一步提高系統(tǒng)可靠性,對(duì)節(jié)點(diǎn)進(jìn)行了控制器級(jí)的冗余設(shè)計(jì),使總線通信鏈路由1條變?yōu)榛闊醾浞莸?條,在保證系統(tǒng)實(shí)時(shí)性不受影響的同時(shí),極大地提高了系統(tǒng)的可靠性。
1總體設(shè)計(jì)
1.1冗余方式選擇
CAN總線的冗余設(shè)計(jì)分為驅(qū)動(dòng)器冗余、控制器冗余和處理器冗余3種方案[3]。驅(qū)動(dòng)器冗余方案中通信節(jié)點(diǎn)包括:1個(gè)處理器、1個(gè)CAN控制器、2個(gè)CAN驅(qū)動(dòng)器和1個(gè)切換電路,工作時(shí)由處理器控制切換電路進(jìn)行2個(gè)CAN驅(qū)動(dòng)器間的選擇,該方案實(shí)現(xiàn)較為簡(jiǎn)單,但如果控制器出現(xiàn)故障會(huì)導(dǎo)致系統(tǒng)無法工作,對(duì)節(jié)點(diǎn)可靠性的提升相對(duì)較小??刂破魅哂喾桨钢型ㄐ殴?jié)點(diǎn)由1個(gè)處理器、2個(gè)CAN控制器和2個(gè)CAN驅(qū)動(dòng)器來實(shí)現(xiàn),此時(shí)2條CAN鏈路獨(dú)立,對(duì)節(jié)點(diǎn)可靠性有很大提高。處理器冗余方案中通信節(jié)點(diǎn)包括2個(gè)處理器、2個(gè)CAN控制器和2個(gè)CAN驅(qū)動(dòng)器,該方案實(shí)現(xiàn)了硬件上的完全獨(dú)立,冗余度最高,但處理器的增加會(huì)使節(jié)點(diǎn)軟硬件復(fù)雜度極大提高。航天應(yīng)用中對(duì)節(jié)點(diǎn)的體積、功耗等指標(biāo)要求較為嚴(yán)格,并且處理器芯片等級(jí)一般為軍品級(jí)或宇航級(jí),成本較高,因此不適宜采用處理器冗余方案,而驅(qū)動(dòng)器冗余方案對(duì)系統(tǒng)可靠性的提升有限,同樣不適用于高可靠性要求的場(chǎng)合。本文設(shè)計(jì)選擇使用控制器冗余方案,2條鏈路熱備份,即處理器同時(shí)通過2條鏈路收發(fā)數(shù)據(jù),與冷備份相比,熱備份方案雖然使系統(tǒng)功耗有所增加,但其可靠性更高、實(shí)時(shí)性更好。采用控制器冗余方案的CAN總線系統(tǒng)結(jié)構(gòu)框圖如圖1所示[4]。
圖1 控制器冗余CAN總線系統(tǒng)結(jié)構(gòu)
1.2節(jié)點(diǎn)硬件設(shè)計(jì)
CAN總線節(jié)點(diǎn)硬件包括總線驅(qū)動(dòng)器、協(xié)議控制器和處理器[5]??偩€驅(qū)動(dòng)器提供協(xié)議控制器與物理總線之間的接口,完成信號(hào)電平控制,協(xié)議控制器執(zhí)行CAN總線協(xié)議,實(shí)現(xiàn)報(bào)文收發(fā)緩沖、總線錯(cuò)誤處理等功能[6]。處理器對(duì)協(xié)議控制器操作,完成CAN總線工作模式選擇、工作參數(shù)設(shè)置以及報(bào)文的發(fā)送和接收。CAN通信節(jié)點(diǎn)硬件組成框圖如圖2所示。
圖2 CAN通信節(jié)點(diǎn)硬件組成
本設(shè)計(jì)中協(xié)議控制器和總線驅(qū)動(dòng)器分別選擇Philips公司的SJA1000和PCA82C250[7]。同時(shí)為提高節(jié)點(diǎn)的抗干擾能力,在SJA1000與PCA82C250之間增加光耦6N137,以實(shí)現(xiàn)CAN節(jié)點(diǎn)與總線通道的電氣隔離。節(jié)點(diǎn)處理器FPGA選擇XILINX公司的XQ4VSX55,由于FPGA與SJA1000之間接口電平不匹配,因此在二者之間增加雙向總線收發(fā)器54AC164245,實(shí)現(xiàn)3.3 V TTL電平與5 V TTL電平之間的轉(zhuǎn)換[8]。
1.3SJA1000工作方式
1.3.1SJA1000初始化
系統(tǒng)上電后首先需要對(duì)SJA1000進(jìn)行初始化,通過設(shè)置模式寄存器、中斷使能寄存器、驗(yàn)收代碼寄存器、驗(yàn)收屏蔽寄存器、總線定時(shí)寄存器、輸出控制寄存器和時(shí)鐘分頻寄存器完成SJA1000工作模式的選擇、各類中斷的使能、報(bào)文濾波的設(shè)置、波特率的設(shè)置以及輸出特性的選擇[9]。SJA1000的初始化必須在復(fù)位模式中進(jìn)行,系統(tǒng)上電后,F(xiàn)PGA給SJA1000的RST管腳輸出一個(gè)負(fù)脈沖,脈沖結(jié)束后通過讀取模式寄存器RM位的值判斷SJA1000是否進(jìn)入復(fù)位模式,如果成功進(jìn)入復(fù)位模式則依次給各個(gè)寄存器賦值,賦值完畢后,將模式寄存器的RM位寫0,退出復(fù)位模式,進(jìn)入工作模式。
1.3.2報(bào)文發(fā)送
報(bào)文發(fā)送過程可以通過SJA1000的中斷請(qǐng)求或查詢狀態(tài)標(biāo)志控制實(shí)現(xiàn),本設(shè)計(jì)中選擇使用查詢狀態(tài)標(biāo)志的方式發(fā)送數(shù)據(jù)。在發(fā)送數(shù)據(jù)之前,需要通過讀取狀態(tài)寄存器的接收狀態(tài)位、發(fā)送完畢狀態(tài)位以及發(fā)送緩沖區(qū)狀態(tài)位值判斷當(dāng)前SJA1000是否具備發(fā)送條件,只有當(dāng)接收狀態(tài)位為0(空閑),發(fā)送完畢狀態(tài)位為1(完畢),發(fā)送緩沖區(qū)狀態(tài)位為1(非鎖定)時(shí),才可以進(jìn)行發(fā)送。發(fā)送報(bào)文時(shí),F(xiàn)PGA將報(bào)文內(nèi)容、幀信息和標(biāo)識(shí)符寫到SJA1000的發(fā)送緩沖區(qū),之后將命令寄存器的發(fā)送請(qǐng)求位寫1,啟動(dòng)SJA1000發(fā)送。
1.3.3報(bào)文接收
與發(fā)送報(bào)文過程相同,接收?qǐng)?bào)文也可以通過中斷或查詢2種方式實(shí)現(xiàn)。接收數(shù)據(jù)過程是被動(dòng)的,如果采用查詢方式,程序需要不斷讀取SJA1000的接收緩沖區(qū)狀態(tài)來確認(rèn)是否接收到了數(shù)據(jù),實(shí)時(shí)性較差。因此,本設(shè)計(jì)中采用中斷請(qǐng)求的接收方式[10]。設(shè)計(jì)中使用3種類型的中斷:接收中斷、數(shù)據(jù)溢出中斷和錯(cuò)誤中斷,程序接收到中斷后,通過讀取中斷寄存器判斷中斷類型,如果為接收中斷,則讀取接收緩沖區(qū)內(nèi)容并釋放接收緩沖區(qū);如果為數(shù)據(jù)溢出中斷,則清數(shù)據(jù)溢出狀態(tài)并釋放接收緩沖區(qū),否則中斷類型為錯(cuò)誤中斷,進(jìn)行相應(yīng)的處理。
1.3.4錯(cuò)誤處理
本設(shè)計(jì)中SJA1000工作于PeliCAN模式,此時(shí)總線上出現(xiàn)錯(cuò)誤的次數(shù)會(huì)在發(fā)送錯(cuò)誤計(jì)數(shù)寄存器和接收錯(cuò)誤計(jì)數(shù)寄存器的值上體現(xiàn),如果錯(cuò)誤計(jì)數(shù)器的值大于255,則總線會(huì)進(jìn)入關(guān)閉狀態(tài),從而導(dǎo)致通信中斷,該狀態(tài)不會(huì)自主恢復(fù),必須由程序進(jìn)行處理[11]。程序接收到中斷并通過中斷寄存器的值判斷類型為錯(cuò)誤中斷后,讀取模式寄存器的值,如果其RM位為1則說明總線關(guān)閉,SJA1000進(jìn)入復(fù)位狀態(tài),此時(shí)需重新進(jìn)行SJA1000初始化流程,使SJA1000恢復(fù)工作狀態(tài)。
1.3.5SJA1000控制流程
SJA1000控制程序工作流程如圖3所示。程序運(yùn)行后首先進(jìn)行SJA1000初始化,初始化完成后進(jìn)入空閑等待狀態(tài),如果在等待狀態(tài)中有中斷到來則進(jìn)行中斷類型判斷并進(jìn)行相應(yīng)的處理,如果有數(shù)據(jù)需要發(fā)送則在確認(rèn)發(fā)送條件滿足后進(jìn)行發(fā)送。
圖3 SJA1000控制程序工作流程
2冗余處理
冗余處理是節(jié)點(diǎn)設(shè)計(jì)中的關(guān)鍵部分。在其他相關(guān)文章中,基本都是采用冷冗余方案,2條CAN總線鏈路中同時(shí)只有一條鏈路工作,當(dāng)判斷當(dāng)前鏈路工作異常后,進(jìn)行鏈路切換和數(shù)據(jù)重發(fā)。冷冗余方案雖然保證了冗余鏈路的增加不會(huì)提高節(jié)點(diǎn)功耗,但鏈路切換、數(shù)據(jù)重發(fā)機(jī)制會(huì)導(dǎo)致系統(tǒng)的實(shí)時(shí)性大大降低。本設(shè)計(jì)中采用了熱冗余方案,2條CAN總線鏈路同時(shí)工作,互為熱備份。發(fā)送報(bào)文時(shí),數(shù)據(jù)通過2條鏈路同時(shí)發(fā)送,當(dāng)一條鏈路出現(xiàn)故障時(shí),另一條鏈路工作不受影響,保證了系統(tǒng)的實(shí)時(shí)性。接收?qǐng)?bào)文時(shí),節(jié)點(diǎn)需要對(duì)2條鏈路上的數(shù)據(jù)進(jìn)行甄別、選擇,避免同一條報(bào)文的重復(fù)接收,具體選擇策略為:節(jié)點(diǎn)在一條鏈路上接收到一幀數(shù)據(jù)幀后,記錄其幀類型碼,如果在小于T的時(shí)間間隔內(nèi)在另一條鏈路上收到了一幀具有同樣類型碼的數(shù)據(jù)幀,則認(rèn)為該幀與之前接收的數(shù)據(jù)幀為同一幀,將其丟棄,其中時(shí)間間隔T根據(jù)不同類型報(bào)文的發(fā)送頻率等條件靈活設(shè)置。與冷冗余方案相比,本設(shè)計(jì)中采用的熱冗余方案實(shí)時(shí)性更好,判決策略簡(jiǎn)單,可靠性更高。
3FPGA頂層模塊設(shè)計(jì)
FPGA頂層模塊如圖4所示。
圖4 FPGA頂層模塊功能
其中SJA1000_CTRL為SJA1000控制模塊,負(fù)責(zé)完成SJA1000初始化、報(bào)文發(fā)送、報(bào)文接收以及SJA1000的錯(cuò)誤處理[12]。SEND_FIFO為發(fā)送數(shù)據(jù)緩存FIFO,用于緩存待發(fā)送數(shù)據(jù),實(shí)現(xiàn)前后端數(shù)據(jù)速率匹配,當(dāng)FIFO中存儲(chǔ)數(shù)據(jù)量大于預(yù)置的發(fā)送門限后,SEND_FIFO通過將其使能標(biāo)志S_EN置1,告知SJA1000_CTRL模塊有數(shù)據(jù)需要發(fā)送。RECIEVE_FIFO為接收數(shù)據(jù)緩存FIFO,用于存儲(chǔ)從SJA1000讀取到的數(shù)據(jù),當(dāng)FIFO接收完一幀數(shù)據(jù)幀后,RECIEVE_FIFO讀使能標(biāo)志R_EN置1,告知REDUNDANT_SEL模塊將數(shù)據(jù)讀出并進(jìn)行處理。REDUNDANT_SEL模塊負(fù)責(zé)冗余數(shù)據(jù)處理,完成2條鏈路數(shù)據(jù)的冗余判斷和選擇接收。
4仿真驗(yàn)證
FPGA程序設(shè)計(jì)通過ISE和Modelsim軟件進(jìn)行了綜合以及功能仿真,并通過ChipScope軟件進(jìn)行FPGA程序的在線調(diào)試,主要對(duì)SJA1000控制模塊收發(fā)數(shù)據(jù)時(shí)的信號(hào)時(shí)序進(jìn)行了驗(yàn)證。發(fā)送數(shù)據(jù)內(nèi)容為固定0xAA,接收數(shù)據(jù)內(nèi)容為0x06、0x07、0x08、0x09、0x0A、0x0B、0x0C和0x0D,ChipScope中截取發(fā)送、接收數(shù)據(jù)時(shí)的相關(guān)信號(hào)波形如圖5和圖6所示。
圖5 發(fā)送數(shù)據(jù)時(shí)的信號(hào)波形
圖6 接收數(shù)據(jù)時(shí)的信號(hào)波形
5測(cè)試結(jié)果
利用周立功公司的USB-CAN II調(diào)試器和配套的CANtest軟件進(jìn)行了節(jié)點(diǎn)軟硬件性能測(cè)試驗(yàn)證。首先對(duì)硬件性能進(jìn)行了測(cè)試,測(cè)試內(nèi)容為不同波特率、高低溫條件下時(shí)的總線傳輸性能。測(cè)試中計(jì)算機(jī)通過調(diào)試器以5 ms為間隔給CAN節(jié)點(diǎn)發(fā)送固定內(nèi)容數(shù)據(jù)幀,CAN節(jié)點(diǎn)收到數(shù)據(jù)幀后給將收到的幀內(nèi)容發(fā)送回計(jì)算機(jī),并且每隔1 s查詢一次SJA1000總線錯(cuò)誤寄存器值發(fā)送給計(jì)算機(jī),計(jì)算機(jī)通過CANtest軟件監(jiān)測(cè)CAN節(jié)點(diǎn)發(fā)送幀數(shù)、幀內(nèi)容以及SJA1000錯(cuò)誤寄存器值,分析節(jié)點(diǎn)硬件性能,測(cè)試結(jié)果如表1所示。通過表1的測(cè)試結(jié)果可見,在高低溫條件下,節(jié)點(diǎn)硬件工作均穩(wěn)定可靠。
硬件性能測(cè)試完成后對(duì)冗余功能進(jìn)行了測(cè)試驗(yàn)證。測(cè)試中計(jì)算機(jī)以20 ms間隔分別通過2條鏈路給CAN節(jié)點(diǎn)發(fā)送固定內(nèi)容數(shù)據(jù)幀,CAN節(jié)點(diǎn)收到一幀數(shù)據(jù)幀后程序中的接收幀計(jì)數(shù)加1,同時(shí)將幀計(jì)數(shù)通過2條鏈路發(fā)送回計(jì)算機(jī),計(jì)算機(jī)通過CANtest軟件監(jiān)測(cè)CAN節(jié)點(diǎn)返回的幀內(nèi)容。分別測(cè)試2條鏈路之間發(fā)送時(shí)延小于T和大于T的情況,并測(cè)試2條鏈路發(fā)送同樣幀類型碼和不同幀類型碼的情況,測(cè)試結(jié)果如表2所示。
表1 節(jié)點(diǎn)硬件性能測(cè)試結(jié)果
表2 冗余處理功能測(cè)試
從表2的測(cè)試結(jié)果可見,當(dāng)2條鏈路上發(fā)送數(shù)據(jù)幀的幀類型碼一致并且發(fā)送時(shí)延小于T,則節(jié)點(diǎn)將收到的2幀作為一幀處理,否則將2條鏈路上的數(shù)據(jù)幀認(rèn)為是不同的2幀接收,測(cè)試結(jié)果與程序設(shè)計(jì)預(yù)期一致。
6結(jié)束語
采用FPGA作為CAN總線節(jié)點(diǎn)處理器,可靠性高,實(shí)時(shí)性好,接口靈活,并且應(yīng)用層擴(kuò)展方便,除航天應(yīng)用外,在航空和高性能要求的工業(yè)控制等領(lǐng)域等都具有很好的適用性。通過在高低溫條件下針對(duì)不同波特率進(jìn)行總線傳輸性能測(cè)試,驗(yàn)證了節(jié)點(diǎn)在惡劣工作環(huán)境下的可靠性。
與大多數(shù)采用冷冗余方案的系統(tǒng)不同,本文采用的熱冗余方案中,2條CAN總線鏈路同時(shí)工作互為熱備份,當(dāng)一條鏈路出現(xiàn)故障時(shí)另一條鏈路工作完全不受影響,不存在總線切換數(shù)據(jù)重發(fā)過程,系統(tǒng)實(shí)時(shí)性得到保證。
本設(shè)計(jì)經(jīng)過測(cè)試驗(yàn)證后已成功應(yīng)用于系統(tǒng)中,在軌工作穩(wěn)定,為航空航天領(lǐng)域中的CAN總線系統(tǒng)設(shè)計(jì)提供了一種高可靠性的設(shè)計(jì)方案。
參考文獻(xiàn)
[1]廉保旺,李勇,張怡.CAN總線系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].無線電工程,2000,30(1):12-15.
[2]周新發(fā),尚志,劉群.工業(yè)現(xiàn)場(chǎng)CAN總線技術(shù)在航天領(lǐng)域的應(yīng)用[J].現(xiàn)場(chǎng)總線與網(wǎng)絡(luò)技術(shù),2006(1):60-63,96.
[3]禹春來,許化龍,劉根旺,等.CAN總線冗余方法研究[J].測(cè)控技術(shù),2003,22(10):28-30.
[4]楊亮,賈慶軒,孫漢旭.冗余CAN總線系統(tǒng)設(shè)計(jì)[J].機(jī)電產(chǎn)品開發(fā)與創(chuàng)新,2007,20(5):4-5,8.
[5]鄒志慧.CAN總線分析、實(shí)現(xiàn)及應(yīng)用實(shí)例[J].無線電工程,2006,36(1):51-54.
[6]張培坤,高偉,宋宗喜,等.基于FPGA的CAN總線通信節(jié)點(diǎn)設(shè)計(jì)[J].儀表技術(shù)與傳感器,2010(12):68-70.
[7]吳坎.基于SJA1000和PCA82C250的CAN總線接口設(shè)計(jì)[J].機(jī)械設(shè)計(jì)與制造,2010(7):55-57.
[8]蘇虎平,沈三民,劉文怡,等.基于冗余CAN 總線的實(shí)時(shí)通信系統(tǒng)設(shè)計(jì)[J].總線與網(wǎng)絡(luò),2013(1):26-29,55.
[9]杜尚豐,曹曉鐘,徐津.CAN總線測(cè)控技術(shù)及其應(yīng)用[M].北京:電子工業(yè)出版社,2007.
[10]賈長(zhǎng)春.基于SJA1000的CAN總線智能節(jié)點(diǎn)設(shè)計(jì)[J].工業(yè)控制計(jì)算機(jī),2015,28(2):5-6.
[11]杜倩倩.雙冗余CAN總線模塊研制[D].哈爾濱:哈爾濱工業(yè)大學(xué),2011.
[12]陳萍,姜秀杰.基于FPGA的CAN總線通信系統(tǒng)[J].計(jì)算機(jī)測(cè)量與控制,2009,17(12):2 482-2 484.
doi:10.3969/j.issn.1003-3106.2016.07.19
收稿日期:2016-03-09
基金項(xiàng)目:國(guó)家高技術(shù)研究發(fā)展計(jì)劃(“863”計(jì)劃)基金資助(SS2015AA011303)。
中圖分類號(hào)TP391.4
文獻(xiàn)標(biāo)志碼A
文章編號(hào)1003-3106(2016)07-0071-05
作者簡(jiǎn)介
孫大元男,(1985—),工程師。主要研究方向:航天測(cè)控。
閆冬女,(1985—),工程師。主要研究方向:航天測(cè)控。
Design of Redundancy CAN Bus Communication Node Based on FPGA
SUN Da-yuan,YAN Dong
(The54thResearchInstituteofCETC,ShijiazhuangHebei050081,China)
AbstractIn view of the requirements for high reliability of the communication system in aerospace field,a design of redundancy CAN bus node is proposed based on FPGA,SJA1000 and PCA82C250.The selection principle of CAN bus redundancy mode is introduced,the hardware design of CAN bus node with controller redundancy and the design of the FPGA control program are described in detail.Then,the paper focuses on explaining the initialization flow of SJA1000,message sending/receiving process,error handling of SJA1000 and data selection strategy under hot backup condition of the link.The control timing of SJA1000 is verified by the simulation result of the FPGA program,and finally the transmission performance test under high and low temperature and the function test of redundancy data processing are made.The test results prove that the CAN bus node has high real-time performance and high stability,and the design is suitable for many fields which require high reliability such as space field and aviation field.
Key wordsCAN bus;FPGA;redundancy;CAN controller;SJA1000
引用格式:孫大元,閆冬.基于FPGA的冗余CAN總線通信節(jié)點(diǎn)設(shè)計(jì)[J].無線電工程,2016,46(7):71-75.