1 CAN總線分布式系統的結構 系統結構如圖1所示。本系統由上位監控計算機、CAN總線適配卡和控制單元三部分構成。其中上位監控計算機采用IBM-PC兼容機,主要負責對系統數據的接收與管理、控制命令的發送以及各控制單元動態參數和設備狀態實時顯示?刂茊卧單片機為核心,主要負責對現場環境參數和設備狀態進行檢測,對采集來的數據進行處理,并對SJA1000進行操作和控制。CAN總線適配卡,可使PC機方便地連接到CAN總線上。它內嵌微處理器、CAN總線控制器、CAN總線收發器和雙口RAM。雙口RAM作為PC機與CAN總線適配卡的數據共享區,通過設備將其映射成PC機的物理內存,實現CAN與PC機的高速數據交換。CAN總線適配卡上帶有光電隔離,可增強系統在惡劣環境中的抗干擾能力?偩兩端各有1個電阻R(約120Ω)起總線阻抗匹配作用。 2 CAN適配卡的設計 2.1 硬件設計 CAN適配卡的硬件組成框圖如圖2所示,由ISA接口、雙口RAM、CPU、CAN通信控制器SJA1000、CAN總線接口82C250等組成。由于帶有片上CAN控制器的單片機都含較多的I/O線、定時/計數器、A/D等功能,往往較復雜,因此微處理器使用價廉的AT89C51單片機。為了進一步提高抗干擾措施,在2個CAN器件之間使用了由高速隔離器件6N137構成的隔離電路。光耦兩側應采用DC-DC隔離電源。硬件電路中使用82C250的目的是為了增大通信距離。要實現PC機和CAN控制器之間的數據傳送,必須在PC機和適配卡上的MPU之間建立起雙向的數據交換通道。通過ISA總線實現單片機系統與主機之間的數據交換有多種實現方法。本適配卡采用集成雙口RAM實現數據交換。由于CAN信號傳輸采用短幀結構(8字節數據),雙口RAM的容量要求并不大,本卡選用2K×8位的帶中斷請求信號INT和忙信號BUSY的IDT7132。具體的連接電路如圖3、圖4所示。上位PC機對雙口RAM的尋址方式采用I/O尋址方式,使用的控制線為IOW和IOR。為避免產生讀寫錯誤,使用雙口RAM的關鍵是處理好爭用現象。IDT7132提供了中斷判優和硬件判優兩種方式。當兩端口爭用同一地址單元時,由片內硬件電路,根據兩邊的地址、片選、讀寫信號到達先后順序,裁決哪個端口有使用權。如左端口優先使用,則自動將右端口的BUSYR信號拉為低電平,通知右側暫停讀寫操作。在本適配卡中,由于8031沒有READY信號,可以將此信號接至8031的P1.0上。當8031發出讀寫IDT7132命令時,根據P1.0口的值就可判斷對IDT7132讀寫是否存在沖突。當P1.0的值為0時,存在沖突,必須重發讀寫IDT7132的命令。由于ISA總線既沒有READY信號,也沒有通用的I/O引腳,因此將BUSYL信號通過三態門接至ISA數據線的最低位D0。用ISA總線的一個空閑I/O端口打開三態門,通過D0讀取BUSYL的狀態。 SJA1000為CAN總線微控制器,是PHILIPS公司的PCA82C200的替代產品,可完成CAN總線的物理層和數據鏈路層的所有功能。SJA1000內部RAM由寄存器組和報文緩沖區組成。發送緩沖區和接收緩沖區共用同一段CAN地址16H~18H,共3個單元,能存儲一條將在CAN總線上發送或接收的完整的報文。具有64字節擴展接收緩沖器RXFIFO,其CAN地址為32H~95H(地址為96H~109H的區域是存放發送信息的備份),有了64字節的REFIFO,CPU可以在處理一個報文的同時繼續接收其他到來的報文;具有接收濾波器,它把報文頭中的標識符(ID)和驗收碼寄存器中的內容進行比較,以判斷該報文是否被接收。如果被接收,報文存入RXFIFO。CAN信息幀格式及單濾波方式的驗收濾波器流程圖如圖5所示。 格式信息內容如下: FF RTR X X DLC.3 DLC.2 DLC.1 DLC.0 FF=1,本幀為標準幀;FF=0,本幀為擴展幀。RTR=1,為遠程幀;RTR=0,為數據幀。DLC.3~DLC.0表示數據字節的長度,最大值為8。驗收濾波原理:初始化時將標識符ID寫入驗收碼寄存器ACR中,驗收屏蔽寄存器AMR為0的位,ACR和CAN信息幀的對應位必須相等才算驗收通過,AMR為1的位,CAN信息幀的對應位不驗收。驗收時對于標準幀;11位標識符和RTR對應ACR0的8位和ACR1的高4位。對于擴展幀:29位標識符和RTR對應4個ACR,只是ACR3和AMR3的低2位未用。MAX813組成硬件復位及看門狗電路。 2.2 軟件設計 適配卡主要承擔上位計算機和CAN節點之間的數據轉發任務,其軟件設計包括兩部分。一是PC機端的應用程序接口(API)函數,采用可視化的編程工具Builder C++編寫,主要包括按CAN報文格式向適配卡上雙口RAM寫入控制命令、請求控制單元發送數據命令。在雙口RAM引起的中斷服務程序中,讀取雙口RAM中由AT89C51轉發的控制單元發送的數據并進行處理。雙口RAM向PC機發出的中斷請求INTL,是由單片機將接收的數據寫入雙口RAM后再寫雙口RAM片內地址為7FEH單元觸發的。二適配卡上單片機端的程序設計,采用匯編發的。二是適配卡上單片機端的程序設計,采用匯編語言編寫,分為主程序、INT0和INT1中斷服務程序。主程序主要完成對SJA1000的初始化。SJA1000的初始化是通過在復位期間對模式寄存器MOD(CAN地址為0,濾波和復位等方式選擇)、時鐘分配寄存器CDR(CAN地址為31H,選擇PeliCAN模式及時鐘輸出頻率)、濾波碼寄存器ACR0~ACR3(復位模式CAN地址為16H~18H,初始化時寫入ID標識符)、驗收屏蔽寄存器AMR0~AMR3(復位模式CAN地址為20H~23H,初始化時設置是否屏蔽ACR相應位)、總線定時寄存器BTR0(CAN地址為06H,設置波特率和同步跳轉寬度)和BTR1(CAN地址為07H,定義每個位周期長度、采樣位置和每個采樣點的采樣數目)、輸出控制寄存器OCR(CAN地址為08H,選擇正常輸出控制模式)等寫入控制字來確定其工作方式的。INT1中斷請求是由PC機將數據寫入雙口RAM后再寫雙口RAM片內地址為7FFH單元觸發的。在INT12中斷服務程序中,首先讀取雙口RAM中的數據,然后再將數據轉發給CAN控制器SJA1000,具體參見流程圖6。INT0中斷請求是由SJA1000發送或接收完1幀信息或接收數據超載或產生錯誤中斷后產生的。INT0中斷服務程序流程如圖7所示。 3 控制單元設計 控制單元的任務就是對現場環境參數進行采集并從CAN總線上接收上位機的命令。根據上位機的要求,對設備進行控制或將采集的數據通過CAN總線傳給上位機。現以溫室控制單元為例說明控制單元設計方法。溫室控制單元的結構原理如圖8所示。以AT89C52為核心,采用2片8255擴展I/O端口,其中2個PA口和1個PB口用來檢測天窗、遮陽傘、補光燈、通風機等21路開關量的狀態。由于8255的PC口的各位通過置復位控制字可以單獨置位或復位,AT89C52的P1口可以按位尋址,所以用8255的2個PC口和AP89C52的P1口來控制繼電器的吸合。3片8位A/D轉換器ADC0809實現對溫度、濕度、pH值、CO2濃度、光照強度、液位等20路模擬量的數據采集。 控制單元的控制軟件采用匯編語言編程,主要包括初始化、數據采集、數據通信、I/O接口控制等功能。初始化包括對8255和SJA1000的初始化,使8255的PA、PB口作為輸入口,PC口各位通過置復位控制字可以單獨置位或復位,從而開啟或停止一個繼電器的動作。數據采集采用查詢方式工作,每一路模擬量連續采集3次,中值濾波后作為該傳感器的數據存入相應的內部RAM中,全部數據采集完后再檢測開關狀態并存入相應RAM中。隨后開CPU中斷,進入數據循環采集狀態,等待CAN通信中斷的產生。本系統采用中斷方式實現AT89C52與SJA1000之間的通信。 需要說明的是,CAN2.0A或CAN 2.0B協議只是一個低層的規范,用戶還需要定制簡單的應用層協議。應用層協議的任務一方面是將要發送的數據分類、拆卸、合并,確定發送對象,再根據CAN的數據鏈路層協議規范填寫CAN的各個信息幀;另一方面是根據應用層協議解釋接收數據的具體含義,并進行相應的處理。 |