CAN總線數(shù)據(jù)采集系統(tǒng)設計方案與實現(xiàn)_第1頁
CAN總線數(shù)據(jù)采集系統(tǒng)設計方案與實現(xiàn)_第2頁
免費預覽已結束,剩余41頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、封面作者:PanHongliang僅供個人學習基于 CAN 總線數(shù)據(jù)采集系統(tǒng)的設計與實現(xiàn)CAN 總線通信實驗36內容提要:以 CAN (Controller Area Network)總線控制器 SJA1000 為核心 , 設計了一種通用的基于 CAN 總線的數(shù)據(jù)采集系統(tǒng) , 給出了數(shù)據(jù)采集系統(tǒng)的原理、單 個節(jié)點的軟硬件設計。 重點闡述了 CAN 總線智能節(jié)點的設計、實現(xiàn)與注意事 項。 實驗表明 , CAN總線的多主結構使系統(tǒng)改型靈活 , 數(shù)據(jù)傳輸穩(wěn)定 , 可靠 性好 , 數(shù)據(jù)傳輸速率可達 1Mbit/s,能滿足現(xiàn)場的實時性要求。 CAN 總線的使 用大大節(jié)約了連接導線、維護和安裝費用 , 提

2、高了系統(tǒng)的性價比 , 具有廣泛的 應用前景。關鍵詞:數(shù)據(jù)采集 CAN 總線 現(xiàn)場總線 芯片 SJA 1000目錄一、引言 0二、CAN 總線錯誤!未定義書簽。(一)CAN 總線介紹 0(二)CAN 協(xié)議 0三、結構設計 錯誤!未定義書簽。四、硬件設計 3五、軟件設計 錯誤!未定義書簽。(一)初始化子程序 4(二)發(fā)送子程序 6(三) 查詢方式接收子程序 8六、測試報告 錯誤!未定義書簽。附錄 12參考文獻 .一、引言信息技術的飛速發(fā)展 , 引起了自動化系統(tǒng)結構的變革 , 形成以網絡集成自動化為基 礎的控制系統(tǒng)?,F(xiàn)場總線順應這一形式發(fā)展 , 已成為當前工業(yè)數(shù)據(jù)總線領域中一個新熱 點, 被廣泛應用

3、于工業(yè)現(xiàn)場控制、智能家居、交通工具、環(huán)境監(jiān)測等眾多領域。用數(shù)據(jù)采集系統(tǒng)能實現(xiàn)數(shù)據(jù)采集與處理 , 加入高級算法即可實現(xiàn)智能控制 , 因而減輕了上位 機的負擔。本設計設計了一個通用的基于CAN 總線的數(shù)據(jù)采集卡,著重闡述了它的設計及其實現(xiàn)。二、 CAN 總線(一 )CAN 總線介紹CAN 總線(Cont roller Area Network控制器局域網)是現(xiàn)場總線的一種。它是德國 Bosch 公司在 1986 年為解決現(xiàn)代汽車中眾多的控制與測試儀器之間的數(shù)據(jù)交換而 開發(fā)的一種串行數(shù)據(jù)通訊總線。CAN 總線與其它通信網的不同之處有二:一是報文傳送 中不包含目標地址 , 它是以全網廣播為基礎 , 各

4、接收站根據(jù)報文中反映數(shù)據(jù)性質的標識 符過濾報文 , 該收的收下 , 不該收的棄而不用。其好處是可在線上網下網、 即插即用 和多站接收。二是特別強化了對數(shù)據(jù)安全性的關注 , 滿足控制系統(tǒng)及其它較高數(shù)據(jù)要 求的系統(tǒng)需求。CAN 總線具有下列主要特性:多主站依據(jù)優(yōu)先權進行總線訪問。非破壞性的基于優(yōu)先權的總線仲裁。借助接收濾波的多地址幀傳送。遠程數(shù)據(jù)請求。配置靈活。全系統(tǒng)的數(shù)據(jù)相容性。錯誤檢測和出錯信令。發(fā)送期間若丟失仲裁或由于出錯而遭破壞的幀可自動重發(fā)送。暫時錯誤和永久性故障節(jié)點的判別以及故障節(jié)點的自動脫離 CAN 總線。(二)CAN 協(xié)議數(shù)據(jù)傳輸?shù)耐ㄐ艆f(xié)議是指對數(shù)據(jù)傳輸?shù)募s定 , 包括定時 、控制

5、 、格式化和數(shù)據(jù) 表示方法等等 。1.CA N 分層結構的協(xié)議CAN 是一串行通訊協(xié)議 CAN 總線規(guī)范規(guī)定了任意兩個節(jié)點之間的兼容性 ,包括電氣 特性及數(shù)據(jù)解釋協(xié)議 , 為保證設計使用的透明性及使用的靈活性 ,CAN 協(xié)議分為如下幾 層: 目標層 、傳送層 、物理層 。目標層的功能范圍包括:信息識別、信息狀態(tài)及處理。 傳送層的功能范圍包括: 幀組織、總線仲裁、檢錯、錯誤報告、錯誤處理。 物理層的功能范圍包括: 實際位傳送過程上的電氣特性。2.CA N 網絡通訊協(xié)議總線控制器支持 4 種不同結構的 CAN 協(xié)議幀類型: 數(shù)據(jù)幀用于節(jié)點之間的數(shù)據(jù)傳輸 遠程幀:用于請求發(fā)送具有相同標識符的數(shù)據(jù)幀

