邢榮峰
太原航空儀表有限公司 030000
CAN,全稱為“Controller Area Network”,即控制器局域網,是國際上應用最廣泛的現場總線之一,是由德國Bosch公司最早提出的[1]。它是一種多主方式的串行通訊總線,基本設計規范要求有較高的位速率、高抗電磁干擾性,而且能夠檢測出產生的任何錯誤。當信號傳輸距離達到10km時,CAN仍可提供50Kbit/s的數據傳輸速率。其總線規范已被ISO國際標注化組織制定為國際標準ISO11898(高速應用)和ISO11519(低速應用)。
因為CAN總線具有很高的實時性能,所以它在汽車電子、航空工業、工業控制、安全防護等領域中得到廣泛應用。但是,在常用的微處理器中有很多微處理器內部并沒有集成CAN控制器,如基于ARM1176JZF-S內核的微處理器S3C6410。因此,將這類微處理器和CAN獨立控制進行組合設計就成為必要。
微處理器S3C6410是基于ARM1176JZF-S內核的16/32-bit RISC微處理器,具有低成本、低功耗、高性能的特點。S3C6410具有極佳的外部存儲器接口,同時提供了豐富的硬件外設接口,非常適合對成本、功耗敏感的應用。
SJA1000T是使用較為廣泛的一種CAN獨立控制器,主要用于移動目標和一般的工業環境[2]。SJA1000T與微處理器的接口可設置為Intel模式或Motorola模式。本文的接口設計是基于Intel模式的,在此模式下,SJA1000T的數據和地址信號是分時復用的。
S3C6410和SJA1000T之間的硬件設計需要解決兩個問題,一個是電平轉換問題,一個是讀寫時序問題。
S3C6410的工作電壓是3.3V,而SJA1000T是5V供電,兩者之間不能直接相連,需要進行電平轉換。如果需要總線雙向傳輸數據,則在S3C6410和SJA1000T之間需要使用帶有方向控制的轉換芯片,例如SN74LVC245。如果總線是單向傳輸數據的,則可以使用SN74LVC541實現兩者的相連。
前面已提到SJA1000T的接口在Intel模式下數據和地址信號是分時復用的,而S3C6410為數據和地址信號分離的結構[3],且S3C6410不提供ALE信號。因此,設計的關鍵就是S3C6410要把SJA1000T的地址當成數據寫入并同時產生ALE信號,S3C6410的地址信號只作為譯碼控制信號使用。本設計使用S3C6410的NGCS4對應的地址空間(地址范圍為0x20000000~0x27FFFFFF)、地址總線ADDR0、NOE和NWE來實現SJA1000T的ALE、寫使能控制信號)讀使能控制信號)和片選信號)。
對于SJA1000T,ALE信號需要在發送其地址是有效(此時為高有效),在發送和接收其數據時無效。規定當ADDR0=1時發送地址,ALE可以通過如下邏輯組合實現:



對于微處理器而言,CAN獨立控制器是基于事件觸發的。CAN獨立控制器會在本身狀態發生改變時,將變化的結果通知微處理器。因此微處理器處理CAN信息時,可以采用中段的方式,也可以采用輪詢的方式來完成相應處理。在軟件編寫之前先確定SJA1000T的基地址及復位引腳,然后正確初始化SJA1000T,填寫要發送的報文,使能發送請求,即可進行CAN接收和發送。
SJA1000T的初始化流程見圖1。其中,配置CAN工作模式和設定中斷使能這兩個步驟可以根據需要進行裁剪,其余步驟則是必須的初始化工作。

圖1 SJA1000T的初始化流程
當完成SJA1000T的初始化后,就可以使用發送緩存寄存器和接收緩存寄存器進行報文數據的接收和發送。
CAN總線將數據發送到發送緩存寄存器,然后對發送緩存寄存器賦值以啟動發送。CAN獨立控制器只負責發送,不保證發送成功。要驗證發送是否成功,可以查詢SJA1000T狀態寄存器的TCS位,或者配合中斷來判斷。
CAN總線接收數據時,先通過讀取狀態寄存器信息來確認當前緩存器中是否有數據。當有數據時,將數據讀出并放入CAN接收數據存儲區,待需要時從該存儲區讀出。
本文介紹了微處理器S3C6410和CAN獨立控制器SJA1000T之間接口的差異,提出了SJA1000T和S3C6410總線設計方案。該設計方案可以作為內部沒有集成CAN控制器的微處理器和CAN獨立控制器之間組合設計的參考。
[1]饒云濤,鄒繼軍,鄭勇蕓.現場總線CAN原理及應用技術[M].北京:北京航空航天大學出版社,2003.
[2]NXP Company.SJA1000 Data Shee t[Z].2004.
[3]Samsung Electronics Company.S3C6410X USER'SMANUAL[Z].2008.