摘要:機載產(chǎn)品通常系統(tǒng)復(fù)雜,功能單元眾多,實現(xiàn)國產(chǎn)化周期長、難度大。FPGA是一種通過編程改變邏輯功能的半定制芯片,具有編程配置靈活、開發(fā)周期短等特點,為機載產(chǎn)品國產(chǎn)化提供了新思路。鑒于此,深入研究了CAN總線通信協(xié)議,分析了CAN驅(qū)動的數(shù)據(jù)流和組織結(jié)構(gòu),實現(xiàn)了基于FPGA的SJA1000 CAN總線驅(qū)動設(shè)計,并將該設(shè)計應(yīng)用于某綜合電子戰(zhàn)管理系統(tǒng),證實了其有效性和可靠性。
關(guān)鍵詞:FPGA;CAN總線;驅(qū)動設(shè)計
中圖分類號:TP311" 文獻標志碼:A" 文章編號:1671-0797(2023)07-0056-03
DOI:10.19514/j.cnki.cn32-1628/tm.2023.07.014
0" " 引言
隨著嵌入式系統(tǒng)互聯(lián)通信的高速發(fā)展,傳統(tǒng)的RS232、RS485、RS422等總線受傳輸距離、抗干擾能力、負載能力、傳輸速率的影響,逐漸制約了嵌入式系統(tǒng)的發(fā)展。
CAN總線系統(tǒng)是一種多主控的總線系統(tǒng),在總線控制器的協(xié)調(diào)下實現(xiàn)兩個節(jié)點之間大量數(shù)據(jù)的傳輸,由于CAN網(wǎng)絡(luò)消息的發(fā)送是廣播式的,即所有節(jié)點偵測的數(shù)據(jù)是一致的,因此非常適合控制信息和數(shù)據(jù)信息的傳輸[1-2]。
CAN總線具有超長的傳輸距離,理論上限為10 km,因此被廣泛應(yīng)用于超遠距離信息傳輸?shù)墓I(yè)項目中。單條總線可負載110個節(jié)點,互不干擾;高波特率保證了數(shù)據(jù)傳輸速率[3]。
由于國產(chǎn)化需求,進口芯片需要進行原位替換,面對功能可裁剪的嵌入式系統(tǒng),本文提出了一種基于FPGA實現(xiàn)的CAN總線驅(qū)動,并對其設(shè)計進行了詳細介紹。
1" " SJA1000
1.1" " CAN通信結(jié)構(gòu)
CAN通信結(jié)構(gòu)如圖1所示,以FPGA實現(xiàn)的CAN協(xié)議IP核為中心,采用CPU+FPGA+驅(qū)動器的架構(gòu)。
FPGA和CPU之間通過Local Bus進行通信,外掛國微SM65HVD230D型收發(fā)器對外進行CAN通信[4],模塊支持5路CAN總線接口。
1.2" " CAN通信幀
CAN通信幀分為兩種,包括11位標識符的標準幀和29位標識符的擴展幀,兩者只是在標識符長度即幀ID的長度上不一樣。
CAN標準幀信息包括信息和數(shù)據(jù)兩部分共11個字節(jié),前3個字節(jié)為信息部分,后8個字節(jié)為數(shù)據(jù)部分。第一個字節(jié)為幀信息,其中前4位DLC表示數(shù)據(jù)幀的實際長度,第6位(RTR)為幀類型,數(shù)據(jù)幀設(shè)置為0,遠程幀設(shè)置為1;第7位(FF)為幀格式,標準幀設(shè)置為0。標準幀格式如表1所示。
CAN擴展幀信息為13個字節(jié),前5個字節(jié)為信息部分,第一個字節(jié)與標準幀相同,剩余信息部分為報文識別碼[5]。擴展幀格式如表2所示。
CAN協(xié)議建立在OSI7層開放互聯(lián)參考模型基礎(chǔ)之上,定義了數(shù)據(jù)鏈路層和物理層,保證節(jié)點間無差錯傳輸。
2" " CAN驅(qū)動實現(xiàn)
通過FPGA實現(xiàn)了SJA1000芯片功能,能夠正確傳輸CAN通信幀;要完成數(shù)據(jù)的完整發(fā)送還需要對來自CPU的數(shù)據(jù)進行解包處理,對于來自其他模塊的CAN通信幀進行組包。因此,CAN驅(qū)動的設(shè)計由五部分構(gòu)成:CAN初始化、CAN通信幀發(fā)送和接收以及CAN通信幀的組包和解包。
2.1" " CAN初始化
綜合電子戰(zhàn)管理系統(tǒng)中存在大量的CAN節(jié)點,因此采用擴展幀進行通信。CAN初始化主要完成根據(jù)擴展幀定義的數(shù)據(jù)結(jié)構(gòu)的初始化以及相關(guān)寄存器的配置[6]。
CAN通信幀的幀格式設(shè)置為擴展幀,幀類型設(shè)置為數(shù)據(jù)幀,每幀的數(shù)據(jù)長度設(shè)置為8個字節(jié),數(shù)據(jù)和報文識別碼初始化為0。在通信幀發(fā)送之前需要根據(jù)用戶需求對以上數(shù)據(jù)重新設(shè)置,確保通信幀的正確性。初始化還需要申請用于存放接收的通信幀ringbuffer空間,用于存放多組通信幀。對CAN寄存器的配置主要包括波特率、中斷使能、時鐘分頻以及輸出控制器等。以波特率配置為例,需要對總線時序寄存器0和總線時序寄存器1同時進行配置,兩個寄存器根據(jù)約束條件能夠搭配出不同的采樣率以適應(yīng)不同的系統(tǒng)需求。初始化還包括信號量創(chuàng)建、中間數(shù)據(jù)存儲空間申請、中斷掛接以及獲取CAN通信幀任務(wù)的創(chuàng)建。
2.2" " CAN通信幀發(fā)送和接收
CAN通信幀發(fā)送前完成通信幀的配置并對傳輸緩沖區(qū)狀態(tài)進行判斷,在發(fā)送結(jié)束前對傳輸完成狀態(tài)進行判斷,確保通信幀已完成發(fā)送。
CAN通信幀接收之前對接收緩沖區(qū)狀態(tài)進行判斷,當存在數(shù)據(jù)消息時進行獲取。通信數(shù)據(jù)的全部CAN通信幀接收完成之后需要進行組包處理,因此需要先將這些CAN通信幀存儲到緩沖區(qū)中。每次完成通信幀的接收通過設(shè)置命令寄存器釋放接收緩沖區(qū),確保后續(xù)通信幀的正確傳輸。
2.3" " CAN通信幀的組包和解包
CAN通信幀的解包將來自用戶的數(shù)據(jù)分解成CAN通信幀,通過調(diào)用CAN通信幀發(fā)送接口將每一幀CAN數(shù)據(jù)發(fā)送出去。CAN通信幀的組包將來自CAN總線通信幀中的數(shù)據(jù)部分進行組裝拼接,將完整的數(shù)據(jù)反饋給用戶。
完成用戶的數(shù)據(jù)的解包,需要對每個通信幀的數(shù)據(jù)進行存儲,然后統(tǒng)一將這些CAN通信幀發(fā)送出去。因此CAN通信幀的發(fā)送也需要建立發(fā)送ringbuffer進行臨時存儲,發(fā)送ringbuffer的大小不小于解包后的數(shù)據(jù)量。為保證發(fā)送ringbuffer中數(shù)據(jù)的正確性,對解包進行同步處理,即在解包前獲取信號量,在發(fā)送完成后釋放信號量。
CAN通信幀的發(fā)送通過寫控制寄存器完成,便于控制;接收則是通過中斷方式完成,效率高。
為了提高系統(tǒng)性能,在初始化階段創(chuàng)建接收CAN通信幀的任務(wù),接收任務(wù)的優(yōu)先級大于應(yīng)用任務(wù),確保數(shù)據(jù)接收的效率。接收任務(wù)完成CAN通信幀中數(shù)據(jù)的組裝和拼接,將組裝完成的數(shù)據(jù)暫存到用戶數(shù)據(jù)ringbuffer中,在用戶發(fā)起數(shù)據(jù)獲取操作時將數(shù)據(jù)反饋給用戶。
CAN總線驅(qū)動設(shè)計中采用發(fā)送ringbuffer、接收ringbuffer和用戶數(shù)據(jù)ringbuffer三重數(shù)據(jù)緩沖結(jié)構(gòu),使得用戶發(fā)送和接收的數(shù)據(jù)的正確性、完整性得到保障。CAN通信的數(shù)據(jù)流圖如圖2所示。
綜合電子戰(zhàn)管理系統(tǒng)中CAN網(wǎng)絡(luò)邏輯互聯(lián)采用多網(wǎng)段獨立拓撲方式,通過FPGA實現(xiàn)5路獨立的CAN總線功能。CAN總線需要對5路進行初始化,數(shù)據(jù)的發(fā)送通過同步機制按順序下發(fā)5個通道的數(shù)據(jù),數(shù)據(jù)的接收則對5個通道的數(shù)據(jù)同時存儲。
3" " 功能測試
自測試階段完成了5路CAN總線的自環(huán)測試,單通道發(fā)送,剩余通道接收。聯(lián)試階段將本文的CAN總線驅(qū)動應(yīng)用于某綜合電子戰(zhàn)管理系統(tǒng),計算機板為主節(jié)點,與機架內(nèi)的其他模塊一起掛接在CAN 0通道上,機架外4臺設(shè)備分別連接到剩余4個通道。
主節(jié)點發(fā)送數(shù)據(jù)到5個通道中,通過CAN盒可以檢測到CAN總線中的數(shù)據(jù)。系統(tǒng)初始化成功后,主節(jié)點與其他節(jié)點間進行了長時間的通信,經(jīng)測試該系統(tǒng)穩(wěn)定、可靠。CAN總線0通道實驗結(jié)果如圖3所示。
4" " 結(jié)語
本文研究了基于FPGA的CAN總線驅(qū)動設(shè)計,提出了三重環(huán)形緩沖結(jié)構(gòu),并以某綜合電子戰(zhàn)管理系統(tǒng)為應(yīng)用背景,對該驅(qū)動設(shè)計進行了測試,驗證了該驅(qū)動的正確性以及該設(shè)計的可靠性。
[參考文獻]
[1] 劉吉平,鄭增忠,林少東.基于HK32F103的CAN的驅(qū)動實現(xiàn)[J].中國集成電路,2022,31(4):72-77.
[2] 劉海龍,吳海波,張蕾.基于S3C6410及Wince系統(tǒng)的CAN驅(qū)動的設(shè)計與優(yōu)化[J].電子設(shè)計工程,2021,29(8):72-76.
[3] 尹加豹,朱濤,崔凱華.VxWorks系統(tǒng)下CAN驅(qū)動的設(shè)計與優(yōu)化[J].計算機工程,2020,46(3):192-197.
[4] 史小燕,朱建鴻.波特率自適應(yīng)的CAN驅(qū)動在嵌入式Linux下的實現(xiàn)[J].計算機系統(tǒng)應(yīng)用,2018,27(1):231-234.
[5] 趙向坤.VxWorks下CAN總線驅(qū)動程序設(shè)計[J].工業(yè)控制計算機,2016,29(6):1-2.
[6] 張才軍,葉水生,王萬兵.Linux下基于MCP2515的CAN總線驅(qū)動程序設(shè)計[J].數(shù)字技術(shù)與應(yīng)用,2016(4):179.
收稿日期:2022-12-25
作者簡介:張興雷(1993—),男,河北人,工程師,研究方向:嵌入式驅(qū)動。