6、出錯幀:用于指示檢測到的錯誤狀態(tài) 過載幀:用于提供先前和后續(xù)數(shù)據(jù)幀或遠程幀之間的附加延時 數(shù)據(jù)幀、遠程幀、出錯幀、過載幀都按一定的格式進行編碼 數(shù)據(jù)幀:由 7 個不同的位場構成 , 如圖 1 所示。它們是:幀起始、仲裁場、控制場、CRC 場、ACK 場和幀結束;遠程幀:由 6 個不同的位場構成:幀起始 、仲裁場、控制場、CRC 場、ACK 場、 幀結束出錯幀:由兩個不同的場構成。第一個場由來自不同節(jié)點的錯誤標志疊加給出,后隨的第二個場為錯誤定界符超載幀:包括兩個位場、超載標志和超載界定符。 數(shù)據(jù)幀和遠程幀以幀間空間同先前幀隔開 ,幀編碼和發(fā)送 /接收。圖 1 數(shù)據(jù)幀的構成幀起始、仲裁場、控制場

7、、數(shù)據(jù)場、序列幀段均以位填充方法進行編碼 , 即在以送 位流中檢測到 5 個數(shù)值相同的時候 , 自動插人一個補碼位。數(shù)據(jù)幀或遠程幀的其余位 場、錯誤幀、超載幀為固定格式 , 不使用位填充方法編碼 , 幀中的位流按照非歸零方法 編碼。發(fā)送時從其 SOF 場開始逐個位場發(fā)送。對于發(fā)送器和接收器,一幀的有效點是不同 的。對于發(fā)送器 , 若在幀結束完成前不存在錯誤 , 則該幀有效。 對于接收器 , 若在幀結束最后一位前不存在錯誤 , 則該幀有效??偩€訪問和仲裁:當檢測到間歇場未被 “顯性”位中斷后 , 認為總線被所有節(jié)點釋放??偩€被釋放 后 , “錯誤一激活”節(jié)點可以訪問總線。當許多節(jié)點一起開始發(fā)送時

8、 , 只有發(fā)送具有 最高優(yōu)先權的幀節(jié)點變?yōu)榭偩€主機 , 享有對總線的控制權。這種解決總線訪問沖突的機 理是基于競爭的促裁,依據(jù)標識符和緊隨其后的 RTF 位來完成。錯誤檢測:在 CAN 中存在 5 類不同的錯誤位錯誤、填充錯誤、CRC 錯誤、形式錯誤、應答錯誤、在網絡中的任何一個節(jié)點 , 根據(jù)其錯誤計數(shù)器的數(shù)值 , 可能處于下列 3 種狀態(tài)之-.“錯誤一激活”節(jié)點:一個“錯誤一激活”節(jié)點可以正常參與總線通信 , 并在檢測到錯誤時 , 發(fā)出一個激 活錯誤標志?!板e誤一認可”節(jié)點:一個“錯誤一認可”節(jié)點不應發(fā)送激活錯誤標志 , 它參與總線通信 , 但在檢測到錯 誤時 ,發(fā)出一個認可錯誤標志?!翱偩€

9、脫離”節(jié)點:當一個節(jié)點由于請求故障界定實體而對總線處于關閉狀態(tài)時 , 其處于“總線脫離” 狀態(tài),在“總線脫離”狀態(tài)。為了進行錯誤界定 , 在總線上的每一個單元中都設有兩種計數(shù)器:發(fā)送出錯計數(shù)器 和接收出錯計數(shù)器 , 錯誤計數(shù)器的值按照一定的規(guī)則進行修正。當節(jié)點的發(fā)送計數(shù)器或接收計數(shù)器的值超過 127 時 , 則監(jiān)控器要求置相應節(jié)點為 “錯誤一認可”狀態(tài) , 送出一個激活標志。 當發(fā)送計數(shù)器或接收計數(shù)器的值均小于或等 于 127 時 , “錯誤一認可”節(jié)點再次變?yōu)?“錯誤一激活” 。當節(jié)點的發(fā)送計數(shù)器的值超過 255 時 , 則監(jiān)控器要求置相應節(jié)點為“脫離總線”狀 態(tài)。處于“脫離總線”狀態(tài)的節(jié)點

10、 , 在監(jiān)測到總線上出現(xiàn) 128 次 11 個連續(xù)的“隱性” 位 ,變?yōu)閮蓚€錯誤計數(shù)器均為 0 的“錯誤一激活”節(jié)點。三、結構設計數(shù)據(jù)采集系統(tǒng)由數(shù)據(jù)采集模塊和數(shù)據(jù)傳輸模塊組成, 其中數(shù)據(jù)傳輸通過 CAN(Controller Area Network)總線來實現(xiàn)。 控制器局域網 CAN 屬于現(xiàn)場總線范疇,它 是一種有效支持分布式控制或實時控制的串行通信網絡。系統(tǒng)采用總線式網絡拓撲結構 其系統(tǒng)總體結構如圖 2 所示。圖 2 系統(tǒng)總體結構選用 CAN 總線連接各 節(jié)點 , 形成多 主控制器的局域網。 CAN 總線 符合 ISO11898標準,最多可掛接 110 個節(jié)點,采用 CAN 總線特有的多主

11、傳送方式,各采集 控制器根據(jù)現(xiàn)場需要 , 當有數(shù)據(jù)時可自主發(fā)送 , 無需主機不停地輪巡 , 節(jié)省了網絡上的 數(shù)據(jù)流量 , 提高了傳輸效率。 CAN 總線傳輸介質為雙絞線或同軸電纜 , 走線少、系統(tǒng) 易擴展、改型靈活 , 正是由于這些其他通信方式無法比擬的優(yōu)點 , 才使之成為系統(tǒng)分布 比較分散的數(shù)據(jù)采集系統(tǒng)的理想總線。數(shù)據(jù)采集系統(tǒng)將由現(xiàn)場傳感器送來的數(shù)據(jù)發(fā)送到空閑的CAN 總線上,而總線上各節(jié)點通過預先設置好的驗收碼和驗收屏蔽碼 , 來決定是否使用這個消息。 如果采集的數(shù) 據(jù)需要進一步進行處理 , 則上位機可從總線上接收數(shù)據(jù)并對其處理。 處理后的數(shù)據(jù)再 送回 CAN 總線,經數(shù)模轉換模塊或其他節(jié)

