汪曉翔,馬 琪
(杭州電子科技大學(xué) 微電子CAD研究所,浙江 杭州 310018)
隨著應(yīng)用需求的提高,一些設(shè)備在進(jìn)行實(shí)時(shí)數(shù)據(jù)通信時(shí)需要保證數(shù)據(jù)傳輸?shù)姆€(wěn)定可靠性。CAN(Controller Area Network)總線被廣泛應(yīng)用于工業(yè)控制、汽車電子等設(shè)備之間的通信。隨著嵌入式設(shè)備的廣泛應(yīng)用,越來(lái)越多的設(shè)備之間需要使用CAN總線進(jìn)行通信。為了減少片上系統(tǒng)(System on Chip,SOC)芯片的面積和功耗,需要在SOC芯片上集成CAN總線控制器。
CAN總線可以在節(jié)點(diǎn)之間實(shí)現(xiàn)自由通信,每個(gè)節(jié)點(diǎn)可以在任意時(shí)間向總線上發(fā)送數(shù)據(jù)。節(jié)點(diǎn)采用標(biāo)識(shí)符代替?zhèn)鹘y(tǒng)的地址編碼,每個(gè)節(jié)點(diǎn)的標(biāo)識(shí)符由11位或29位組成。發(fā)送節(jié)點(diǎn)向總線發(fā)送的數(shù)據(jù)幀包含標(biāo)識(shí)符,接收節(jié)點(diǎn)可以根據(jù)標(biāo)識(shí)符接收相應(yīng)的數(shù)據(jù)幀。數(shù)據(jù)幀的數(shù)據(jù)位最高有8位,可以滿足工業(yè)控制的應(yīng)用需求。針對(duì)工業(yè)應(yīng)用的需求,本文提出了一種實(shí)時(shí)高速率的CAN總線控制器IP設(shè)計(jì)方法。
CAN總線控制器需要完成數(shù)據(jù)從物理層、傳輸層到對(duì)象層的傳輸[1-2]。其中,物理層是數(shù)據(jù)傳輸?shù)闹匾浇椋粋鬏攲?,即?shù)據(jù)鏈路層是CAN總線的核心部分,負(fù)責(zé)把從物理層接收到的數(shù)據(jù)提供給對(duì)象層,以及把從對(duì)象層需要發(fā)送的數(shù)據(jù)轉(zhuǎn)換成數(shù)據(jù)幀提供給物理層。CAN總線控制器需要完成CAN2.0協(xié)議的全部?jī)?nèi)容。
CAN2.0協(xié)議的報(bào)文幀類型分為:數(shù)據(jù)幀、遠(yuǎn)程幀、錯(cuò)誤幀和過載幀[3-4]。數(shù)據(jù)幀從發(fā)送端傳遞數(shù)據(jù)到接收端,一個(gè)數(shù)據(jù)幀由7個(gè)不同域組成:幀起始域、仲裁域、控制域、數(shù)據(jù)域、CRC域、應(yīng)答域和幀結(jié)尾域;遠(yuǎn)程幀作為數(shù)據(jù)接收端的站通過其資源節(jié)點(diǎn)對(duì)不同的數(shù)據(jù)傳送進(jìn)行初始化設(shè)置;錯(cuò)誤幀由兩個(gè)不同的域組成,第一個(gè)域是不同站提供的錯(cuò)誤標(biāo)志的疊加,第二個(gè)域是錯(cuò)誤界定符[5-6]。
CAN總線信息以不同格式的固定報(bào)文發(fā)送,報(bào)文長(zhǎng)度可以自由配置。當(dāng)總線空閑時(shí),任何連接的節(jié)點(diǎn)都可以開始發(fā)送新的報(bào)文。CAN節(jié)點(diǎn)可以靈活添加到CAN網(wǎng)絡(luò)中,不需要改變其他信息。CAN節(jié)點(diǎn)報(bào)文具有優(yōu)先級(jí),當(dāng)多個(gè)節(jié)點(diǎn)同時(shí)向總線發(fā)送信息時(shí),優(yōu)先級(jí)低的節(jié)點(diǎn)會(huì)主動(dòng)退出,高優(yōu)先級(jí)的節(jié)點(diǎn)不受影響,繼續(xù)發(fā)送信息。CAN總線允許在報(bào)文濾波中將識(shí)別符設(shè)置為可屏蔽的內(nèi)容,從而不接收這組報(bào)文。CAN總線具有嚴(yán)格的錯(cuò)誤檢測(cè)功能,包含位錯(cuò)誤、填充錯(cuò)誤、形式錯(cuò)誤、應(yīng)答錯(cuò)誤和CRC校驗(yàn)[7-8]。
CAN總線控制器主要由狀態(tài)控制寄存器模塊、比特流處理模塊、位時(shí)序模塊、接收濾波模塊、錯(cuò)誤管理模塊、接收發(fā)送FIFO模塊組成。如圖1所示,狀態(tài)控制寄存器模塊包含狀態(tài)控制寄存器和數(shù)據(jù)寄存器;比特流處理模塊主要完成發(fā)送和接收狀態(tài)機(jī)的數(shù)據(jù)傳輸,完成數(shù)據(jù)流的處理;接收濾波模塊屏蔽不想被接收的數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)選擇;錯(cuò)誤管理模塊用于檢測(cè)發(fā)送和接收的比特流是否會(huì)出現(xiàn)錯(cuò)誤;接收和發(fā)送FIFO模塊將需要發(fā)送和接收的數(shù)據(jù)緩存在FIFO中,使數(shù)據(jù)傳輸高效進(jìn)行。
圖1 CAN總線控制器的設(shè)計(jì)結(jié)構(gòu)
CAN總線控制器是一個(gè)低速模塊單元,掛載在AMBA總線的APB總線上,其接口與APB總線接口相互連接。狀態(tài)控制寄存器模塊定義了CAN總線控制器的狀態(tài)位、控制位、數(shù)據(jù)寄存器位和其他信號(hào)位。軟件和硬件的交互通過查詢、等待狀態(tài)寄存器的狀態(tài)位進(jìn)行;發(fā)送和接收的數(shù)據(jù)通過訪問數(shù)據(jù)寄存器進(jìn)行。
CAN總線控制器發(fā)送和接收數(shù)據(jù)(比特流)通過發(fā)送和接收狀態(tài)機(jī)進(jìn)行,如圖2所示。
圖2 比特流處理狀態(tài)機(jī)
發(fā)送數(shù)據(jù)由發(fā)送狀態(tài)機(jī)控制。每幀數(shù)據(jù)的標(biāo)識(shí)符和優(yōu)先權(quán)信息決定著每幀數(shù)據(jù)發(fā)送的先后順序。CAN總線控制器的發(fā)送緩沖區(qū)使能后,發(fā)送狀態(tài)機(jī)把緩沖區(qū)的數(shù)據(jù),根據(jù)發(fā)送控制邏輯和移位控制邏輯,按照CAN2.0協(xié)議的數(shù)據(jù)幀格式,將發(fā)送數(shù)據(jù)轉(zhuǎn)換成電平信號(hào),最后由發(fā)送端發(fā)送出數(shù)據(jù)。
接收數(shù)據(jù)由接收狀態(tài)機(jī)控制。接收起始位之后,進(jìn)入接收起始狀態(tài),根據(jù)幀的標(biāo)識(shí)符信息,判斷是標(biāo)準(zhǔn)幀還是擴(kuò)展幀??刂朴蛐畔⒖刂平邮諗?shù)據(jù)的長(zhǎng)度,把接收域的數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)寄存器中,將接收到的數(shù)據(jù)進(jìn)行CRC校驗(yàn),檢查接收的數(shù)據(jù)是否正確。數(shù)據(jù)被正確接收后,發(fā)送接收應(yīng)答信息,接收結(jié)束之后,發(fā)送結(jié)束標(biāo)志,一個(gè)完整的數(shù)據(jù)幀被接收。
同步分為硬同步和重同步。硬同步方式是在起始信號(hào)沿時(shí)刻,將同步段平移至該信號(hào)沿的同步方式。硬同步方式只能作用于幀的起始信號(hào)時(shí)刻。重同步方式是通過比較總線時(shí)序與節(jié)點(diǎn)時(shí)序相位誤差大小,調(diào)整節(jié)點(diǎn)相位緩沖段的大小,使得節(jié)點(diǎn)時(shí)序與總線時(shí)序同步[9-10]。
CAN協(xié)議把一個(gè)CAN數(shù)據(jù)的長(zhǎng)度分解成SS段(同步段)、PTS段(傳播時(shí)間段)、PBS1段(相位緩沖段1)、PBS2段(相位緩沖段2)。一個(gè)最小的時(shí)間單位Tq,它是系統(tǒng)時(shí)鐘的整數(shù)倍。
圖3 位時(shí)序
CAN總線控制器會(huì)檢測(cè)5種錯(cuò)誤類型:位錯(cuò)誤、填充錯(cuò)誤、CRC錯(cuò)誤、形式錯(cuò)誤和應(yīng)答錯(cuò)誤。位錯(cuò)誤:發(fā)送單元在發(fā)送位的同時(shí),也會(huì)對(duì)發(fā)送的位進(jìn)行檢測(cè)。如果檢測(cè)到的位和發(fā)送的位不相同,則發(fā)送一個(gè)位錯(cuò)誤。
填充錯(cuò)誤:如果使用位填充法的編碼信息中,檢測(cè)到6個(gè)連續(xù)相同的電平,則發(fā)送填充錯(cuò)誤。CRC錯(cuò)誤:在數(shù)據(jù)接收端接收到的CRC校驗(yàn)碼和發(fā)送的CRC校驗(yàn)碼不相同時(shí),檢測(cè)到CRC錯(cuò)誤,發(fā)送CRC錯(cuò)誤標(biāo)志[11-12]。
為了提高數(shù)據(jù)發(fā)送和接收速率,控制器在發(fā)送端和接收端均采用8位深度的FIFO設(shè)計(jì)。構(gòu)造FIFO的深度為N(N=3),F(xiàn)IFO指針地址為N+1位。讀指針和寫指針采用二進(jìn)制格雷碼表示,當(dāng)讀指針的最高位和寫指針的最高位相反,其余位相等的時(shí)候,此時(shí)FIFO為滿,F(xiàn)IFO滿標(biāo)志置1;當(dāng)讀指針和寫指針的N+1位全相等的時(shí)候,F(xiàn)IFO為空,F(xiàn)IFO為空標(biāo)志置1。
報(bào)文濾波取決于整個(gè)識(shí)別符。允許在報(bào)文濾波中將任何的識(shí)別符位設(shè)置成屏蔽的內(nèi)容,可以選擇多組識(shí)別符,使之被映射到對(duì)應(yīng)的接收緩沖器中。如果使用屏蔽寄存器,它的每一個(gè)位必須是可編程的,即它們能夠被允許或禁止報(bào)文濾波。屏蔽寄存器的長(zhǎng)度可以包含整個(gè)識(shí)別符,也可以僅包含部分的識(shí)別符[13-15]。
為驗(yàn)證CAN總線控制器,通過搭建集成CAN總線控制器的MCU的FPGA原型驗(yàn)證平臺(tái),采用CAN仿真器來(lái)驗(yàn)證CAN控制器的正確性。如圖4所示, CAN總線控制器集成在Cotex-M0內(nèi)核的MCU上,MCU包含CPU、DMA、SRAM、Flash、AMBA總線、通用串行接口、CAN總線等模塊。 CPU是整個(gè)模塊的核心部件,指令通過CPU發(fā)出,控制AMBA總線上的各個(gè)模塊有序的工作。SRAM和Flash是MCU的存儲(chǔ)模塊,用以存儲(chǔ)數(shù)據(jù)和程序。通用串行接口、CAN控制器作為MCU外設(shè)掛載到AMBA總線上。
圖4 集成CAN總線控制器的MCU驗(yàn)證平臺(tái)
將集成了CAN總線控制器、M0內(nèi)核的MCU的RTL代碼經(jīng)過FPGA綜合工具綜合、約束、布局布線,生成bit文件,隨后將bit文件下載到FPGA驗(yàn)證平臺(tái),CAN仿真器連接電腦和FPGA。CAN仿真器作為CAN總線上的一個(gè)節(jié)點(diǎn),既可以接收控制器發(fā)送的數(shù)據(jù),又可以向控制器發(fā)送數(shù)據(jù)。CAN仿真器的調(diào)試軟件CANTest作為上位機(jī),可以顯示CAN仿真器發(fā)送和接收的數(shù)據(jù),圖形化接口可以方便調(diào)試。
圖5 仿真波形圖
CAN總線控制器的端口上是發(fā)送和接收數(shù)據(jù)的電平信號(hào),通過VCS仿真工具,觀察端口上的波形,如圖5所示。
CANTest是致遠(yuǎn)電子開發(fā)的一款與CAN仿真器配套的軟件,可以直接采集CAN總線上接收和發(fā)送的數(shù)據(jù),并在終端上顯示采集到的數(shù)據(jù)。連接FPGA與CAN仿真器,將驅(qū)動(dòng)程序下載到FPGA上,進(jìn)行復(fù)位運(yùn)行,記錄端口上發(fā)送和接收的實(shí)驗(yàn)數(shù)據(jù),如表1所示。
表1 數(shù)據(jù)發(fā)送和接收傳輸結(jié)果
數(shù)據(jù)傳輸距離受到通信速率的影響,如表2所示:在通信速率1 Mbit·s-1下,在規(guī)定的距離內(nèi),數(shù)據(jù)可以正常的收發(fā);120 m距離傳輸?shù)臈l件下,采用100 kbit·s-1速率可以實(shí)現(xiàn)正常的數(shù)據(jù)傳輸。FPGA驗(yàn)證結(jié)果表明,CAN總線控制器的設(shè)計(jì)滿足設(shè)計(jì)的需求,可以兼容通用的CAN總線控制器,正常完成通信的功能。對(duì)多次實(shí)驗(yàn)中報(bào)文丟失數(shù)量進(jìn)行統(tǒng)計(jì)后發(fā)現(xiàn),CAN總線控制器報(bào)文丟失率低,可以滿足應(yīng)用需求。
表2 傳輸數(shù)據(jù)結(jié)果
本文對(duì)設(shè)計(jì)的CAN總線控制器進(jìn)行了充分驗(yàn)證,結(jié)果表明其功能滿足設(shè)計(jì)需求,能夠在1 Mbit·s-1速率下進(jìn)行可靠傳輸,遠(yuǎn)距離傳輸報(bào)文丟失率低。CAN總線控制器接口掛載在AMBA總線上,可以方便地移植到其他SOC系統(tǒng)中。