1 CAN總線的特點
CAN(Controller Area Network)總線協議最初是德國BOSCH公司開發的,它是一種支持分布式實時控制系統的串行通信局域網。目前,CAN總線以其高性能、高可靠性、實時性等優點,而被廣泛應用于控制系統中的檢測和執行機構之間的數據通信中。CAN總線具有以下一些技術特性:
(1) 多主方式工作,采用非破壞性的基于優先權的總線仲裁技術;
(2) 借助接收濾波可實現多地址的幀傳送;
(3) 數據采用短幀結構,抗干擾性強,數據幀的信息CRC校驗及其它錯誤檢測措施完善;
(4) 發送期間丟失仲裁或由于出錯而遭破獲的幀可以自動重發;
(5) 嚴重錯誤時可自動關閉總線功能,以使總線其它操作不受影響。
CAN總線符合ISO11989標準,最大傳輸速率為1MB/s時,傳輸距離最大為40m;傳輸速率為5KB/s時的最大傳輸距離為10km。CAN總線的傳輸介質可為雙絞線、同軸電纜等。由于CAN總線是一種很有發展前景的現場總線,因此,得到了國際上很多大公司的支持,加之基于CAN總線的硬件接口簡單,編程方便,系統容易集成。因此,它特別適用于系統分布比較分散、實時性要求高、現場環境干擾大的場合。
2 本項目概述及系統總體結構
上海大眾汽車有限公司的技術中心有各種各樣汽車零部件試驗設備100余臺,且分布在相隔較遠的不同試驗區域,許多試驗設備(如高低溫環境模擬試驗箱、振動試驗臺,各種零部件疲勞耐久試驗臺等)需要24小時連續不間斷地運行,為了更好地設計開發汽車零部件,需要對試驗過程中試驗臺架運行情況進行記錄,因此如何集中地監控,管理這些試驗設備的運行顯得頗為重要。
圖1 系統總體框圖
在此以每臺試驗設備為網絡節點,用雙絞線架構CAN總線設備網,對每個節點實時地采集數據,輸出控制。設備網的固定節點(地址為00號)同時作為網關,通過這臺通用PC服務器終端將CAN-BUS網絡連至以太網,由以太網架構信息網,在PC服務器終端平臺上用VB或VC++ 開發用戶層的應用程序,用來監控各個試驗臺架的運行情況,并創建網絡數據庫記錄下各個CAN節點設備的數據。使得每個零部件設計工程師通過連至以太網上的辦公電腦在辦公室里就可以訪問PC服務器終端,獲取所需的零部件試驗設備運行情況數據,從而更好地對零部件試驗結果進行分析。
3 CAN總線設備網與以太信息網的網關
連接CAN總線設備網與以太信息網的網關是一臺通用PC終端。在通用PC終端中安裝1個標準以太網接口卡和1個USBCAN-I接口卡,這樣就能方便地實現一個連接CAN總線設備網與以太信息網的網關。
應用程序開發可以使用VB或VC++等高級語言在PC平臺上實現,應用程序是一個WIN3監控程序及網絡數據庫(記錄CAN節點設備數據)的軟件。所有的CAN總線節點組成一個虛擬網段,CAN設備管理服務器是公司以太網中的任一節點。連在以太網上的WinNT服務器安裝專用網絡管理軟件,就可讓合法的工程技術人員遠程管理CAN總線節點設備;通過以太網,可同CAN總線節點設備進行數據通信。這樣,服務器就可以使用WEB發布方式,向網絡客戶提供動態交互式瀏覽網頁等功能。
4 CAN 節點的設計
4.1 CAN節點的硬件設計
本CAN節點的電路原理簡圖如圖2所示。該電路的三個核心器件是單片機ADμC812、CAN總線控制器SJA1000和CAN總線驅動器PCA82C250。
圖2 硬件電路原理簡圖
ADμC812是高度集成、高精度12位數據采集系統,該產品在其內核中集成了帶有片內可重編程非易失性閃速/電擦除程序存儲器的高性能8位(與8051兼容)MCU和多通道(8個輸入通道)12位ADC。由于ADμC812只需要通過其串口模塊和計算機的串口進行連接,而不需要額外的仿真器,因而可利用ADI公司的QUICKSTART軟件來實現程序的在線下載、在線調試和在線仿真,從而極大地提高了工作效率。這也是本設計使用MAX232的原因。
SJA1000作為微控制器的片外擴展芯片,其片選引腳CS應接在微控制器的P2.0上,以用于決定CAN控制器各寄存器的地址。SJA1000通過CAN總線驅動器PCA82C250連接在物理總線上。PCA82C250器件可提供對總線的差動發送能力和對CAN控制器的差動接受能力,它同時完全和“ISO11898”標準兼容。由于通信信號傳輸到導線的端點時會發生反射,而且反射信號會干擾正常信號的傳輸,因此,總線兩端應接有終端電阻R1、R2,以消除反射信號,其阻值應當與傳輸電纜的特性阻抗大致相當。
4.2 CAN節點的軟件設計
本節點的軟件編程主要包括A/D轉換(ADC)、CAN控制器的初始化、CAN總線數據的發送和接收等幾個部分。主程序的流程圖如圖3所示。
圖3 主程序流程圖
下面分別對這幾個主要部分的程序設計做一介紹。
(1) A/D轉換部分
筆者在本設計中采用的是單步A/D轉換模式,并將A/D轉換結果存入指定的數據存儲區。具體步驟如下:
① 通過設置ADC控制寄存器(ADCCON1和ADCCON2)的值來確定A/D轉換的工作狀態和采樣通道號;
② 使能ADC中斷,置位SC位以啟動單步A/D轉換;
③ 等待響應ADC中斷,并進入中斷服務程序;
④ 把采樣所得的數據從ADCDATAL和ADC-DATAH兩個特殊寄存器中取出,并存入預設的片內數據存儲器中,然后退出中斷服務程序;
⑤ 判斷所需通道是否采樣完畢,如果未完成,則設置采樣通道號并返回步驟②,若完成則退出A/D轉換子程序。
通過該程序可隨時根據實際需要更改采樣通道數,并將采樣結果直接存入指定數據存儲區,以為今后向CAN總線發送所得數據提供便利。
(2) SJA1000的初始化
CAN的通信協議主要是由CAN控制器完成的,因此,要想實現CAN節點的數據傳送,對CAN控制器的初始化是十分關鍵的。這個步驟直接決定著該CAN網絡系統各節點所共同遵守的協議。對SJA1000進行初始化實際上就是通過單片機向其片內的各個寄存器寫入控制字的過程,其寄存器包括以下幾個:
REG CONTROL―內部控制寄存器地址;
REG COMMAND―內部命令寄存器地址;
REG STATUS―內部狀態寄存器地址;
REG INTERRUPT―內部中斷寄存器地址;
REG ACR―內部驗收代碼寄存器地址;
REG AMR―內部驗收屏蔽寄存器地址;
REG BTR0―總線定時寄存器0;
REG BTR1―總線定時寄存器1;
REG OCR―輸出控制寄存器。
其中:BTR0、BTR1寄存器的內容可用于決定系統通信的波特率和CAN協議物理層中的同步跳轉寬度,因此,對于一個系統中的所有節點,這兩個寄存器的內容必須相同(包括上位機),否則將無法進行通信;OCR寄存器的內容用于決定CAN控制器的輸出方式;而寫入ACR、AMR寄存器的內容則要根據實際的網絡系統和報文標志符來決定。本設計中筆者采用的是BasicCAN模式。
完成初始化后,CAN控制器就能正常運行了,但是要實現具體的數據收發任務,還必須編制特定的收、發程序。
(3) CAN總線數據的發送和接收
① 發送部分的程序設計
圖4 發送部分子程序流程圖 圖5 數據接收部分子程序流程圖
用CAN總線發送數據的流程圖如圖4所示。實際上,在程序運行過程中,常常會在發送某一幀數據時發現上一幀的數據還沒有完全發送完畢(可以通過查詢狀態寄存器REG STATUS的第4位BIT TCS的顯、隱狀態,可了解上次數據的發送情況)。因此,筆者采用的處理方法是:通過指令啟動本次發送之后,就不停地查詢狀態寄存器,以判斷本次發送是否完成,直到確定完成為止。這樣可以為下次發送提供便利,同時也有利于程序的順利執行,從而避免出現錯誤。
② 接收部分的程序設計
圖5所示是該系統接收部分的軟件流程圖。實際上,在對響應速度要求不太高的場合,以查詢方式來設計接收子程序是最簡單、最可靠的方式。如果總線上有數據發往本節點,則通過查詢狀態寄存器的第1位BIT_RBS的位狀態,便可得知接收緩沖區(RXFIFO)中的可用信息,然后通過軟件將RXFIFO中的數據逐個“移入”到指定的片內存儲空間即可。對于這樣一個主要以數據采集功能為主的CAN節點,這些數據多半是由CAN網絡中的“控制中心”發來的控制信號,設計時把它們留給ADμC812進一步處理就可以了。