朱悅涵,林 立,邵 明
(福建工程學院 福建 福州 350108)
CAN總線,即控制器局域網總線,主要用于各種設備檢測及控制的現場總線。它是一種串行數據通信協議,是德國BOSCH公司于20世紀80年代初開發的,最初是為了解決汽車中眾多控制與測試儀器間的數據交換問題[1],具有良好的實時性、極高的可靠性、較低的成本和較強的可擴展性,是目前為止唯一有國際標準的現場總線,被公認為最有前途的幾種現場總線之一[2-3]。它非常適合現場設備的互聯。奔馳S級轎車上使用的就是CAN總線。節點指的是CAN總線上通信的起點和終點,可用于實現I/O擴展、遠程I/O、設備間通信等,應用廣泛。智能節點指的是帶有處理器的節點。相對于普通節點,智能節點有更好的兼容性和更強大的處理能力,不僅能夠作為普通節點使用,還可實現一定的信息處理與控制功能,使用起來更加靈活。本文描述了一種基于MCS-51單片機的CAN智能節點的設計方案,軟硬件均已通過測試。
智能節點的設計方案要與其功能設計相適應。從智能節點的定義來看,其必須自身帶有處理器MCU,擁有一定的數據處理能力;智能節點還必須能夠和CAN總線上的其他節點通信,所以必須包含CAN總線通信模塊;對于智能節點,其必須具備獲取現場信息,控制現場執行單元的能力,所以必須同時具有輸入輸出端口;除此之外,還希望該智能節點擁有一定的顯示功能,所以要包含一個顯示模塊;最后,要驅動以上器件,還需要有電源模塊的存在。根據以上思路,系統總體結構如圖1所示。

圖1 系統結構框圖Fig.1 Block diagram of the system
其中,MCU是智能節點的核心,它完成了大部分信息處理的功能,其它模塊都在其控制下工作。它采集輸入端口的信號,并對采集的信號進行處理;它可以根據輸入信號和事先設定的程序及實時輸出相應的控制信號;它也可以將輸入信號處理后傳遞給通信模塊,形成CAN報文發送到CAN總線上;它可以通過通信模塊獲取CAN總線上的信息,并通過這些信息控制輸出端口進行相應的動作;它還可以控制顯示模塊實現信息的顯示。通信模塊主要分為3個部分:CAN總線控制模塊、CAN總線收發模塊、CAN總線保護模塊。其中,CAN總線保護模塊主要起安全和抗干擾的作用。電源模塊為各給模塊提供工作電平,在設計時需要考慮必要的隔離措施,以防止干擾。
該智能節點有3個主要模塊:MCU、CAN總線控制模塊、CAN總線收發模塊。其中,MCU是整個智能節點的核心,選擇單片機89C51作為節點的MCU,同時選擇SJA1000作為CAN通信控制器,選擇82C250作為CAN總線收發器。智能節點的主要引腳連接關系如圖2所示。

