文/張席旗 白創(chuàng)
(長(zhǎng)沙理工大學(xué)物理與電子科學(xué)學(xué)院 湖南省長(zhǎng)沙市 410114)
CAN控制器局域網(wǎng)[1-2](Controller Area Network)是一種高抗干擾性、高可靠性、高實(shí)時(shí)性和高性價(jià)比的現(xiàn)場(chǎng)總線[3]之一,它能有效地提供分布式實(shí)時(shí)控制[4],且具有非常高的安全級(jí)別[5],其通信速率可達(dá)1Mbps[6]。因此廣泛應(yīng)用于汽車、工業(yè)自動(dòng)化、數(shù)字信號(hào)處理(DSP)等領(lǐng)域[7-8]。
在傳統(tǒng)的CAN模塊設(shè)計(jì)中,會(huì)有傳輸速率較慢、傳輸資源較少、傳輸時(shí)間不確定、抗干擾性較弱等缺陷。例如,在基于單片機(jī)的CAN模塊[9]會(huì)出現(xiàn)傳輸數(shù)據(jù)較少和抗干擾性較弱的現(xiàn)象。在基于CPI系統(tǒng)總線的3U結(jié)構(gòu)的CAN模塊[10]其設(shè)計(jì)上采用雙口RAM的緩沖區(qū)結(jié)構(gòu),雖然克服了丟幀現(xiàn)象,但是傳輸速率不快。本文所設(shè)計(jì)的ECAN模塊,帶有32個(gè)消息郵箱且每個(gè)郵箱都帶有時(shí)間戳計(jì)數(shù)器寄存器以及消息對(duì)象超時(shí)寄存器,這樣總線傳輸?shù)臄?shù)據(jù)量更大、速率更快以及通信更加靈活可靠。
ECAN模塊是與CAN2.0B標(biāo)準(zhǔn)協(xié)議完全兼容。ECAN模塊是帶有32個(gè)完全可配置的郵箱和定時(shí)郵遞(time-stamping)功能的增強(qiáng)型CAN總線模塊,它能夠?qū)崿F(xiàn)靈活穩(wěn)定的串行通信接口。與其它的CAN模塊相比,它主要增加了郵箱的數(shù)量、時(shí)間標(biāo)識(shí)和超時(shí)功能。ECAN總線模塊框圖如圖1所示。
ECAN控制器的內(nèi)部是32位的,主要由以下幾部分構(gòu)成:
(1)CAN協(xié)議內(nèi)核(CPK);
(2)消息控制器:存儲(chǔ)器管理單元(MMU)、CPU接口、接收控制單元(接收濾波)和定時(shí)器管理單元;可以存儲(chǔ)32個(gè)消息的郵箱存儲(chǔ)器;控制和狀態(tài)控制器。
CAN 協(xié)議內(nèi)核(CPK)的兩個(gè)功能:解碼在CAN總線上接收到的所有消息,并把這些消息轉(zhuǎn)移到接收緩沖器;根據(jù)CAN協(xié)議傳輸CAN總線上的消息。
CAN控制器的消息控制器是負(fù)責(zé)確認(rèn)CPK接收到的消息是否被CPU使用還是被丟棄。
本文所設(shè)計(jì)的ECAN模塊硬件電路代碼主要由ecan_rece、ecan_regs、ecan_txd、ecan_rxd四部分組成。其中ecan_rece主要是根據(jù)CAN協(xié)議對(duì)總線上接收到的消息和所需要發(fā)送的消息按照協(xié)議進(jìn)行處理;ecan_regs模塊主要用于控制狀態(tài)寄存器進(jìn)行相關(guān)處理以及對(duì)于郵箱空間的讀寫訪問;ecan_txd模塊用于將需要發(fā)送的消息發(fā)送至CAN總線;ecan_rxd模塊主要用于接收CAN總線的數(shù)據(jù)并將數(shù)據(jù)傳遞給ecan_rece模塊。ECAN硬件設(shè)計(jì)模塊結(jié)構(gòu)圖如圖2所示。
圖1:ECAN總線模塊框圖
圖2:ECAN硬件設(shè)計(jì)模塊結(jié)構(gòu)圖
1.2.1 ecan_rece模塊
圖3:時(shí)間標(biāo)識(shí)功能流程圖
圖4:消息發(fā)送或接收超時(shí)功能流程圖
圖5:初始化進(jìn)程流程圖
ecan_rece模塊接收到有效的消息后,對(duì)消息進(jìn)行解碼分析,確定是否將接收到的消息存儲(chǔ)到郵箱存儲(chǔ)器中。接收控制單元檢查消息的狀態(tài)、標(biāo)識(shí)符和所有消息對(duì)象的濾波,確定相應(yīng)郵箱的位置,接收到的消息經(jīng)過濾波后存放到第一個(gè)郵箱。如果接收控制單元不能找到存放接收消息的有效地址,那么接收到的消息將會(huì)被丟失。
圖6:ECAN模塊數(shù)據(jù)發(fā)送流程圖
圖7:ECAN模塊數(shù)據(jù)接收流程圖
圖8:數(shù)據(jù)幀格式
1.2.2 ecan_regs模塊
ecan_regs模塊包含控制狀態(tài)寄存器、郵箱讀寫配置寄存器以及ECAN模塊配置、中斷等各種寄存器。其中ECAN模塊的時(shí)間標(biāo)識(shí)功能以及超時(shí)功能就在此模塊進(jìn)行設(shè)計(jì)。
ECAN模塊每個(gè)郵箱內(nèi)部都有消息對(duì)象時(shí)間戳寄存器(MOTS),當(dāng)消息成功發(fā)送或者接收時(shí),該寄存器會(huì)分別記錄下當(dāng)時(shí)消息發(fā)送和接收時(shí)刻時(shí)間戳計(jì)數(shù)器(CANTSC)的值。這樣通過計(jì)算消息發(fā)送和成功接收到的差值就可以得到消息傳輸?shù)臅r(shí)間。時(shí)間標(biāo)識(shí)功能流程圖如圖3所示。
圖9:ECAN數(shù)據(jù)發(fā)送接收
圖10:ECAN數(shù)據(jù)發(fā)送移位
圖11:代碼覆蓋率
ECAN模塊的每個(gè)郵箱內(nèi)部都有消息超時(shí)寄存器(MOTO),當(dāng)發(fā)送消息或接收消息時(shí),消息超時(shí)寄存器(MOTO)中的值會(huì)與時(shí)間戳計(jì)數(shù)器(CANTSC)中的值進(jìn)行比較。若時(shí)間戳計(jì)數(shù)器(CANTSC)中的值大于消息超時(shí)寄存器(MOTO)中的值,則超時(shí)控制寄存器(CANTOC)以及超時(shí)狀態(tài)寄存器(CANTOS)會(huì)被置1,此時(shí)表示發(fā)送消息或接收消息已超時(shí)。消息發(fā)送或接收功能流程圖如圖4所示。
1.2.3 ecan_txd模塊與ecan_rxd模塊
當(dāng)需要發(fā)送消息時(shí),消息控制器將要發(fā)送的消息傳送到ecan_txd模塊,以便在下一個(gè)總線空閑狀態(tài)開始發(fā)送該信息。當(dāng)有多個(gè)消息需要發(fā)送時(shí),ecan_rece模塊將準(zhǔn)備發(fā)送消息中優(yōu)先級(jí)最高的傳送到ecan_txd模塊。如果兩個(gè)郵箱有相同的優(yōu)先級(jí),選擇郵箱編號(hào)大的郵箱內(nèi)存放的消息。
當(dāng)需要接收消息時(shí),消息控制器將接收到的消息傳送給ecan_rxd模塊,然后ecan_rxd模塊對(duì)接收到的數(shù)據(jù)進(jìn)行位填充、錯(cuò)誤檢測(cè)等處理,以供CPU讀取。
在使用CAN模塊前必須將其初始化。將主控制寄存器的更改配置請(qǐng)求位CCR(CANMC.12)置1,表示啟動(dòng)初始化配置模式;將錯(cuò)誤和狀態(tài)寄存器的更改配置使能位CCE(CANES.4)置1,激活初始化配置模式。當(dāng)CCE和CCR都為1時(shí),ECAN控制器的位定時(shí)參數(shù)位被使能,配置位定時(shí)參數(shù)完成后;CCR置0,ECAN模塊進(jìn)入正常模式。ECAN模塊初始化進(jìn)程流程圖如圖5所示。
CPU將需要發(fā)送的數(shù)據(jù)先存放到ECAN模塊的發(fā)送郵箱。使能郵箱使能位CANME[n],當(dāng)數(shù)據(jù)和標(biāo)識(shí)符寫入發(fā)送郵箱后,此時(shí)將相應(yīng)的發(fā)送請(qǐng)求設(shè)置位CANTRS[n]置位,消息便會(huì)發(fā)送出去。ECAN模塊數(shù)據(jù)發(fā)送流程圖如圖6所示。
ECAN模塊中數(shù)據(jù)以報(bào)文的形式進(jìn)行傳輸,當(dāng)?shù)竭_(dá)一個(gè)節(jié)點(diǎn)時(shí)ECAN控制器會(huì)將接收到的報(bào)文的標(biāo)識(shí)符與ECAN控制器內(nèi)的各個(gè)郵箱標(biāo)識(shí)符相比較;若報(bào)文標(biāo)識(shí)符與ECAN控制器內(nèi)相應(yīng)的郵箱標(biāo)識(shí)符相匹配,則ECAN控制器將相應(yīng)的接收消息掛起位CANRMP[n]置位,并產(chǎn)生中斷;若報(bào)文標(biāo)識(shí)符與ECAN控制器內(nèi)所有的郵箱標(biāo)識(shí)符都不匹配,則ECAN控制器不接收此報(bào)文。ECAN模塊數(shù)據(jù)接收流程圖如圖7所示。
ECAN模塊的硬件設(shè)計(jì)是采用Verilog HDL硬件語(yǔ)言進(jìn)行描述,在cadence環(huán)境下調(diào)用SimVision進(jìn)行仿真。ECAN模塊中有兩個(gè)CAN控制器,分別為CANA和CANB。選擇CANA為接收,CANB為發(fā)送,CANB按照CAN協(xié)議向CANA中發(fā)送如圖8所示的標(biāo)準(zhǔn)數(shù)據(jù)幀。
在此次仿真中,前一段時(shí)間是在進(jìn)行ECAN各個(gè)寄存器的配置,配置完成后,檢測(cè)到起始幀SOF后開始發(fā)送數(shù)據(jù)。選擇發(fā)送一個(gè)ID為00000000001(按照CAN協(xié)議的規(guī)定仲裁域部分為12位,前11位為ID第12位為RTR位,數(shù)據(jù)幀中RTR位為0)的數(shù)據(jù)域?yàn)槊孔止?jié)8位的8字節(jié)數(shù)據(jù)的標(biāo)準(zhǔn)幀。如圖9所示,數(shù)字域?yàn)槊孔止?jié)8位的8字節(jié)的標(biāo)準(zhǔn)數(shù)據(jù)幀共108位,因?yàn)閹Y(jié)尾是7位高電平,所以在設(shè)計(jì)中發(fā)送完ACK低電平之后,總線就會(huì)拉高。
每當(dāng)信號(hào)data_rlf上升沿來到時(shí)send_data經(jīng)過一個(gè)周期的延時(shí)向左移一位,總共移位83次,CRC校驗(yàn)域是通過算法計(jì)算所得。按照CAN協(xié)議中的CRC填充準(zhǔn)則,當(dāng)總線上出現(xiàn)每五個(gè)相同電平時(shí),總線會(huì)發(fā)送一個(gè)與之前相反的填充電平,這樣避免總線上出現(xiàn)太多連續(xù)相同的電平時(shí),使收發(fā)雙方失步,導(dǎo)致仿真錯(cuò)誤。在圖9中CANA接收的數(shù)據(jù)的后四位為CRC計(jì)算值。CANBTX向CANARX發(fā)送時(shí)同時(shí)也會(huì)給CANBRX發(fā)送,當(dāng)CANARX和CANBRX接收到數(shù)據(jù)相同時(shí)則會(huì)產(chǎn)生一個(gè)ACK應(yīng)答信號(hào)(低電平)。當(dāng)CANBTX發(fā)送的數(shù)據(jù)與CANARX接收的數(shù)據(jù)一樣時(shí),CANATX也會(huì)給一個(gè)ACK應(yīng)答信號(hào)。ECAN數(shù)據(jù)發(fā)送移位仿真圖如圖10所示。
利用Cadence軟件中的NC-Verilog編譯器,來測(cè)試代碼覆蓋率。仿真結(jié)果如圖11所示,結(jié)果顯示所設(shè)計(jì)的代碼的覆蓋率均達(dá)到100%。
本文設(shè)計(jì)的ECAN模塊,完全兼容CAN2.0B協(xié)議,通過仿真驗(yàn)證ECAN模塊中CANB發(fā)出的數(shù)據(jù)CANA成功收到且CRC校驗(yàn)正確,ACK應(yīng)答信號(hào)在CANA收到正確的數(shù)據(jù)后成功拉低,最后成功實(shí)現(xiàn)了ECAN模塊的通信。