控制局域網(wǎng)(CAN)屬于現(xiàn)場總線的范疇,,它是一種有效支持分布式控制或?qū)崟r控制的串行通信網(wǎng)絡(luò)。與一般的通信總線相比,,CAN總線的數(shù)據(jù)通信可靠性,、實(shí)時性和靈活性好,應(yīng)用領(lǐng)域非常廣泛,,通?;贏RM或51單片機(jī),實(shí)現(xiàn)與CAN控制器的通信聯(lián)絡(luò),。FPGA/SOPC技術(shù)是實(shí)現(xiàn)嵌入式系統(tǒng)的最高形式,,基于IP軟核的設(shè)計與應(yīng)用也必將成為替代硬核的一種發(fā)展趨勢。憑借QuartuslI和NiosII工具,,基于FPGA的VHDL(或Verilog)語言設(shè)計的IP核能夠提供靈活性和性能更好的控制器,。
圖1為一個基于FPGA的控制器的CAN總線節(jié)點(diǎn)。其中PCA82C251是CAN總線接收器,,SJA1000是CAN總線通信控制器,,PMM8713是驅(qū)動步進(jìn)電機(jī)的脈沖分配器,,F(xiàn)PGA模塊在節(jié)點(diǎn)模型中對SJA1000進(jìn)行控制,并將接收到的幀信息進(jìn)行處理,,發(fā)送給脈沖分配器,,以驅(qū)動步進(jìn)電機(jī)。
在設(shè)計中采用自頂向下的設(shè)計方法,。通過分析SJA1000常用的控制芯片51單片機(jī)的功能,,將其分為主要的4個模塊:初始化模塊、位查詢模塊,、數(shù)據(jù)處理模塊和緩沖區(qū)釋放模塊,。
對SJA1000完成控制功能的過程用狀態(tài)圖描述如圖2所示,這也是系統(tǒng)的主狀態(tài)機(jī),。4個狀態(tài)對應(yīng)上述的4個功能模塊,,首先在initial_st-ate完成對sJA1000的初始化,在由init_end信號給出初始化完成標(biāo)志后,,進(jìn)入查詢狀態(tài),,即query_RBS狀態(tài),由位查詢模塊完成此時對SJA100 0的狀態(tài)查詢,。如果查詢到SJA1000緩沖區(qū)有幀信息,,將qRBS_end置“1”,進(jìn)入下一個狀態(tài)frame_cope,,即幀處理狀態(tài),,此時由數(shù)據(jù)處理模塊完成對緩沖區(qū)的數(shù)據(jù)讀取,并作處理,。在讀取完一幀數(shù)據(jù)后,,需要釋放緩沖區(qū),為下一幀信息的接收做準(zhǔn)備,。此時狀態(tài)轉(zhuǎn)入了release_buff-er,,對應(yīng)功能模塊中的緩沖區(qū)釋放模塊,此狀態(tài)結(jié)束后又轉(zhuǎn)入位查詢狀態(tài),,為下一幀信息接收做準(zhǔn)備。
初始化模塊主要在系統(tǒng)上電或重啟后,,先對SJA1000進(jìn)行初始化,;位查詢模塊是在初始化完成后,對SJA1000狀態(tài)寄存器的接收緩沖區(qū)標(biāo)志位不斷進(jìn)行查詢,,如果在緩沖區(qū)收到一幀信息后,,則轉(zhuǎn)入數(shù)據(jù)處理模塊,否則繼續(xù)進(jìn)行查詢,;數(shù)據(jù)處理模塊則是在查詢到接收緩沖區(qū)有數(shù)據(jù)后,,讀入幀數(shù)據(jù),,并對幀數(shù)據(jù)進(jìn)行處理;緩沖區(qū)釋放模塊是在一幀信息處理完畢后,,釋放緩沖區(qū)空間,。
除了上述4個功能模塊之外,還需要讀寫模塊,、雙端口模塊,、模塊接口控制邏輯等。
1 讀寫模塊
由SJA1000的數(shù)據(jù)手冊可知,,SJA1000提供的微處理器接口信號有地址數(shù)據(jù)復(fù)用總線AD0~AD7,、地址鎖存信號ALE、片選信號,、讀寫使能信號
和
,、以及復(fù)位信號
。
SJA1000的數(shù)據(jù)信號和地址信號是時分復(fù)用的,,而FPGA中不存在地址的概念,,對于FPGA來說,輸出的只有數(shù)據(jù),。因此設(shè)計的關(guān)鍵就是把S-JA1000中的寄存器地址當(dāng)成數(shù)據(jù)寫入到SJA1000中,,配合地址鎖存信號ALE和寫允許信號完成對SJA1000特定寄存器的命令字寫入。讀寫使能信號是
,、
以及復(fù)位信號
,。設(shè)計的關(guān)鍵就是把SJA1000中的寄存器地址當(dāng)成數(shù)據(jù)寫入到SJA1000中,配合地址鎖存信號ALE和寫允許信號
完成對SJA1000特定寄存器的命令字寫入,。與寫操作相似,,只需嚴(yán)格按照時序,將ALE,、
,、
、
引腳的電平互相配合置高或置低,,即可完成讀操作,。讀寫周期時序圖如圖3和圖4所示。
設(shè)計時采用狀態(tài)機(jī)的形式,,由讀寫時序圖可以看到,,與SJA1000讀寫相關(guān)的控制信號有ALE、,、
,、
。無論讀寫,都必須先輸出地址,,由接口控制邏輯模塊輸入地址,。AD[7..0]是數(shù)據(jù)雙向流通的,由雙端口模塊組成,,讀寫模塊與之相接口,,輸入、輸出設(shè)計分開,。讀寫模塊在與接口控制邏輯接口模塊相連接時,,輸出的數(shù)據(jù)與輸入的數(shù)據(jù)也設(shè)計分開。同樣讀寫模塊的開啟信號與讀/寫選擇信號也由接口控制邏輯給出,。由QuartuslI生成的讀寫模塊如圖5所示,。
在IDLE狀態(tài)等待,當(dāng)4個功能模塊中需要使用讀寫功能時,,由接口控制模塊控制使該功能模塊與讀寫模塊連接,,相應(yīng)的功能模塊輸出地址到讀寫模塊,接口控制模塊配合給出讀寫選擇信號,,然后進(jìn)入address狀態(tài),,輸出地址到SJA1000,判斷讀寫選擇信號后,,進(jìn)入讀狀態(tài)或者寫狀態(tài),。在讀寫子狀態(tài)只需按照時序圖輸出ale、cs,、wr,、rd的值即可,標(biāo)志信號w_ok表示一次讀/寫完成,。
在SJA1000的讀寫過程中,,對各個信號的持續(xù)時間有著嚴(yán)格的要求。以讀操作為例,,信號的有效持續(xù)時間必須最大為50 ns,,因此在設(shè)計中,
信號保持低電平的時間可以比這個時間長,。
2 接口控制邏輯模塊
接口控制邏輯是本系統(tǒng)的核心模塊,,它與4個功能模塊、讀寫模塊相連接,,由一個狀態(tài)機(jī)組成,,即系統(tǒng)的主狀態(tài)機(jī)。在狀態(tài)機(jī)的不同狀態(tài)中,,控制讀寫狀態(tài)機(jī)與對應(yīng)的功能模塊相連接,3個模塊互相配合完成一項(xiàng)功能,。QuartuslI生成的模塊圖如6所示,。
每一個功能模塊都有對應(yīng)的接口信號,,而data_in_infer、addr_out_infer,、data_in_infer,、w_ok_in、r_ok_in是讀寫模塊的信號接口,。
需要注意的是,,本系統(tǒng)中使用了主從狀態(tài)機(jī),即狀態(tài)機(jī)的嵌套,。在主狀態(tài)進(jìn)入初始化狀態(tài)機(jī)后,,立即給出一個enable信號,啟動從狀態(tài)機(jī),,并設(shè)置一個從狀態(tài)機(jī)的完成信號finish(高電平有效),,且初始值為低,然后在主狀態(tài)機(jī)不停的檢測finish信號,,如果finish為高,,則進(jìn)入下一個狀態(tài),查詢狀態(tài),。而在從狀態(tài)機(jī)中,,則不停地檢測enable信號,如果為高,,則開始工作,,當(dāng)完成從狀態(tài)機(jī)后,將finish信號置高,。如此就完成了主從狀態(tài)機(jī)的互動,。接口控制邏輯模塊中的start、end信號即為系統(tǒng)主從狀態(tài)機(jī)互動信號,。
3 初始化模塊
初始化模塊的功能是完成SJA1000的初始化,。CAN2.0B規(guī)范允許SJA1000工作在兩種模式,即BasicCAN模式和PeliCAN模式,,上電默認(rèn)為BasicCAN模式,。在兩種模式下都需要對SJA1000的模式寄存器CR、驗(yàn)收碼寄存器ACR,、驗(yàn)收屏蔽寄存器AMR,、總線定時寄存器BTR0、BTR1和輸出控制寄存器OCR寫入控制命令,。
在本設(shè)計中,,借用ROM的思想,將需要讀寫的寄存器地址和數(shù)據(jù)統(tǒng)一編碼,固化存儲起來,,對SJA1000進(jìn)行讀寫時,,只需要按照一定的順序讀出數(shù)據(jù)和地址,輸出到即可,。
4 位查詢模塊
位查詢模塊主要功能是在SJA1000轉(zhuǎn)入工作模式后能夠讀取存在接受緩沖區(qū)RXFIFO的幀信息,,在本設(shè)計中讀取幀信息采用了查詢方式,即不停地查詢SJA1000狀態(tài)寄存器SR的RBS位,,如果查詢到RBS位為“1”,,即表明接收緩沖區(qū)滿,RXFIFO中有可用信息,,此時將轉(zhuǎn)入數(shù)據(jù)處理模塊,,由數(shù)據(jù)處理模塊進(jìn)行數(shù)據(jù)讀入,并進(jìn)行處理,。在查詢過程中,,對SJA1000的狀態(tài)寄存器進(jìn)行了讀操作。
5 數(shù)據(jù)處理模塊
數(shù)據(jù)處理模塊功能是從SJA1000的緩沖區(qū)讀入數(shù)據(jù),,并作處理,。在讀入數(shù)據(jù)時,只需將輸出的地址定位到SJA1000接收緩沖區(qū)的數(shù)據(jù)場依次將數(shù)據(jù)從緩沖區(qū)讀入即可,。在CAN總線的通信中,,發(fā)送的為幀信息,其數(shù)據(jù)幀結(jié)構(gòu)如圖7所示,。
在對數(shù)據(jù)進(jìn)行處理時,,前16位為ID,有用的數(shù)據(jù)是在幀中的數(shù)據(jù)場(Data Field)中,,因此只需略過前16位,,對后面最多8個字節(jié)的數(shù)據(jù)進(jìn)行處理,分配到步進(jìn)電機(jī)的引腳上即可,。
6 緩沖區(qū)釋放模塊與雙端口模塊
在緩沖區(qū)的數(shù)據(jù)被讀入后,,需要對緩沖區(qū)的數(shù)據(jù)清零,為后續(xù)的數(shù)據(jù)讀入做準(zhǔn)備,。本質(zhì)上仍是對SJA1000的命令寄存器(CMR)寫操作,。在狀態(tài)寄存器與接收緩沖區(qū)相關(guān)的位為RRB,置1即可釋放緩沖區(qū),,這樣就會導(dǎo)致接收緩沖區(qū)內(nèi)的另一條信息立即有效,,從而進(jìn)入下一幀數(shù)據(jù)的數(shù)據(jù)查詢、處理過程,。
在本設(shè)計中,,輸出的數(shù)據(jù)引腳為雙向引腳,,設(shè)計成三態(tài)輸出,這是因?yàn)殡p向端口在完成輸入功能時,,必須使端口處于高阻態(tài),,否則外部數(shù)據(jù)不能正確讀入。
其設(shè)計關(guān)鍵在于,,實(shí)體部分必須對端口屬性進(jìn)行申明,端口屬性必須為inout類型,,在構(gòu)造體對輸出信號進(jìn)行有條件的高阻控制,。
結(jié)語
CAN總線接口控制器由VHDL語言描述,易于修改和移植,,可以將幾個軟核集成到一個FPGA芯片上去,,具有單片機(jī)所沒有的優(yōu)勢,在汽車領(lǐng)域具有良好的應(yīng)用前景,。