圖2 89C51、SJA1000、82C250的主要引腳的連接關系Fig.2 Main part of the interconnection among 89C51,SJA1000 and 82C250
圖2 中,單片機89C51的主要作用是對SJA1000進行初始化,并控制SJA1000進行CAN報文的收發。89C51共有4個8位并口:P0、P1、P2和P3。P3的8個引腳有第二功能,用于控制信號的傳輸,而P0、P1、P2口則可用于和其他器件進行數據交換。在設計中將P0口用于和CAN通信控制器SJA1000進行數據交換。根據實際需要,將P2口的部分引腳也用于控制信號的傳輸,只剩下P1口作為I/O使用。為了使該智能節點能夠實現8輸入、8輸出,需要使P1口成為雙向I/O,使其能同時對輸入和輸出信號進行處理。所以需要對P1口進行I/O擴展。這里選用三態門芯片74LS245對P1口的信息傳送方向進行控制,實現I/O擴展。
SJA1000是Philips公司生產的獨立CAN控制器,用于替代PCA82C200。它不僅有之前的BasicCAN工作模式,還有全新的PeliCAN工作模式,支持CAN2.0協議[4]。它能自動完成所有與CAN總線物理層和數據鏈路層有關的功能。所以對于處理器而言,它是一個基本的外部I/O設備。SJA1000的AD口是其地址數據總線,在圖2中與89C51的P0口相連,實現數據的交互。SJA1000的CS口是片選信號,連接到89C51的P2.0口,當P2.0為低電平時可以訪問SJA1000。這樣,89C51可通過P0口對SJA1000內的寄存器進行讀寫。TX0為輸出驅動器0的輸出端,與CAN總線收發器82C250的TXD端相連,用于向82C250傳輸需要發送的數據;RX0為對應的輸入端,與82C250的RXD端相連,用于從82C250獲得通過CAN總線接收到的數據。
82C250是NXP公司生產的CAN收發器,作用是對CAN總線提供差動發送能力,對CAN控制器提供差動接收能力[5]。其驅動電路內部具有限流電路,可防止發送輸出級對電源、地或負載短路[4]。即使如此,在實際的電路設計中還是需要采用一些額外的保護措施。82C250的CANH引腳和CANL引腳與CAN總線連接的時候需要采取一些抗干擾和安全措施。其中,CANH和CANL引腳各自通過一個5Ω的電阻連接CAN總線,這樣可以起到限流的作用。同時,將CAN總線與地之間用30 pF的電容相連,起到抗高頻干擾的作用。
為使智能節點能夠實際應用,輸入輸出接口的設計是非常重要的。而接口設計中最重要的一個問題就是抗干擾,為了達到較好的抗干擾效果,在接口的設計中采用了光電耦合器。圖3是所設計的輸入接口模塊。

圖3 輸入接口模塊Fig.3 The input interface module
圖3 中的電路通過一個光電耦合器實現了輸入端和采集端電信號的隔離。其工作原理如下:當有開關量(按鈕、主令開關、行程開關、傳感器)輸入時,即把5 V電源接入,此時光耦二極管導通,工作指示燈的D5點亮。由于初級光耦二極管導通,使得次級光敏三極管導通,輸入到I/O口的電平由高變低,即開發板接收到信號執行相應的動作。其中,C8用于濾除高頻噪聲,R11為上拉電阻。當無開關量輸入時,X3輸出始終保持高電平,當有開關量輸入時,X3輸出為低電平。
輸出接口模塊如圖4所示,同樣采用光耦進行電氣隔離,以達到抗干擾的目的。其工作原理是:當單片機輸出低電平時,光耦前級二極管導通,LED燈DY0發光,起指示作用。光耦導通后通過R80為Q0提供偏置電壓,使Q0導通。這樣,Y00與COM0之間轉變為低阻態,從而實現開關量輸出。其中,二極管D0起保護作用。

圖4 輸出接口模塊Fig.4 The output interface module
CAN總線智能節點的軟件設計主要實現以下內容:輸入端口信號采集、通過輸出端口輸出信號、SJA1000初始化、發送報文、接收報文、通過數碼管顯示信息等。其中,最重要的是SJA1000初始化、發送報文、接收報文這3個部分。它們的程序流程如圖5所示。