12、點進行控制操作。當上位機需對某個節(jié)點施以控制時 , 可采用點對點的方式與該節(jié)點進行通訊。 而當它需要對所有節(jié)點加以控制 時, 則采用廣播方式將命令發(fā)送到總線。 這樣大大減少了數(shù)據(jù)的傳輸量 , 從而提 高了系統(tǒng)的傳輸速率 ,同時又保證了系統(tǒng)的實時性和可靠性。 下面以數(shù)據(jù)采集系統(tǒng)中 的數(shù)據(jù)采集節(jié)點為例來說明單個節(jié)點的設計思想。四、硬件設計數(shù)據(jù)采集系統(tǒng)單個節(jié)點硬件框圖如圖 3 所示, 由傳感器檢測的信息經多路開關送到可編程放大器 PGA 204, 根據(jù)信號大小調節(jié)放大倍數(shù) (1, 10, 100, 1 000倍) , 放大后 ,經 AD574 轉換為數(shù)字信號,送入微處理器中存儲,然后根據(jù)現(xiàn)場情況的需

13、要,將信號發(fā) 送到 CAN總線上,被其他節(jié)點或上位機接收。圖 3 節(jié)點硬件框圖由于以 AD574 為 A/D 轉換器的數(shù)據(jù)采集卡比較普及,故下面重點闡述數(shù)據(jù)傳輸部 分,即CAN 總線智能節(jié)點的設計與實現(xiàn)。CAN 總線上的節(jié)點是網絡上的信息接收和發(fā) 送站,由于節(jié)點主要由單片機和可編程的CAN 通信控制器組成,能通過編程設置工作方式、ID 地址、波特率等參數(shù),故稱其為智能節(jié)點。CAN 節(jié)點原理圖如圖 4 所示。 89C51 是節(jié)點的微處理器,作為一個存儲器 I/O 映象設備,負責對控制器 SJA 1000 初 始化, 并控制其實現(xiàn)數(shù)據(jù)的收發(fā)等通信任務。 在 CAN 總線通信接口中 , 使用 PH

14、ILIPS 公司的 SJA 1000 和 TJA 1040 芯片。SJA 1000 是獨立的 CAN 通信控制器,用于完成 CAN 總線通信協(xié)議的物理層和數(shù)據(jù)鏈路層的功能。TJA1040 為高性能、高速 CAN收發(fā)器, 使用它可增大通信距離 , 提高系統(tǒng)瞬間抗干擾能力 , 改良系統(tǒng)的抗電磁干擾及 電磁輻射性能 , 保護總線, 降低射頻干擾 , 實現(xiàn)熱防護等。圖 4 CAN 節(jié)點原理圖為進一步提高抗干擾能力,在 CAN 控制器 SJA 1000 和驅動器 TJA 1040 之間使用 了高速光耦器件 6N137 構成隔離電路,傳輸介質采用雙絞線(或同軸電纜)分別接至 CAN 收發(fā)器TJA 1040

15、 的 CANH 和 CANL 引腳。同時在總線兩端 CANH 和 CANL 之間加上 分離中斷的 1208 終端電阻, 對總線阻抗匹配起著相當重要的作用 4 。此外, 為使 CAN 控制器和微處理器能同時可靠復位,外加了手動復位電路。SJA 1000 的中斷輸出 信號(/N T) 接至單片機的中斷引腳 IN T0,通過中斷方式實現(xiàn)單片機與 CAN 控制器 的通信。 在電路實際調試過程中須注意以下幾點。1. 總線的兩個 1208 終端電阻不可忽略。 否則會使數(shù)據(jù)通信的抗干擾性和可靠性降 低, 嚴重時可導致無法通信。2. TJA 1040 (與 PCA 82C250 兼容)的 “SPLIT” 引腳

16、(代替 82C250 “ V ref ”引 腳),對總線 DC 穩(wěn)壓很有效4 。如果“ SPL IT”用于共模電壓的 DC 穩(wěn)壓,這個“SPL IT”弓|腳要連接到分離中斷的中間分接頭。若“SPL IT”不使用,只需保持開路即可。3. TJA 1040 引腳“ STB 一般被直接連接到微處理器輸出口,以便于控制收發(fā)器的 工作模式。五、軟件設計CAN 總線節(jié)點的軟件設計主要包括三大部分:CAN 節(jié)點初始化、報文發(fā)送和報文接收。熟悉這三部分程序的設計, 就能編寫出利用 CAN 總線進行通信的一般應用程 序。當然要將 CAN 總線應用于通信任務比較復雜的系統(tǒng)中還需詳細了解有關CAN 總線錯誤處理、總

17、線脫離處理、接收濾波處理、波特率參數(shù)設置和自動檢測以及CAN 總線通信距離和節(jié)點數(shù)的計算等方面的內容。下面僅就前面提到的三部分程序的設計作一個描 述,以供大家在實際應用中參考。(一)初始化子程序SJA1000 的初始化只有在復位模式下才可以進行。初始化主要包括工作方式的設置 接收濾波方式的設置,接收屏蔽寄存器 AMR 和接收代碼寄存器 ACR 的設置,波特率參數(shù)設置和中斷允許寄存器 IER 的設置等。在完成 SJA1000 的初始化設置以后 SJA1000 就可以回到工作狀態(tài) 進行正常的通信任務。下面提供了 SJA1000 初始化的 51 匯編源 程序。程序中寄存器符號表示的是 SJA1000

