




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