文獻標識碼: A
文章編號: 0258-7998(2011)01-0077-03
CAN總線是由ISO定義的串行通信總線,主要用于各種過程檢測及控制。它是一種多主總線,具有高位速率和高抗電磁干擾性,而且能夠檢測出傳輸中產生的任何錯誤。顯著的優點使得CAN總線成為國際上應用最廣泛的現場總線標準之一 [1]。
由于其優良的性能及獨特的設計,CAN總線已被廣泛地應用于各種分布式控制系統中。特別是由于CAN總線具有抗干擾性強、高數據傳輸率、低成本等優點,在小衛星和微小衛星中得到了越來越廣泛的應用。在衛星有效載荷數據控制傳輸中也會應用,如空間相機數據通信方面。
1 數據通信系統
一般來說,每個CAN模塊能夠被分成三個不同的功能塊,其結構如圖1所示[2]。CAN總線收發器提供CAN協議控制器與物理總線之間的接口,控制從CAN 控制器到總線物理層或相反的邏輯電平信號。它的性能決定了總線接口、總線終端、總線長度和節點數,是影響整個總線網絡通信性能的關鍵因素之一。CAN控制器執行在CAN 規范里規定的CAN協議,它通常用于報文緩沖和驗收濾波,對外具有與主控制器和總線收發器的接口。FGPA主控制器負責執行應用的功能,例如對空間CCD相機控制命令的發送、讀取圖像數據等。它通過對CAN控制器的編程控制CAN總線的工作方式、工作狀態以及數據的發送和接收。
在本項目的特殊環境要求下,使用FPGA作為主控芯片,控制空間相機進行數據采集與傳輸,并通過CAN總線進行數據收發。較之傳統設計使用的單片機,FPGA能夠在速度和體積上有更好的適應性。FPGA一方面減少了電路板的復雜程度,縮短了實現周期,另一方面是FPGA具有豐富的資源、超高的性能和靈活的可編程性[3],提高了整個設備的可靠性,大大增強了電路板設計的靈活性和可擴展性。
2 通信系統接口設計
電路設計如圖2所示。SJA1000的AD0~AD7地址數據復用端口、ALE地址鎖存端口、讀使能信號RD、寫使能信號WR、片選CS端口, 均通過雙向總線收發器74ALVC164245與FPGA的I/O口相連[4]。這是因為FPGA的3.3 V的LVTTL電平不支持SJA1000的5 V TTL電平,所以利用雙向總線收發器實現兩器件信號的電平轉換。SJA1000的中斷輸出信號INT連入FPGA,這樣CAN通信就可以采用中斷或查詢兩種方式。RST端口的電路實現SJA1000的上電自動復位功能。MODE模式選擇端接+5 V,設置SJA1000控制器為Intel模式。SJA1000的時鐘晶振采用16 MHz,頻率調整電容取15 pF。設計中CAN總線的終端電阻取120Ω[5]。CAN 驅動器PCA82C250的RS腳為工作模式選擇位,接地工作于高速模式,接高工作于待機模式。系統通過電阻R將芯片設定于斜率控制模式, 電阻值為47 kΩ,這時CAN總線應工作于低速模式,可提高CAN總線抵抗射頻干擾的能力。在這種情況下,可直接使用非屏蔽雙絞線作為總線[6]。
在接口設計中,有幾點需要注意:(1)SJA1000的INT端口是開漏輸出,所以在使用時應該加上拉電阻,不然電平一直為低,無法實現中斷方式。(2)電平信號AD0~AD7必須按順序連接在總線收發器74ALVC164245的一個8位端口上,不可分開。
3 通信系統軟件設計
3.1 系統流程設計
CAN總線通信模塊的控制主要包括三大部分:CAN總線節點初始化、報文發送和報文接收。主流程如圖3所示。
CAN節點主程序主要包括:作為主控制器的FPGA的初始化、CAN控制器初始化、寄存器狀態查詢、接收發送報文以及數據處理。在此設計中,由于通信模塊對接收數據的實時性要求并不是很高,因此CAN總線的接收和發送采用查詢方式[7]。在整個流程實現中,主要是對CAN控制器SJA1000中的寄存器進行讀寫操作。
3.2 讀寫流程控制
SJA1000 的數據和地址信號為時分復用,而FPGA 中不存在地址的概念,因此在讀寫寄存器時,要把SJA1000 中的寄存器地址當作數據寫入。所以在系統的頂層模塊設計中,將設計一個讀寫子模塊來專門產生對CAN寄存器進行讀寫控制的時序,而核心主模塊則只對通信流程進行描述。讀寫時序的狀態機流程圖如圖4所示。在IDLE狀態,對接口信號進行初始化,其中地址鎖存信號ALE為低電平、寫信號WR 為高電平、讀信號RD為高電平、片選信號CS 為高電平、地址數據復用總線ADDR為高阻態、writeover和readover為低電平(writeover為高電平表示一個寫時序的完成, readover為高電平表示一個讀時序的完成) 。另外對于核心主模塊的控制信號start和iswr,當start為低電平時繼續在IDLE狀態循環,反之則進入寫地址狀態Address0、Address1。然后根據iswr信號是高電平或低電平而進入寫數據進程或讀數據進程。讀寫數據過程均由兩個狀態完成,分別是RD0、RD1、WR0、WR1。當一個完整的讀或寫操作完成時,進入IDLE狀態。每一個狀態描述了ALE、WR、RD、CS、DIR1、ADDR的變化(OE0、OE1、DIR0分別為定值0、0、1,因此未列出來)。這里為了便于描述,設1為高電平,0為低電平,對以上幾個信號在各個狀態的值進行說明,將信號組{ALE、WR、RD、CS、DIR1}設為CtrS。
FPGA的時鐘為5 MHz,用以上狀態機來實現SJA1000 寄存器的讀寫,在設計中每個狀態占用的時間是一個周期,即200 ns。按照SJA1000 接口讀寫時序參數可知[8],片選信號必須在讀寫信號有效之前變為有效,并且讀信號有效時存儲數據總線上的數據。如此,設計的時序符合時序參數要求。其他的時序設計都要嚴格按照時序參數表來設計。
在編寫讀寫模塊時,需注意雙向總線的編寫技巧。雙向口最好在頂層定義,否則模塊綜合時容易出錯。
3.3 INOUT雙向端口
芯片外部引腳很多都使用inout類型的,目的是節省管腳,即一個端口同時做輸入和輸出。inout 在具體實現上一般用三態門來實現。三態門的第三個狀態就是高阻“Z”。 當inout端口不輸出時,將三態門置為高阻。這樣信號就不會因為兩端同時輸出而出錯了。本設計中地址數據復用的ADDR為8位雙向端口,使用時可以寫為:
inout ADDR;
wire [7:0] ADDR;
wire [7:0] input_of_ADDR;
wire [7:0] output_of_ADDR;
wire en;
assign ADDR = (en==1)?output_of_ADDR:8'hzz ;
assign input_of_ADDR = ADDR;
可見,此時input_of_ADDR和output_of_ADDR就可以當作普通信號使用了。對于雙向端口的測試用例如下:
wire [7:0] ADDR;
reg link;
reg [7:0] data_in_t;
assign ADDR=link?data_in_t:8'hzz;
對于有inout(雙向)端口的verilog程序設計,需要注意幾點:(1)對于inout端口,要定義一個與之相連的“映像寄存器”。當inout端口作為輸出端口時,將兩者連通;而當inout端口不作為輸出端口時,要給i~t端口賦高阻態來斷開與“映像寄存器”的連接。(2)在實例化含inout(雙向)端口的模塊時,與inout端口相連的只能是一個wire類型的變量。(3)不論是模塊設計還是仿真, 由于inout端口兼有輸人端口和輸出端口的功能,所以必須分別指定當inout端口作為輸人端口(輸出端口)時,它與其他單元的連接情況和需要完成的操作。
4 實驗結果
在FPGA中利用Verilog編程產生SJA1000的片選信號CS,地址鎖存信號ALE,讀寫信號RD、WR。這些控制信號共同驅動SJA1000進行數據接收發送,同時產生OE0、OE1、DIR0、DIR1,來控制雙向總線收發器。設計選取的是Xilinx公司Virtex系列的芯片,邏輯開發在ISE平臺上進行。在FPGA的調試階段,使用Xilinx提供的在線邏輯分析儀ChipScope pro來在線觀察FPGA設計內部信號的波形,它比傳統的邏輯分析儀更方便。圖5就是在線進行數據傳送時的波形。
在本文空間相機通信系統的設計中,放棄了傳統的基于單片機的方法,而采用以FPGA為核心控制單元,代替單片機及其外圍芯片電路。通過設計整個空間相機通信系統的硬件電路,并利用Verilog硬件語言描述通信流程,快速準確地實現了相機數據的通信功能。在軟硬件的聯調和驗證時,利用chipscope在線邏輯儀功能,方便準確地實現了預期目的。
參考文獻
[1] 饒運濤,鄒繼軍,鄭勇蕓.現場總線CAN原理與應用技術[M].北京:北京航空航天大學出版社,2007.
[2] Philips Semiconductors. Application note of SJA1000[Z]. 1997.
[3] Xilinx Inc. Product Specification:Virtex 2.5v FPGA Complete Data sheet. 2001.
[4] 陳萍.星載電場儀地面檢測設備設計與研制[D].北京:中科院研究生院,2009.
[5] 郭慧玲,劉羽,魏文.基于SJA1000的CAN總線雙機通訊技術的研究[J].儀表技術與傳感器,2008(9):46-48.
[6] Philips Semieonduetors. PCA82C250 CAN Controller interfaee datasheet[Z]. 1997.
[7] 林志琦,宋國明. CAN總線在激光敵我識別系統中的應用[J].電子技術應用,2009,35(3):80-82.
[8] Philips Semiconductors. SJA1000 Stand-alone CAN controller[Z]. 2000.