18、 相應寄存器占用的片外存貯器地址 這些符 號可在程序的頭部用偽指令EQU進行定義。后文對這一點不再作特別說明。CANINI:MOVDPTR,#MOD;方式寄存器MOVA ,#09H;進入復位模式 對 SJA1000 進行初始化.MOVXDPT,RAMOVDPTR,#CDR;時鐘分頻寄存器MOVA ,#88H;選擇 PeliCAN 模式 關閉時鐘輸出 CLKOUTMOVXDPT,RAMOVDPTR,#IER;中斷允許寄存器MOVA ,#0DH;開放發(fā)送中斷 超載中斷和錯誤警告中斷MOVXDPT,RAMOVDPTR,#AMR;接收屏蔽寄存器MOVR6,#4MOVR0 ,#DAMR;接收屏蔽寄存器內

19、容在片內RAM 中的首址AMR:MOVA R0MOVXDPTR, A;接收屏蔽寄存器賦初值INCDPTRDJNZR6 ,AMRMOVDPTR,#ACR?接收代碼寄存器MOVR6 ,#4MOVR0,#DACR;接收代碼寄存器內容在片內RAM 中的首址 ACR:MOVA,R0MOVXDPT,RA;接收代碼寄存器賦初值INCDPTRDJNZR6ACRMOVDPTR,#BTR0;總線定時寄存器 0MOVA,#03HMOVXDPT,RAMOVDPTR,#BTR1;總線定時寄存器 1MOVA ,#0FFH?16MHz 晶振情況下 設置波特率為 80kbps.MOVXDPT,RAMOVDPTR,#OCR;輸

20、出控制寄存器MOVA ,#0AAHMOVXDPTR,AMOVDPTR,#RBSA;接收緩存器起始地址寄存器MOVA,#0;設置接收緩存器 FIFO 起始地址為 0MOVXDPT,RAMOVDPTR,#TXERR;發(fā)送錯誤計數(shù)寄存器 .MOVA ,#0;清除發(fā)送錯誤計數(shù)寄存器MOVXDPT,RAMOVDPTR,#ECC;錯誤代碼捕捉寄存器MOVXA ,DPTR ;清除錯誤代碼捕捉寄存器MOVDPTR,#MODE;方式寄存器MOVA ,#08H;設置單濾波接收方式 并返回工作狀態(tài)MOVXDPTR,ARET(二)發(fā)送子程序發(fā)送子程序負責節(jié)點報文的發(fā)送, 發(fā)送時用戶只需將待發(fā)送的數(shù)據(jù)按特定格式組 合成

21、一幀報文送入 SJA1000 發(fā)送緩存區(qū)中,然后啟動 SJA1000 發(fā)送即可。當然在往 SJA1000 發(fā)送緩存區(qū)送報文之前必須先作一些判斷。如下文程序所示,發(fā)送程序分發(fā)送遠程幀和數(shù)據(jù)幀兩種:遠程幀無數(shù)據(jù)場。下面以發(fā)送數(shù)據(jù)幀為例對發(fā)送子程序作一個說 明。TDATA:MOVDPTR,#SR;狀態(tài)寄存器MOVXA,DPTR;從 SJA1000 讀入狀態(tài)寄存器值JBACC.4,TDATA;判斷是否正在接收 正在接收則等待TS0:MOVXA, DPTRJNBACC.3 , TS0;判斷上次發(fā)送是否完成 未完成則等待發(fā)送完成TS1:MOVXA,DPTRJNBACC.2 ,TS1;判斷發(fā)送緩沖區(qū)是否鎖定

22、 鎖定則等待TS2:MOVDPTR, #CANTXB;SJA1000 發(fā)送緩存區(qū)首址MOVA ,#88H;發(fā)送數(shù)據(jù)長度為 8 個字節(jié)的擴展幀格式報文MOVXDPT,R AINCDPTRMOVA , #ID0;4 個字節(jié)的標識符 ID0-ID3MOVXDPT,R AINCDPTRMOVA,#ID1MOVXDPT,R AINCDPTRMOVA , #ID2MOVXDPT,R AINCDPTRMOVA,#ID3MOVXDPT,RAMOVR0,#TRDATA; CPU 發(fā)送數(shù)據(jù)區(qū)首址MTBF:MOVA,R0INCDPTRMOVXDPT,R AINCR0CJNER0,#TRDATA+8 MTBF 向發(fā)送

23、緩沖區(qū)寫 8 個字節(jié)MOVDPTR, #CMR;命令寄存器地址MOVA,#01HMOVXDPTR, A;啟動 SJA1000 發(fā)送RET三)查詢方式接收子程序接收子程序負責節(jié)點報文的接收以及其它情況處理,接收子程序比發(fā)送子程序 要復雜一些。因為在處理接收報文的過程中,同時要對諸如總線脫離、錯誤報警、 接收溢出等情況進行處理 SJA1000 報文的接收主要有兩種方式:中斷接收方式和查 詢接收方式。如果對通信的實時性要求不是很強,建議采用查詢接收方式。兩種接 收方式編程的思路基本相同,下面僅以查詢方式接收報文為例對接收子程序作一個 說明。SEARC:HMOVDPTR,#SR;狀態(tài)寄存器地址MOVX

24、A ,DPTRANLA ,#0C3H;讀取總線脫離 錯誤狀態(tài) 接收溢出JNZPROCRET;無上述狀態(tài) 結束PRO:CJNBACC.7 , PROCIBUSER:RMOVDPTR,#IR;IR 中斷寄存器 出現(xiàn)總線脫離MOVXDPTR;讀中斷寄存器 清除中斷位 .MOVA,MOVX DP,TR0LCALL ALARM.RETNOPPROC:IMOV DPTR ,MOVX A ,NBACC.3,OVER:MOVDPTR,MOVA,MOVXDPT,R A出 RETNOPOTHE:RJB ACC.0 , RECE 收LJMP RECOUT;數(shù)據(jù)溢出中斷置位 .#0CH;在命令寄存器中清除數(shù)據(jù)溢;IR