圖5 初始化、接收、發送功能子程序流程圖Fig.5 The flow charts of initialization,receiving and sending
初始化子程序主要用于對SJA1000內部的各參數進行初始化設置,在上電時該程序會被執行。在進行初始化的時候,首先需要關閉SJA1000的中斷,并確保其處于復位模式下[6],然后向各寄存器寫入參數,最后將其恢復到運行狀態。接收子程序用于完成報文的接收功能。通過SJA1000接收報文可以使用兩種方式:中斷方式和查詢方式。查詢方式用于對實時性要求不是很高的場合。這里使用的是中斷方式。發送子程序用于完成CAN報文的發送。在發送前和發送后需要進行一些判斷,避免不必要錯誤。在發送前需要確保SJA1000沒有正在接收報文,發送緩沖區沒有處于鎖定狀態;在發送后需要判斷發送是否完成,才能中斷返回。
進行實物測試需要使用兩個智能節點,現將它們分別稱為節點1和節點2。同時使用到的還有I/O接口板。這塊接口板上集成了之前所描述的輸入接口模塊和輸出接口模塊。因為所設計的智能節點既可以作為CAN總線的輸入節點也可以作為CAN總線的輸出節點,所以將輸入接口和輸出接口集成在一起可以方便測試和日常使用。將節點1、節點2、I/O接口板、CAN總線以及其他輔助器件連接好后的實物如圖6所示。
其中,圖左的模塊為I/O接口板;右上方的模塊為節點1,它與I/O接口板的輸入端口X0~X7相連,同時它還連接有一個數碼管顯示模塊;右下方的模塊為節點2,它與I/O接口板的輸出端口Y0~Y7相連,沒有連接顯示模塊。這里的節點1和節點2是完全相同的智能節點。
測試方法如下:在輸入接口中隨機選取輸入端口制造輸入信號,測試輸出端口是否能夠產生相應的輸出信號;節點2通過中斷按鍵向節點1發送數據,測試節點1是否能夠通過顯示模塊對按鍵次數進行計數。

圖6 實物測試圖Fig.6 The practical tests
測試結果如圖6所示。當I/O接口板上的2個輸入端口產生信號(兩個指示燈亮)的時候,輸出接口上的對應的2個端口的燈亮起。說明節點1成功的采集并處理了這2個輸入信號,并通過CAN總線將數據發送給節點2。節點2也成功的接收通過CAN總線傳來的信息,并進行了正確的處理——按照事先編寫的程序點亮對應的兩個指示燈。另外,圖中節點2通過中斷按鍵向節點1發送數據,節點1的數碼管顯示模塊已計數到19,通信正常。
文中介紹了一種CAN總線智能節點的設計與實現方案,描述了主要的設計思路,實現了支持8輸入8輸出的智能節點,并進行了實際測試。通過實際測試,該智能節點能夠有效的實現遠程I/O與I/O擴展的功能。對電路進行進一步改進,可以在現有的基礎上使智能節點支持的輸入輸出端口數量進一步增加。
[1]李金剛,劉永鴻.基于AT89C51型單片機的CAN總線智能節點設計[J].國外電子元器件,2006(8):26-29.LI Jin-gang,LIU Yong-hong.Design of smart node in the CAN bus based on AT89C51[J].International Electronic Elements,2006(8):26-29.
[2]羅雪梅.基于SJA1000的CAN總線接口電路的設計與實現[J].貴州工業大學學報,2003,32(4):42-44.LUO Xue-mei.Designing and realizing of CAN bus juncture circuit based on SJA1000[J].Journal of Guizhou University of Technology,2003,32(4):42-44.
[3]鄒繼軍,饒運濤.基于SJA1000的CAN總線系統智能節點設計[J].單片機與嵌入式系統應用,2001(12):26-31.ZHOU Ji-jun,RAOYun-tao.Designing of CAN bus intelligent node based on SJA1000[J].Microcontroller&Embedded System,2001(12):26-31.
[4]吳坎.基于SJA1000和PCA82C250的CAN總線接口設計[J].機械設計與制造,2010(7):55-57.WU Kan.Design of CAN bus interface based on SJA1000 and PCA82C250[J].Machinery Design&Manufacture,2010(7):55-57.
[5]楊春杰,王曙光,亢紅波.CAN總線技術[M].北京:北京航空航天大學出版社,2010.
[6]王亮,王立忠,胡錦霖,等.基于CAN總線的智能繼電器研究[J].現代電子技術,2012,35(8):83-89.WANG Liang,WANG Li-zhong,HU Jin-lin,et al.Research of intelligent relay based on CAN bus[J].Modern Electronics Technique,2012,35(8):83-89.