文/張席旗 白創(chuàng)
(長沙理工大學物理與電子科學學院 湖南省長沙市 410114)
CAN控制器局域網(wǎng)[1-2](Controller Area Network)是一種高抗干擾性、高可靠性、高實時性和高性價比的現(xiàn)場總線[3]之一,它能有效地提供分布式實時控制[4],且具有非常高的安全級別[5],其通信速率可達1Mbps[6]。因此廣泛應用于汽車、工業(yè)自動化、數(shù)字信號處理(DSP)等領域[7-8]。
在傳統(tǒng)的CAN模塊設計中,會有傳輸速率較慢、傳輸資源較少、傳輸時間不確定、抗干擾性較弱等缺陷。例如,在基于單片機的CAN模塊[9]會出現(xiàn)傳輸數(shù)據(jù)較少和抗干擾性較弱的現(xiàn)象。在基于CPI系統(tǒng)總線的3U結構的CAN模塊[10]其設計上采用雙口RAM的緩沖區(qū)結構,雖然克服了丟幀現(xiàn)象,但是傳輸速率不快。本文所設計的ECAN模塊,帶有32個消息郵箱且每個郵箱都帶有時間戳計數(shù)器寄存器以及消息對象超時寄存器,這樣總線傳輸?shù)臄?shù)據(jù)量更大、速率更快以及通信更加靈活可靠。
ECAN模塊是與CAN2.0B標準協(xié)議完全兼容。ECAN模塊是帶有32個完全可配置的郵箱和定時郵遞(time-stamping)功能的增強型CAN總線模塊,它能夠實現(xiàn)靈活穩(wěn)定的串行通信接口。與其它的CAN模塊相比,它主要增加了郵箱的數(shù)量、時間標識和超時功能。ECAN總線模塊框圖如圖1所示。
ECAN控制器的內部是32位的,主要由以下幾部分構成:
(1)CAN協(xié)議內核(CPK);
(2)消息控制器:存儲器管理單元(MMU)、CPU接口、接收控制單元(接收濾波)和定時器管理單元;可以存儲32個消息的郵箱存儲器;控制和狀態(tài)控制器。
CAN 協(xié)議內核(CPK)的兩個功能:解碼在CAN總線上接收到的所有消息,并把這些消息轉移到接收緩沖器;根據(jù)CAN協(xié)議傳輸CAN總線上的消息。
CAN控制器的消息控制器是負責確認CPK接收到的消息是否被CPU使用還是被丟棄。
本文所設計的ECAN模塊硬件電路代碼主要由ecan_rece、ecan_regs、ecan_txd、ecan_rxd四部分組成。其中ecan_rece主要是根據(jù)CAN協(xié)議對總線上接收到的消息和所需要發(fā)送的消息按照協(xié)議進行處理;ecan_regs模塊主要用于控制狀態(tài)寄存器進行相關處理以及對于郵箱空間的讀寫訪問;ecan_txd模塊用于將需要發(fā)送的消息發(fā)送至CAN總線;ecan_rxd模塊主要用于接收CAN總線的數(shù)據(jù)并將數(shù)據(jù)傳遞給ecan_rece模塊。ECAN硬件設計模塊結構圖如圖2所示。

圖1:ECAN總線模塊框圖

圖2:ECAN硬件設計模塊結構圖
1.2.1 ecan_rece模塊

圖3:時間標識功能流程圖

圖4:消息發(fā)送或接收超時功能流程圖

圖5:初始化進程流程圖
ecan_rece模塊接收到有效的消息后,對消息進行解碼分析,確定是否將接收到的消息存儲到郵箱存儲器中。接收控制單元檢查消息的狀態(tài)、標識符和所有消息對象的濾波,確定相應郵箱的位置,接收到的消息經(jīng)過濾波后存放到第一個郵箱。如果接收控制單元不能找到存放接收消息的有效地址,那么接收到的消息將會被丟失。

圖6:ECAN模塊數(shù)據(jù)發(fā)送流程圖

圖7:ECAN模塊數(shù)據(jù)接收流程圖

圖8:數(shù)據(jù)幀格式
1.2.2 ecan_regs模塊
ecan_regs模塊包含控制狀態(tài)寄存器、郵箱讀寫配置寄存器以及ECAN模塊配置、中斷等各種寄存器。其中ECAN模塊的時間標識功能以及超時功能就在此模塊進行設計。
ECAN模塊每個郵箱內部都有消息對象時間戳寄存器(MOTS),當消息成功發(fā)送或者接收時,該寄存器會分別記錄下當時消息發(fā)送和接收時刻時間戳計數(shù)器(CANTSC)的值。這樣通過計算消息發(fā)送和成功接收到的差值就可以得到消息傳輸?shù)臅r間。時間標識功能流程圖如圖3所示。

圖9:ECAN數(shù)據(jù)發(fā)送接收

圖10:ECAN數(shù)據(jù)發(fā)送移位