25、.0=1 接收 FIFO 未滿或接;IR.0=0 接收緩沖區(qū)無數(shù)據(jù)退出接收NOPRECE:MOVDPTR, #CANRXBMOVXA,DPTRJNBACC.6,RDATAMOVDPTR, #CMRMOVA , #04HMOVXDPTR , A;LCALLTDATAMOVDPTR,#MODE;方式寄存器地址#IRDPTROTHER#CMR#08H;將方式寄存器復位請求位清;調用報警子程序;總線正常;讀取中斷位;接收緩沖區(qū)首地址 16 準備讀取數(shù);首字節(jié)是接收幀格式字;RTR=1 是遠程請求幀無數(shù)據(jù); CMR.2=1 釋放接收緩沖區(qū)只有接收了數(shù)據(jù)才能釋放接收緩沖區(qū);發(fā)送對方請求的數(shù)據(jù)LJMP RE

26、COUTNOPRDAT:AMOV DPTR,#CANRXB;讀取并保存接收緩沖區(qū)的數(shù)據(jù)MOVR1 ,#CPURBF; CPU 片內接收緩沖區(qū)首址MOVXA ,DPTR;讀取讀取 CAN 緩沖區(qū)的 2 號字節(jié)MOVR1 ,A;保存ANLA,#0FH;截取低 4 位是數(shù)據(jù)長度 08ADDA ,#4;加 4 個字節(jié)的標識符IDMOV R6 , ARDAT:AINC DPTRINCR1MOVXA, DPTRMOV R1,ADJNZR6, RDATA0;循環(huán)讀取與保存MOVDPTR, #CMRMOVA ,#04H;釋放 CAN 接收緩沖區(qū)MOVXDPTR,ARECOU:TMOVDPTR, #ALCMOV

27、XA,DPTRMOVDPTR, #ECCMOVXA,DPTRNOPRET需要注意的是 : SJA 1000 的初始化只有在復位模式下才可以進行。 在對 SJA 1000 寄存器設定前 , 主控制器通過讀復位模式 ? 請求標志來檢查 SJA 1000 是否已達到 復位模式。 在復位模式下 , 主控制器必須配置 SJA 1000 控制段的寄存器。 時鐘輸出;退出接收控制寄存器(OCR)的內容決定 CAN 控制器的輸出方式。驗收代碼(ACR)和驗收屏蔽(AMR) 寄存器根據(jù)實際網絡系統(tǒng)和報文標志符來確定, 須引起注意的是 : ACR 位(AC172 AC10)和信息識別碼的高 8 位(ID1102I

28、D13) 相等,且與 AMR 位(AM 172 AM 10) 的相應位相或為 1,即:(ID1102ID13) 三(AC172 AC10) V(AM 172 AM 10) 三 1111 1111滿足上述條件的報文才予以接收 3 。 BTR0、 BTR1 寄存器的內容可唯一地確定系統(tǒng) 的通信波特率和同步跳轉寬度 , 所以整個系統(tǒng)中的所有節(jié)點 , 這兩個寄存器的內容必須 相同 ( 包括上位機 ) , 否則將無法進行通信。六、測試報告實驗達到了預定結果,可以將各個分布點的測量數(shù)據(jù)準確發(fā)送到指定CAN 節(jié)點。CAN 總線最高速度達到 1M實驗用電路板如圖 4 所示。圖 5 實驗用電路板七、總結由基于

29、CAN 總線的智能節(jié)點在數(shù)據(jù)采集卡中的實際運用表明,在實驗室條件下數(shù) 據(jù)傳輸速率最高可達 1M / s, 誤碼率低, 當節(jié)點出現(xiàn)嚴重錯誤時 , 可自動脫離總線而 整個系統(tǒng)不受影響。 由此, 該節(jié)點的設計方案是可行的 , 既可提高系統(tǒng)的可靠性、數(shù) 據(jù)傳輸速度 , 又具有操作簡便、實時性強、擴展靈活、糾檢錯能力強等特點 , 另外 , 它 可大大節(jié)約連接導線、維護和安裝費用 , 提高了系統(tǒng)的性價比。 因此可廣泛應用于各 種測控系統(tǒng)中。八、 致 謝本設計是在導師汪老師的精心指導和鼓勵下完成的。汪老師開闊的視野,嚴謹?shù)膶W 風和真誠謙遜的為人,使我在這次設計過程中受益匪淺。汪老師在生活等各方面給我的 關懷

30、和幫助也將令我終生難忘。在此,謹向汪老師表示衷心的感謝。感謝我的父母,是他們無私的愛的支持和鼓勵使我順利完成學業(yè)! 感謝同組的同學對我的幫助和支持! 此外,我還要感謝在我的論文中所有被援引過的文獻的作者,他們是我的知識之(一) 源程序:#include reg51.h#define uchar unsigned char最后,再次向所有曾經給予我?guī)椭凸膭畹睦蠋熀屯瑢W致以最誠摯的謝意!附錄#define uint unsigned intsbit PB=P2A7。sbit LAMP=P2A6。uchar RTR_BIT=0 。uchar INT_FLAG=0 。uchar stat 。 /*/

31、CAN 總線寄存器映射表/ 高 4 地址:0000#define RXF0SIDH 0 x0#define RXF0SIDL 0 x01#define RXF0EID8 0 x02#define RXF0EID0 0 x03#define RXF1SIDH 0 x04#define RXF1SIDL 0 x05#define RXF1EID8 0 x06#define RXF1EID0 0 x07#define RXF2SIDH 0 x08#define RXF2SIDL 0 x09#define RXF2EID8 0 x0a#define RXF2EID0 0 x0b#define BFPC

32、TRL 0 x0c#define TXRTSCTRL 0 x0d#define CANSTAT 0 x0e#define CANCTRL 0 x0f / 高 4 地址:0001#define RXF3SIDH 0 x10#define RXF3SIDL 0 x11#define RXF3EID8 0 x12#define RXF3EID0 0 x13#define RXF4SIDH 0 x14#define RXF4SIDL 0 x15#define RXF4EID8 0 x16#define RXF4EID0 0 x17#define RXF5SIDH 0 x18#define RXF5SI

