FF=1,本幀為標準幀;FF=0,本幀為擴展幀。RTR=1,為遠程幀;RTR=0,為數(shù)據(jù)幀。DLC.3~DLC.0表示數(shù)據(jù)字節(jié)的長度,最大值為8。驗收濾波原理:初始化時將標識符ID寫入驗收碼寄存器ACR中,驗收屏蔽寄存器AMR為0的位,ACR和CAN信息幀的對應(yīng)位必須相等才算驗收通過,AMR為1的位,CAN信息幀的對應(yīng)位不驗收。驗收時對于標準幀;11位標識符和RTR對應(yīng)ACR0的8位和ACR1的高4位。對于擴展幀:29位標識符和RTR對應(yīng)4個ACR,只是ACR3和AMR3的低2位未用。MAX813組成硬件復(fù)位及看門狗電路。

2.2 軟件設(shè)計
適配卡主要承擔上位計算機和CAN節(jié)點之間的數(shù)據(jù)轉(zhuǎn)發(fā)任務(wù),其軟件設(shè)計包括兩部分。一是PC機端的應(yīng)用程序接口(API)函數(shù),采用可視化的編程工具Builder C++編寫,主要包括按CAN報文格式向適配卡上雙口RAM寫入控制命令、請求控制單元發(fā)送數(shù)據(jù)命令。在雙口RAM引起的中斷服務(wù)程序中,讀取雙口RAM中由AT89C51轉(zhuǎn)發(fā)的控制單元發(fā)送的數(shù)據(jù)并進行處理。雙口RAM向PC機發(fā)出的中斷請求INTL,
是由單片機將接收的數(shù)據(jù)寫入雙口RAM后再寫雙口RAM片內(nèi)地址為7FEH單元觸發(fā)的。二適配卡上單片機端的程序設(shè)計,采用匯編發(fā)的。二是適配卡上單片機端的程序設(shè)計,采用匯編語言編寫,分為主程序、INT0和INT1中斷服務(wù)程序。主程序主要完成對SJA1000的初始化。SJA1000的初始化是通過在復(fù)位期間對模式寄存器MOD(CAN地址為0,濾波和復(fù)位等方式選擇)、時鐘分配寄存器CDR(CAN地址為31H,選擇PeliCAN模式及時鐘輸出頻率)、濾波碼寄存器ACR0~ACR3(復(fù)位模式CAN地址為16H~18H,初始化時寫入ID標識符)、驗收屏蔽寄存器AMR0~AMR3(復(fù)位模式CAN地址為20H~23H,初始化時設(shè)置是否屏蔽ACR相應(yīng)位)、總線定時寄存器BTR0(CAN地址為06H,設(shè)置波特率和同步跳轉(zhuǎn)寬度)和BTR1(CAN地址為07H,定義每個位周期長度、采樣位置和每個采樣點的采樣數(shù)目)、輸出控制寄存器OCR(CAN地址為08H,選擇正常輸出控制模式)等寫入控制字來確定其工作方式的。INT1中斷請求是由PC機將數(shù)據(jù)寫入雙口RAM后再寫雙口RAM片內(nèi)地址為7FFH單元觸發(fā)的。在INT12中斷服務(wù)程序中,首先讀取雙口RAM中的數(shù)據(jù),然后再將數(shù)據(jù)轉(zhuǎn)發(fā)給CAN控制器SJA1000,具體參見流程圖6。INT0中斷請求是由SJA1000發(fā)送或接收完1幀信息或接收數(shù)據(jù)超載或產(chǎn)生錯誤中斷后產(chǎn)生的。INT0中斷服務(wù)程序流程如圖7所示。
3 控制單元設(shè)計
控制單元的任務(wù)就是對現(xiàn)場環(huán)境參數(shù)進行采集并從CAN總線上接收上位機的命令。根據(jù)上位機的要求,對設(shè)備進行控制或?qū)⒉杉臄?shù)據(jù)通過CAN總線傳給上位機,F(xiàn)以溫室控制單元為例說明控制單元設(shè)計方法。溫室控制單元的結(jié)構(gòu)原理如圖8所示。以AT89C52為核心,采用2片8255擴展I/O端口,其中2個PA口和1個PB口用來檢測天窗、遮陽傘、補光燈、通風機等21路開關(guān)量的狀態(tài)。由于8255的PC口的各位通過置復(fù)位控制字可以單獨置位或復(fù)位,AT89C52的P1口可以按位尋址,所以用8255的2個PC口和AP89C52的P1口來控制繼電器的吸合。3片8位A/D轉(zhuǎn)換器ADC0809實現(xiàn)對溫度、濕度、pH值、CO2濃度、光照強度、液位等20路模擬量的數(shù)據(jù)采集。

控制單元的控制軟件采用匯編語言編程,主要包括初始化、數(shù)據(jù)采集、數(shù)據(jù)通信、I/O接口控制等功能。初始化包括對8255和SJA1000的初始化,使8255的PA、PB口作為輸入口,PC口各位通過置復(fù)位控制字可以單獨置位或復(fù)位,從而開啟或停止一個繼電器的動作。數(shù)據(jù)采集采用查詢方式工作,每一路模擬量連續(xù)采集3次,中值濾波后作為該傳感器的數(shù)據(jù)存入相應(yīng)的內(nèi)部RAM中,全部數(shù)據(jù)采集完后再檢測開關(guān)狀態(tài)并存入相應(yīng)RAM中。隨后開CPU中斷,進入數(shù)據(jù)循環(huán)采集狀態(tài),等待CAN通信中斷的產(chǎn)生。本系統(tǒng)采用中斷方式實現(xiàn)AT89C52與SJA1000之間的通信。

需要說明的是,CAN2.0A或CAN 2.0B協(xié)議只是一個低層的規(guī)范,用戶還需要定制簡單的應(yīng)用層協(xié)議。應(yīng)用層協(xié)議的任務(wù)一方面是將要發(fā)送的數(shù)據(jù)分類、拆卸、合并,確定發(fā)送對象,再根據(jù)CAN的數(shù)據(jù)鏈路層協(xié)議規(guī)范填寫CAN的各個信息幀;另一方面是根據(jù)應(yīng)用層協(xié)議解釋接收數(shù)據(jù)的具體含義,并進行相應(yīng)的處理。





