甄國涌, 牛會恩
(中北大學 電子測試技術國家重點實驗室,山西 太原 030051)
CAN,全稱為“Controller Area Network”,即控制器局域網,是國際上應用最廣泛的現場總線之一。最初,CAN被設計作為汽車環境中的微控制器通訊,在車載各電子控制裝置ECU之間交換信息,形成汽車電子控制網絡。比如:發動機管理系統、變速箱控制器、儀表裝備、電子主干系統中,均嵌入CAN控制裝置。由于其卓越的性能,在工業自動化、多種控制設備、交通工具、醫療器械以及建筑、環境控制等眾多部門越來越受到廣泛的關注[1]。
CAN總線控制系統的設計重點集中在節點模塊的設計上。通常節點模塊的設計方案有兩種: 傳統的方法是用單片機加上CAN 協議控制器組成,例如用51系列單片機和CAN控制器SJA1000 組成[2];另外一種方案是采用內部集成了CAN 控制器模塊的微控制器。第一種開發CAN 節點的應用實例已經很多了,所以本文以C8051F040 為例介紹第二種開發方式。
本論文采用“CAN單片機+CAN收發器”的組合,配合以適當的外圍電路構成一個完整的CAN節點,節點之間再經導線簡單連接便形成“CAN網絡”,下頁圖1為CAN總線網絡結構。一個由CAN總線構成的單一網絡中,理論上可以掛接無數個節點。實際應用中,節點數目受網絡硬件的電氣特性所限制。
CAN網絡控制邏輯電平信號從CAN控制器到達物理總線的物理層,反之也一樣。CAN控制器執行CAN協議,用于信息緩沖和濾波。C8051F040的CAN控制器支持完全的CAN2.0A和CAN2.0B。
C8051F040的所有CAN協議功能都由獨立的CAN控制器而不是由51處理器來完成。因此CAN通信占用CPU帶寬很小,51處理器只需要通過特殊功能寄存器(SFR)配置CAN控制器和數據過濾器就可以了。

圖1 CAN總線網絡結構
圖2是C8051F040內部集成的CAN控制器原理框圖,各部分功能如下:
CAN控制器核: CAN協議控制器和發送/接收轉換寄存器;
消息RAM:存儲Message Objects和標志碼, CAN控制器共有32個信息目標可供配置來用于發送或接收數據;
CAN專用寄存器:用于控制和配置C_CAN模塊的所有寄存器;
消息處理器:控制數據在CAN控制核的接收/發送轉換寄存器和目標信息之間的傳輸,以及中斷的產生。

圖2 CAN控制器原理框
CAN寄存器可分為以下4類:
CAN控制器協議寄存器:用于CAN控制,中斷,錯誤控制,總線狀態控制和測試模式;
信息目標接口寄存器:配置32個信息目標,從目標接收和發送數據。C8051F040處理器通過它來讀寫CAN 消息RAM;
信息處理寄存器:只讀寄存器。為51CPU提供信息目標的狀態,如信息有效標志,發送請求狀態,新數據標志和中斷標志;
C8051處理器特殊功能寄存器(SFR):C8051處理器控制的5個寄存器,直接讀寫CAN協議寄存器,通過CAN數據寄存器(CAN0DATH和CAN0DATL)和CAN地址寄存器(CAN0ADR)間接讀寫其他CAN控制器。
CAN控制器工作于多主方式[3],對于主節點和從節點,CAN總線硬件接口是相同的。由于C8051F040內部集成了CAN總線控制器,所以只需外加總線驅動器并加上適當的隔離就可以了, 電路上顯得非常簡潔。CAN總線信號CANTX和CANRX從C8051F040出來后先分別經過高速光耦6N137進行電氣隔離,再經過CAN總線收發器接口芯片TJA1040,然后接到CAN數據線上。由于工業現場環境惡劣,電磁干擾與瞬時干擾比較嚴重,為了保證系統的可靠性,節點的控制器和接收器之間用6N137進行光電隔離,避免總線上的瞬時干擾。但是需注意的是兩邊的電源一定要隔離處理,否則無效[4]。本課題在高速光耦和CAN收發器的電源之間選用的DC-DC電源模塊是BO505進行電源隔離,它可以使VCC與+5V完全隔離,使結點的穩定性與安全性得到了很大的提高。
總線終端匹配電阻是必須使用的。總線兩端的120Ω電阻對于匹配總線阻抗起著相當重要的作用。因此本系統的所有節點終端電阻全部加上跳線,兩端的節點的跳線接上,使電阻有效,中間節點不接跳線,相當于沒有終端電阻。
單片機固件程序主要完成的任務是:系統初始化程序、發送程序、接收程序等。軟件部分設計的好壞將直接決定系統能否正常工作,這是CAN總線系統的設計人員來說是一個難點,也是一個重點。本系統軟件采用結構化程序設計方案,使其具有較好的模塊性和可移植性,對于不同的系統功能或不同的應用環境,可以方便地進行編程重組。
初始化程序主要完成對所有的報文對象進行初始化(一般將所有值置零),對CAN控制寄存器、位定時寄存器進行設置,還要對發送報文對象和接收報文對象分別進行初始化。其中,位定時寄存器的設置較為復雜,這里我們使用外部晶振為 22.1184 MHz,CAN 通信速率為 1 Mb/s,得到BITREG的初始值為0x5EC0。下面為CAN啟動程序:

CAN報文發送是由CAN控制器自動完成的,用戶只需根據接收到的遠程幀的識別符,將對應的數據轉移到發送緩沖寄存器,然后將此報文對象的編碼寫入命令請求寄存器啟動發送即可,而發送由硬件來完成。這里,我們使用定時更新發送報文對象中的數據,數據的發送有控制器自動完成,當其收到一個數據幀時,就將具有相同識別符的數據幀發送出去。其發送程序結構如下:

CAN報文的接收與發送一樣,是由CAN控制器自動完成的,接收程序只需從接收緩存器中讀取接收的數據,再進行相應的處理即可。其基本方法與發送程序一致。

5.1.1 波特率設置分析
C8051F040CAN控制器的波特率主要是設置2個寄存器:Bit Timing Register與BRP Extension Register,對于Bit Timing Register, Res為保留位;Tseg1占4個二進制位,可設置值為0x1~0xF;Tseg2占3個二進制位,可設置值為0x0~0x7;SJWP占2個二進制位,可設置值為0x0~0x3;BRP占6個二進制位,為Baud Rate Prescaler的縮寫,譯為波特率預分頻比例因子,用于對CAN時鐘頻率fsys_can預分頻,可設置值為0x00~0x3F。他們要比實際使用值少1。fsys_can與C8051F040單片機的系統時鐘頻率fsys相同,可通過配置C8051F040單片機的晶振配置寄存器OSCICN或OSCXCN分頻得到。由于CAN 通信的高精度要求,一般使用外部石英晶振。
對于BRP Extension Register,主要用在fsys_can很高,要求的CAN波特率又很小,BRP設置到0x3F仍然不能滿足要求時,用此寄存器來擴展預分頻的值。BRPE為4位,作為分頻數中的MSB部分,BRP為6位,作為分頻數中的LSB 部分,2者合用共10位,最大可產生1023分頻數,即實際分頻數最大可達1024。
5.1.2 1M波特率的設置過程
本例說明如何配置CAN控制器的時序參數來滿足上文介紹的1 Mb/s的位速率。表1給出了進行計算所需要的與時序相關的系統參數。

表1 CAN控制器的時序參數
我們要調整這4個位段的長度,以使它們的和最接近所期望的位時間。由于每個時段必須是時間量子(tq)的整數倍,所以可得到最接近的位時間為22 tq(994.642 ns),由此可得位速率為1.00539 Mb/s。Sync_Seg固定為1 tq。Prop_Seg必須大于或等于400 ns的傳輸延遲時間,我們選9 tq(406.899 ns)。
位時間中剩余的時間量子數(tq)分配給Phase_Seg1和Phase_Seg2,我們選Phase_Seg1=6 tq,Phase_Seg2=6 tq。
寫入到位定時寄存器中的值用如下方程計算。BRP擴展寄存器保持其復位值0x0000不變。
BRPE=BRP-1=BRP擴展寄存器=0x0000,
SJWP=SJW-1=min(4,6)-1=3,
TSEG1=(Prop_Seg+Phase_Seg1-1)=9+6-1=14,
TSEG2=(phase_Seg2-1)=5,
位時間寄存器=TSEG2·0x1000+TSEG1·0x0100+SJWp·0x0040+BRPE=0x5EC0。
本文介紹的單片機固件程序采用定時器0、方式1的方式發送CAN報文。在定時器模式下,計數器由單片機脈沖經12分頻后計數。因此,定時器定時時間T的計算公式為:

式中TM為計數器從初值開始作加1計數到計滿為全1所需要的時間,TM為模值,和定時器的工作方式有關;fOSC是單片機晶體振蕩器的頻率,TC為定時器的定時初值。
在式(2)中,若設TC=0,則定時器定時時間為最大(初值為0,計數從全0到全1,溢出后又為全0)。TM的值和定時器工作方式有關,本文介紹的單片機主脈沖晶體振蕩器頻率fOSC為10 MHz,則最大定時時間為:

經過以上分析,式(2)中,四個未知量已知,所以我們可以解出TC的值,即為位定時寄存器的值。
本文設計的CAN總線節點模塊,采用內部集成CAN控制器模塊的微控制器,不但硬件設計上簡單、可靠,編制相應的軟件時也更方便和簡潔。而且抗干擾能力強、性能高效:能單發和循環發送報文,其時間間隔在0~60 ms任意設定。通訊速率能根據系統需要設置不同檔,而且能夠對所需要發送數據的ID號、數據長度、數據內容等進行設定。目前整個系統運行良好,性能穩定,符合工業現場使用的要求。
[1] 鄔寬明.CAN總線原理和應用系統設計[M].北京:北京航空航天大學出版社,2002.
[2] 侯明,杜奕.基于 CAN總線的接口電路設計[J].通信技術,2008,41(07):138-139.
[3] 蔡連君.基于 CAN總線的生產監控系統研究[J].通信技術,2009,42(10):151-152.
[4] 宋明權,周純杰.基于C8051F040的CAN通訊接口的開發與應用[J].計算技術與自動化,2005(07):50-51.