33、DL 0 x19#define RXF5EID8 0 x1a#define RXF5EID0 0 x1b#define TEC 0 x1c#define REC 0 x1d/ / / 高 4 地址:0010#define RXM0SIDH 0 x20#define RXM0SIDL 0 x21#define RXM0EID8 0 x22#define RXM0EID0 0 x23#define RXM1SIDH 0 x24#define RXM1SIDL 0 x25#define RXM1EID8 0 x26#define RXM1EID0 0 x27#define CNF3 0 x28#de

34、fine CNF2 0 x29#define CNF1 0 x2a#define CANINTE 0 x2b前 XO乙aiaxi9U!PP#XOmLaxi9U!PP#90oaiaxiQUjpp#MXOonaLaxiQUjpp#oaoLaxiQUjpp#曲XO8ai3Laxi QUjpp#乙怩0naiSLaxi QUjpp#XOHaisiaxiQUjpp#Otxo13丄9L9X1QUjpp#OOLOWt7M /llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

35、llllllllllllllllllllllllllllllllllPSXOzaoaxiQUjpp#Cxo9aoaxiQUjpp#qexogaoaxi9U!PP#egxozaoaxi9U!PP#6SX0eaoaxiQUjpp#8SX0乙aoaxi QUjpp#zexomoaxiQUjpp#9SX0oaoaxiQUjpp#9SX0onaoaxiQUjpp#妮xo oaooaxiQUjpp#eexo8aooaxiQUjpp#乙X0 naisoaxiQUjpp#比xoHaisoaxiQUjpp#oexo 13丄ooaxi QUjpp#lllllllllllllllllllllllllllllllll

36、lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllP乙xo9U3 9Uipp#。乙xoT 丄N IN VO suipp#99xo onaoaxd捋p#txo oaooaxd捋p#9X0 8ai30aXd 9Uipp#乙9x0 naisoaxd uipp#L9X0 Haisoaxd suipp#09X0 13丄ooaxd 9Uipp#OLLOWt7M /lllllllllllllllllllllllllllllllllllllllllllllllllllll

37、lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllpgxoZG乙日X丄QUjpp#gxo9G乙日X丄QUjpp#qgxo9G乙日X丄QUjpp#egxo力0乙日X丄QUjpp#69xo0乙日X丄QUjpp#89xo乙CI乙日X丄QUjpp#zgxo2 乙日X丄QUjpp#99xo0G乙日X丄QUjpp#ggxoona乙日x丄QUjpp#均xooao乙日x丄QUjpp#egxo8013乙日X丄QUjpp#乙gxo1GIS乙日X丄QUjpp#L9X0HGIS乙日X丄QUjpp#09X0 -13丄0乙

38、日X丄QUjpp#llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllPtxozaiaxiQUjpp#X09aL9XlQUjpp#qtxogaiaxi9U!PP#etzxow日x丄9U!PP#60eaiaxiQUjpp#sox。av3d ai/io suipp# 09X0丄3S3d_ai/IO 9Uipp#髦僉畀Ids/lllllllllllllllllllllllllllllllllllll

39、lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllp/xo zaiaxd uipp#zxo 9aL9Xd 9Uipp#q/xo gaiaxd uipp#B/xo w日euipp#6/xo caiaxd uipp#8/xo乙aiaxd suipp#zzxo mLaxd uipp#9/xo oaiaxd suipp#9/xo onakaxd uipp#txo oaokaxd uipp#ezxo 8ai3Laxd uipp#乙zxo naisiaxd uipp#以x

40、o Haisiaxd suipp#0/xo 13丄9L9Xd suipp#M /llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllP9xozaoaxd uipp#9xo9aoaxd suipp#q9xogaoaxd uipp#egxotaoaxd suipp#69xoeaoaxd uipp#89xo乙aoaxd suipp#Z9xomoaxd uipp#99x0oaoaxduipp#defi

41、ne CMD_RD_RXBUF 0 x90#define CMD_WRITE 0 x02#define CMD_WR_TXBUF 0 x40#define CMD_RTS 0 x80 #defineCMD_RD_STATUS 0 xa0#define CMD_RX_STATUS0 xb0 #define CMD_BIT_M 0 x05/ /SPI 控制寄存器 SPCTL#define SPI _CLK_40 x0#define SPI _CLK_16 0 x01#define SPI _CLK_64 0 x02#define SPI _CLK_128 0 x03#define SPI _CPH

42、A0 x04#define SPI _CPOL0 x08#define SPI _MSTR0 x10#define SPI_DORD0 x20#define SPI _SPEN0 x40#define SPI _SSIG0 x80/SPI 狀態(tài)寄存器 SPSTAT #define SPI_SPIF 0 x80 #define SPI_WCOL 0 x40/sbit SS=P1A4。uchar SPIdata16 。 uchar uart_data 。uchar Status 。void SendByte(uchar temp)ES=0TI=0。SBUF=temp while(!TI) 。TI=

43、0。ES=1。Uart_int() interrupt 4if(RI=1)RI=0 。uart_data=SBUF 。SendByte(uart_data)elseTI=0 。void Uart_Init()TMOD=0 x20 。TL1=0 xfd。TH1=0 xfd。SCON=Ox5。AUXR&=OxbfET1=O 。TR1=1fEA=1fvoid delay(uchar n)uchar i0for(i=0 。in。i+)。void SPI_Initial()/CPU時鐘64分頻,SPI 1,1 模式,SPI主機模式,MSB傳輸,SPI使能,SS引腳忽略,用于 I/O輸出SPCTL