圖11:代碼覆蓋率
ECAN模塊的每個郵箱內部都有消息超時寄存器(MOTO),當發(fā)送消息或接收消息時,消息超時寄存器(MOTO)中的值會與時間戳計數(shù)器(CANTSC)中的值進行比較。若時間戳計數(shù)器(CANTSC)中的值大于消息超時寄存器(MOTO)中的值,則超時控制寄存器(CANTOC)以及超時狀態(tài)寄存器(CANTOS)會被置1,此時表示發(fā)送消息或接收消息已超時。消息發(fā)送或接收功能流程圖如圖4所示。
1.2.3 ecan_txd模塊與ecan_rxd模塊
當需要發(fā)送消息時,消息控制器將要發(fā)送的消息傳送到ecan_txd模塊,以便在下一個總線空閑狀態(tài)開始發(fā)送該信息。當有多個消息需要發(fā)送時,ecan_rece模塊將準備發(fā)送消息中優(yōu)先級最高的傳送到ecan_txd模塊。如果兩個郵箱有相同的優(yōu)先級,選擇郵箱編號大的郵箱內存放的消息。
當需要接收消息時,消息控制器將接收到的消息傳送給ecan_rxd模塊,然后ecan_rxd模塊對接收到的數(shù)據(jù)進行位填充、錯誤檢測等處理,以供CPU讀取。
在使用CAN模塊前必須將其初始化。將主控制寄存器的更改配置請求位CCR(CANMC.12)置1,表示啟動初始化配置模式;將錯誤和狀態(tài)寄存器的更改配置使能位CCE(CANES.4)置1,激活初始化配置模式。當CCE和CCR都為1時,ECAN控制器的位定時參數(shù)位被使能,配置位定時參數(shù)完成后;CCR置0,ECAN模塊進入正常模式。ECAN模塊初始化進程流程圖如圖5所示。
CPU將需要發(fā)送的數(shù)據(jù)先存放到ECAN模塊的發(fā)送郵箱。使能郵箱使能位CANME[n],當數(shù)據(jù)和標識符寫入發(fā)送郵箱后,此時將相應的發(fā)送請求設置位CANTRS[n]置位,消息便會發(fā)送出去。ECAN模塊數(shù)據(jù)發(fā)送流程圖如圖6所示。
ECAN模塊中數(shù)據(jù)以報文的形式進行傳輸,當?shù)竭_一個節(jié)點時ECAN控制器會將接收到的報文的標識符與ECAN控制器內的各個郵箱標識符相比較;若報文標識符與ECAN控制器內相應的郵箱標識符相匹配,則ECAN控制器將相應的接收消息掛起位CANRMP[n]置位,并產(chǎn)生中斷;若報文標識符與ECAN控制器內所有的郵箱標識符都不匹配,則ECAN控制器不接收此報文。ECAN模塊數(shù)據(jù)接收流程圖如圖7所示。
ECAN模塊的硬件設計是采用Verilog HDL硬件語言進行描述,在cadence環(huán)境下調用SimVision進行仿真。ECAN模塊中有兩個CAN控制器,分別為CANA和CANB。選擇CANA為接收,CANB為發(fā)送,CANB按照CAN協(xié)議向CANA中發(fā)送如圖8所示的標準數(shù)據(jù)幀。
在此次仿真中,前一段時間是在進行ECAN各個寄存器的配置,配置完成后,檢測到起始幀SOF后開始發(fā)送數(shù)據(jù)。選擇發(fā)送一個ID為00000000001(按照CAN協(xié)議的規(guī)定仲裁域部分為12位,前11位為ID第12位為RTR位,數(shù)據(jù)幀中RTR位為0)的數(shù)據(jù)域為每字節(jié)8位的8字節(jié)數(shù)據(jù)的標準幀。如圖9所示,數(shù)字域為每字節(jié)8位的8字節(jié)的標準數(shù)據(jù)幀共108位,因為幀結尾是7位高電平,所以在設計中發(fā)送完ACK低電平之后,總線就會拉高。
每當信號data_rlf上升沿來到時send_data經(jīng)過一個周期的延時向左移一位,總共移位83次,CRC校驗域是通過算法計算所得。按照CAN協(xié)議中的CRC填充準則,當總線上出現(xiàn)每五個相同電平時,總線會發(fā)送一個與之前相反的填充電平,這樣避免總線上出現(xiàn)太多連續(xù)相同的電平時,使收發(fā)雙方失步,導致仿真錯誤。在圖9中CANA接收的數(shù)據(jù)的后四位為CRC計算值。CANBTX向CANARX發(fā)送時同時也會給CANBRX發(fā)送,當CANARX和CANBRX接收到數(shù)據(jù)相同時則會產(chǎn)生一個ACK應答信號(低電平)。當CANBTX發(fā)送的數(shù)據(jù)與CANARX接收的數(shù)據(jù)一樣時,CANATX也會給一個ACK應答信號。ECAN數(shù)據(jù)發(fā)送移位仿真圖如圖10所示。
利用Cadence軟件中的NC-Verilog編譯器,來測試代碼覆蓋率。仿真結果如圖11所示,結果顯示所設計的代碼的覆蓋率均達到100%。
本文設計的ECAN模塊,完全兼容CAN2.0B協(xié)議,通過仿真驗證ECAN模塊中CANB發(fā)出的數(shù)據(jù)CANA成功收到且CRC校驗正確,ACK應答信號在CANA收到正確的數(shù)據(jù)后成功拉低,最后成功實現(xiàn)了ECAN模塊的通信。