44、=SPI_CLK_64|SPI_CPHA|SPI_CPOL|SPI_MSTR|SPI_SPEN|SPI_SSIG/ 配置 SS 引腳,推挽輸出,初始化高電平P1M0|=04 。P1M1|=14 。SS=1 。/SPI 中斷禁止,使用軟件查詢方式EADC_SPI=0 。 AUXR&=!(13)。/ 參數(shù) 1:數(shù)組指針,指向待傳輸?shù)臄?shù)組首/ 參數(shù) 2: 傳送字節(jié)數(shù)/ 功能完成 SPI 連續(xù)寫操作void SPI_Write(uchar a,uchar n)uchar i=0。SS=0 。SPSTAT|=SPI_SPIF 。while(in)SPDAT=ai 。/while(!( SPSTA

45、T & SPI_SPIF )ai=SPDAT 。/SPSTAT|=SPI_SPIF 。 i+SS=1發(fā)送 1 字節(jié)數(shù)據(jù)/ 等待傳送完畢接收 1 字節(jié)數(shù)據(jù)/SJ1000 復位void SJ1000_Reset()SPIdata0=CMD_RESET 。SPI_Write(SPIdata,1) 。/ 參數(shù) 1:被訪問寄存器的地址/ 參數(shù) 2:連續(xù)讀寫寄存器的個數(shù)/SJ1000 讀操作/ 讀取的內容存儲在 SPIdata2SPIdata16 中, 存儲字節(jié)由 n 決定 void SJ1000_Read(ucharaddr,uchar n)SPIdata0=CMD_READ 。SPIdata1

46、=addr 。SPI_Write(SPIdata,n+2) 。#define AddrFunc_RXB0SIDH 0 x0#define AddrFunc_RXB0D0 0 x1#define AddrFunc_RXB1SIDH 0 x2#define AddrFunc_RXB1D0 0 x3/參數(shù) 1:讀 RX 緩沖器 4 功能地址之一/ 參數(shù) 2:連續(xù)讀寫寄存器的個數(shù)/SJ1000 讀緩沖器操作/ 讀取的內容存儲在 SPIdata1SPIdata16 中,存儲字節(jié)由 n 決定 voidSJ1000_RD_Buffer(uchar addr,uchar n)SPIdata0=CMD_RD_R

47、XBUF+(addr1) 。SPI_Write(SPIdata,n+1)/ 參數(shù) 1:被訪問寄存器的地址/ 參數(shù) 2:連續(xù)讀寫寄存器的個數(shù)/SJ1000 寫操作/ 寫入的內容存儲在 SPIdata2SPIdata16 中, 存儲字節(jié)由 n 決定 void SJ1000_Write(ucharaddr,uchar n)SPIdata0=CMD_WRITE 。SPIdata1=addr 。SPI_Write(SPIdata,n+2) 。#define AddrFunc_TXB0SIDH 0 x0#defineAddrFunc_TXB0D00 x1#define AddrFunc_TXB1SIDH

48、0 x2#defineAddrFunc_TXB1D00 x3#define AddrFunc_TXB2SIDH 0 x4#defineAddrFunc_TXB2D00 x5/參數(shù)1寫TX緩沖器 6 功能地址之一/參數(shù) 2:連續(xù)讀寫寄存器的個數(shù)/SJ1000 寫緩沖器操作/ 寫入的內容存儲在 SPIdata1SPIdata16 中,存儲字節(jié)由 n 決定 voidSJ1000_WR_Buffer(uchar addr,uchar n)SPIdata0=CMD_WR_TXBUF+addr。SPI_Write(SPIdata,n+1) 。/SJ1000 請求發(fā)送 RTS 旨令/ 參數(shù) :num 標明請

49、求發(fā)送的報文序列void SJ1000_RTS(uchar num)SPIdata0=CMD_RTS+num 。SPI_Write(SPIdata,1) 。/SJ1000 讀取狀態(tài)指令void SJ1000_RD_Status()SPIdata0=CMD_RD_STATUS。SPI_Write(SPIdata,2) 。/SJ1000 讀取 RX 狀態(tài)指令void SJ1000_RX_Status()SPIdata0=CMD_RX_STATUS。SPI_Write(SPIdata,2) 。/SJ1000 位修改指令/ 參數(shù) 1: 指向待修改寄存器地址/ 參數(shù) 2: 修改保護屏蔽字節(jié)/ 參數(shù) 3:

50、 修改數(shù)據(jù)字節(jié)void SJ1000_BIT_M(uchar addr,uchar mask,uchar ndata)SPIdata0=CMD_BIT_M 。SPIdata1=addr 。SPIdata2=mask 。SPIdata3=ndata 。SPI_Write(SPIdata,4) 。/CANCTRL-CAN 空制寄存器/BIT7:5 請求工作模式的位#define Normal_Mode 0 x0#define Sleep_Mode 0 x20#define Loop_Mode 0 x40#define Listen_Mode 0 x60#define Config_Mode 0 x

51、80/BIT4 中止所有當前報文發(fā)送的位#define ABAT0 x10/BIT3 單觸發(fā)模式位使能#define OSM0 x08/BIT2CLKOUT 引腳使能#define CLKEN 0 x04 /BIT1:0CLKOUT 引腳預分頻比#defineFclkout_10 x00#defineFclkout_20 x01 /2分頻#defineFclkout_40 x02 /4分頻#defineFclkout_80 x03/8分頻void SJ1000_Init()/ 使 SJ1000 進入配置模式SPIdata2=Config_Mode 。SJ1000_Write(CANCTRL,1

52、) 。/ 位定時,晶振 8M,傳輸速率 125kb/s/* SPIdata2=5 。 /CNF3SPIdata3=(17)|(63)|(10) 。 /CNF2SPIdata4=0 x01 。 */ /CNF1SPIdata2=3 。/CNF3SPIdata3=(17)|(33)|0X06 。 /CNF2SPIdata4=0 x01 。/CNF1SJ1000_Write(CNF3,3) 。/ 將芯片 TXnRTS 引腳都配置成數(shù)字輸入SPIdata2=0 。SJ1000_Write(TXRTSCTRL,1) 。/將芯片 RXnBF 引腳配置成數(shù)字輸出,引腳功能禁止SPIdata2=0 x0c 。

53、SJ1000_Write(BFPCTRL,1) 。/ 接收濾波器 RXF02 設置濾波位,濾波標準幀標識分別為展幀標識統(tǒng)一為 0 x05555/RXF0 相關 4 寄存器SPIdata2=0 xaa 。SPIdata3=0 x08 。/ 報文濾波僅用于標準幀SPIdata4=0 x55 。SPIdata5=0 x55 。/RXF1 相關 4 寄存器SPIdata6=0 xbb 。SPIdata7=0 x08 。SPIdata8=0 x55 。SPIdata9=0 x55 。/RXF2 相關 4 寄存器SPIdata10=0 xcc 。SPIdata11=0 x0 。SPIdata12=0 x5

54、5 。SPIdata13=0 x55 。SJ1000_Write(RXF0SIDH,12) 。/接收濾波器 RXF35 設置濾波位,濾波標準幀標識分別為 展幀標識統(tǒng)一為 0 x05555/RXF3 相關 4 寄存器SPIdata2=0 x66 。SPIdata3=0 x0 。/ 報文濾波僅用于標準幀SPIdata4=0 x55 。SPIdata5=0 x55 。/RXF4 相關 4 寄存器SPIdata6=0 x77 。SPIdata7=0 x0 。SPIdata8=0 x55 。0 x550,0 x5d8,0 x660, 擴0 x330,0 x3b8,0 x440, 擴/ SPIdata2=

55、Normal_ModeoSPIdata9=0 x55 。/RXF5 相關 4 寄存器SPIdata10=0 x88 。SPIdata11=0 x0 。SPIdata12=0 x55 。SPIdata13=0 x55 。SJ1000_Write(RXF3SIDH,12) 。/RXM0RXM1 驗收屏蔽寄存器設置/RXM0SPIdata2=0 xff 。SPIdata3=0 x03 。SPIdata4=0 xff 。SPIdata5=0 xff 。/RXM1SPIdata6=0 xff 。SPIdata7=0 x03 。SPIdata8=0 xff 。SPIdata9=0 xff 。SJ1000_

56、Write(RXM0SIDH,8)。SPIdata2=0 x00 。SJ1000_Write(RXB0CTRL,1)。SPIdata2=0 x00 。SJ1000_Write(RXB1CTRL,1)。/SJ1000_BIT_M(RXB0CTRL,0 x60,0 x20) 。 / 接收緩沖器 0 設定接收符合濾波器 條件的所有帶擴展標識符或標準標識符的有效報文/SJ1000_BIT_M(RXB1CTRL,0 x60,0 x20) 。 / 接收緩沖器 1 設定接收符合濾波器 條件的所有帶擴展標識符或標準標識符的有效報文SPIdata2=0 x05 。SJ1000_Write(CANINTE,1)

57、。/ SPIdata2=Normal_ModeoSPIdata2=Loop_Mode 。 /進入 SJ1000 測試模式SJ1000_Write(CANCTRL,1)o/SJ1000 發(fā)送報文函數(shù)/ 參數(shù) 1:表明發(fā)送緩沖區(qū)的序號 ,對應 TXB0TXB1/ 參數(shù) 2:區(qū)分發(fā)送標準標識符 :0/ 擴展標識符 :1/ 參數(shù) 3:區(qū)分發(fā)送數(shù)據(jù)幀 :0/ 遠程請求 :1/ 參 數(shù) 4: 發(fā) 送 數(shù) 據(jù) 幀 的 字 節(jié) 數(shù) 18, 發(fā) 送 數(shù) 據(jù) 字 節(jié) 存 儲 范 圍 在SPIdata6SPIdata6+data_num-1void SJ1000_TX(uchar num,uchar Ex_Fram

58、e,uchar RTR_Flag,uchar data_num)/ 數(shù)據(jù)寫入發(fā)送緩沖器之前,必須對 TXBn CTRL.TXREQ 清零SJ1000_BIT_M(TXB0CTRL|(num4),0 x08,0 x00) 。SPIdata1=0 x99 。/ 寫入標識符, TXBnSIDH,TXBnSIDL,TXB0EID8,TXB0EID0if(Ex_Frame=0)SPIdata2=(05)|(03)。/ 報文只發(fā)送標準標識符為 0 x550SPIdata3=0 x55 。SPIdata4=0 x55 。else/使能報文發(fā)送擴展標識符,設定為 0 x15555SPIdata2=(15)|(

59、13)|(10) 。SPIdata3=0 x55。SPIdata4=0 x55。SJ1000_WR_Buffer(num1),(5+data_num)if(RTR_Flag=0) /SPIdata5=data_num&0 x0f發(fā)送數(shù)據(jù)幀/ 發(fā)送數(shù)據(jù)幀的字節(jié)數(shù)SPIdata5=(16) 。 SJ1000_WR_Buffer(num1),5) 。 SJ1000_BIT_M(TXB0CTRL|(num6 。RXB_type=(Status3) & 0 x03 。RXB_FILTER=Status & 0 x07 。if(RXB_num=OxO1) /收到報文在 RXB(中S

60、J1OOO_Read(RXBODLC,1) 。 data_num=SPIdata2 。/ SendByte(data_num) 。if(RXB_type=OxO|RXB_type=OxO2)/ 報 文 數(shù) 據(jù) 存 儲 在SPIdata1SPIdata1+data_num 中SJ1000_RD_Buffer(1,data_num)。/從 RXBOD 開始讀取數(shù)據(jù)elseRTR_BIT=1 。if(RXB_num=0 x02) /收到報文在 RXB 仲SJ1000_Read(RXB1DLC,1) 。 data_num=SPIdata2 。else/發(fā)送遠程幀if(RXB_type=0 x0|RXB_type=0 x02)SPIdata1SPIdata1+data

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論