基于CAN總線數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于CAN總線數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于CAN總線數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于CAN總線數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于CAN總線數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、CAN總線通信實(shí)驗(yàn)內(nèi)容提要:以CAN (Controller Area Network) 總線控制器SJA1000為核心, 設(shè)計(jì)了一種通用的基于CAN總線的數(shù)據(jù)采集系統(tǒng), 給出了數(shù)據(jù)采集系統(tǒng)的原理、單個(gè)節(jié)點(diǎn)的軟硬件設(shè)計(jì); 重點(diǎn)闡述了CAN 總線智能節(jié)點(diǎn)的設(shè)計(jì)、實(shí)現(xiàn)與注意事項(xiàng)。 試驗(yàn)表明, CAN 總線的多主結(jié)構(gòu)使系統(tǒng)改型靈活, 數(shù)據(jù)傳輸穩(wěn)定, 可靠性好, 數(shù)據(jù)傳輸速率可達(dá)1Mbit/s, 能滿足現(xiàn)場的實(shí)時(shí)性要求。CAN 總線的使用大大節(jié)約了連接導(dǎo)線、維護(hù)和安裝費(fèi)用, 提高了系統(tǒng)的性價(jià)比, 具有廣泛的應(yīng)用前景。關(guān)鍵詞:數(shù)據(jù)采集 CAN 總線 現(xiàn)場總線 芯片SJA 1000 目 錄一、引言1二、

2、CAN總線1(一)CAN總線介紹1(二)CAN協(xié)議1三、結(jié)構(gòu)設(shè)計(jì)4四、硬件設(shè)計(jì)5五、軟件設(shè)計(jì)6(一)初始化子程序7(二)發(fā)送子程序8(三)查詢方式接收子程序10六、測試報(bào)告12附錄15參考文獻(xiàn)36一、引言 信息技術(shù)的飛速發(fā)展,引起了自動(dòng)化系統(tǒng)結(jié)構(gòu)的變革, 形成以網(wǎng)絡(luò)集成自動(dòng)化為基礎(chǔ)的控制系統(tǒng)?,F(xiàn)場總線順應(yīng)這一形式發(fā)展, 已成為當(dāng)前工業(yè)數(shù)據(jù)總線領(lǐng)域中一個(gè)新熱點(diǎn), 被廣泛應(yīng)用于工業(yè)現(xiàn)場控制、智能家居、交通工具、環(huán)境監(jiān)測等眾多領(lǐng)域。 用數(shù)據(jù)采集系統(tǒng)能實(shí)現(xiàn)數(shù)據(jù)采集與處理, 加入高級(jí)算法即可實(shí)現(xiàn)智能控制, 因而減輕了上位機(jī)的負(fù)擔(dān)。本設(shè)計(jì)設(shè)計(jì)了一個(gè)通用的基于CAN 總線的數(shù)據(jù)采集卡, 著重闡述了它的設(shè)計(jì)及

3、其實(shí)現(xiàn)。二、 CAN總線(一)CAN總線介紹CAN 總線 (Cont roller Area Network 控制器局域網(wǎng))是現(xiàn)場總線的一種。 它是德國Bosch 公司在1986 年為解決現(xiàn)代汽車中眾多的控制與測試儀器之間的數(shù)據(jù)交換而開發(fā)的一種串行數(shù)據(jù)通訊總線。CAN 總線與其它通信網(wǎng)的不同之處有二:一是報(bào)文傳送中不包含目標(biāo)地址 ,它是以全網(wǎng)廣播為基礎(chǔ) ,各接收站根據(jù)報(bào)文中反映數(shù)據(jù)性質(zhì)的標(biāo)識(shí)符過濾報(bào)文 ,該收的收下 ,不該收的棄而不用。其好處是可在線上網(wǎng)下網(wǎng)、 即插即用和多站接收;二是特別強(qiáng)化了對(duì)數(shù)據(jù)安全性的關(guān)注 , 滿足控制系統(tǒng)及其它較高數(shù)據(jù)要求的系統(tǒng)需求。CAN 總線具有下列主要特性:l

4、多主站依據(jù)優(yōu)先權(quán)進(jìn)行總線訪問;l 非破壞性的基于優(yōu)先權(quán)的總線仲裁;l 借助接收濾波的多地址幀傳送;l 遠(yuǎn)程數(shù)據(jù)請(qǐng)求;l 配置靈活;l 全系統(tǒng)的數(shù)據(jù)相容性;l 錯(cuò)誤檢測和出錯(cuò)信令;l 發(fā)送期間若丟失仲裁或由于出錯(cuò)而遭破壞的幀可自動(dòng)重發(fā)送;l 暫時(shí)錯(cuò)誤和永久性故障節(jié)點(diǎn)的判別以及故障節(jié)點(diǎn)的自動(dòng)脫離 CAN 總線。(二)CAN協(xié)議數(shù)據(jù)傳輸?shù)耐ㄐ艆f(xié)議是指對(duì)數(shù)據(jù)傳輸?shù)募s定 ,包括定時(shí) 、控制 、格式化和數(shù)據(jù)表示方法等等 。CAN是一串行通訊協(xié)議 CAN總線規(guī)范規(guī)定了任意兩個(gè)節(jié)點(diǎn)之間的兼容性 ,包括電氣特性及數(shù)據(jù)解釋協(xié)議 ,為保證設(shè)計(jì)使用的透明性及使用的靈活性 ,CAN協(xié)議分為如下幾層:目標(biāo)層 、傳送層 、

5、物理層 。目標(biāo)層的功能范圍包括:信息識(shí)別、信息狀態(tài)及處理。傳送層的功能范圍包括: 幀組織、總線仲裁、檢錯(cuò)、錯(cuò)誤報(bào)告、錯(cuò)誤處理。物理層的功能范圍包括: 實(shí)際位傳送過程上的電氣特性??偩€控制器支持4種不同結(jié)構(gòu)的CAN協(xié)議幀類型:數(shù)據(jù)幀用于節(jié)點(diǎn)之間的數(shù)據(jù)傳輸遠(yuǎn)程幀:用于請(qǐng)求發(fā)送具有相同標(biāo)識(shí)符的數(shù)據(jù)幀出錯(cuò)幀:用于指示檢測到的錯(cuò)誤狀態(tài)過載幀:用于提供先前和后續(xù)數(shù)據(jù)幀或遠(yuǎn)程幀之間的附加延時(shí)數(shù)據(jù)幀、遠(yuǎn)程幀、出錯(cuò)幀、過載幀都按一定的格式進(jìn)行編碼數(shù)據(jù)幀:由7個(gè)不同的位場構(gòu)成 ,如圖 1所示。它們是:幀起始 、仲裁場、控制場、CRC場 、ACK場和幀結(jié)束;遠(yuǎn)程幀:由6個(gè)不同的位場構(gòu)成:幀起始 、仲裁場、控制場、C

6、RC場 、ACK場、幀結(jié)束出錯(cuò)幀:由兩個(gè)不同的場構(gòu)成。第一個(gè)場由來自不同節(jié)點(diǎn)的錯(cuò)誤標(biāo)志疊加給出,后隨的第二個(gè)場為錯(cuò)誤定界符超載幀:包括兩個(gè)位場、超載標(biāo)志和超載界定符。數(shù)據(jù)幀和遠(yuǎn)程幀以幀間空間同先前幀隔開,幀編碼和發(fā)送/接收。圖1 數(shù)據(jù)幀的構(gòu)成幀起始、仲裁場、控制場、數(shù)據(jù)場、序列幀段均以位填充方法進(jìn)行編碼 ,即在以送位流中檢測到5個(gè)數(shù)值相同的時(shí)候 ,自動(dòng)插人一個(gè)補(bǔ)碼位。數(shù)據(jù)幀或遠(yuǎn)程幀的其余位場、錯(cuò)誤幀、超載幀為固定格式 ,不使用位填充方法編碼,幀中的位流按照非歸零方法編碼。發(fā)送時(shí)從其SOF場開始逐個(gè)位場發(fā)送。對(duì)于發(fā)送器和接收器 ,一幀的有效點(diǎn)是不同的。對(duì)于發(fā)送器 ,若在幀結(jié)束完成前不存在錯(cuò)誤 ,

7、則該幀有效。對(duì)于接收器 ,若在幀結(jié)束最后一位前不存在錯(cuò)誤 ,則該幀有效??偩€訪問和仲裁:當(dāng)檢測到間歇場未被 “顯性”位中斷后 ,認(rèn)為總線被所有節(jié)點(diǎn)釋放??偩€被釋放后 , “錯(cuò)誤一激活”節(jié)點(diǎn)可以訪問總線。當(dāng)許多節(jié)點(diǎn)一起開始發(fā)送時(shí) ,只有發(fā)送具有最高優(yōu)先權(quán)的幀節(jié)點(diǎn)變?yōu)榭偩€主機(jī) ,享有對(duì)總線的控制權(quán)。這種解決總線訪問沖突的機(jī)理是基于競爭的促裁 ,依據(jù)標(biāo)識(shí)符和緊隨其后的RTR位來完成。錯(cuò)誤檢測:在CAN中存在5類不同的錯(cuò)誤位錯(cuò)誤、填充錯(cuò)誤、CRC錯(cuò)誤、形式錯(cuò)誤、應(yīng)答錯(cuò)誤、在網(wǎng)絡(luò)中的任何一個(gè)節(jié)點(diǎn) ,根據(jù)其錯(cuò)誤計(jì)數(shù)器的數(shù)值,可能處于下列3種狀態(tài)之一:“錯(cuò)誤一激活”節(jié)點(diǎn):一個(gè)“錯(cuò)誤一激活”節(jié)點(diǎn)可以正常參與總

8、線通信,并在檢測到錯(cuò)誤時(shí) ,發(fā)出一個(gè)激活錯(cuò)誤標(biāo)志?!板e(cuò)誤一認(rèn)可”節(jié)點(diǎn):一個(gè)“錯(cuò)誤一認(rèn)可”節(jié)點(diǎn)不應(yīng)發(fā)送激活錯(cuò)誤標(biāo)志 ,它參與總線通信,但在檢測到錯(cuò)誤時(shí),發(fā)出一個(gè)認(rèn)可錯(cuò)誤標(biāo)志?!翱偩€脫離”節(jié)點(diǎn):當(dāng)一個(gè)節(jié)點(diǎn)由于請(qǐng)求故障界定實(shí)體而對(duì)總線處于關(guān)閉狀態(tài)時(shí) ,其處于“總線脫離”狀態(tài),在“總線脫離”狀態(tài)。為了進(jìn)行錯(cuò)誤界定 ,在總線上的每一個(gè)單元中都設(shè)有兩種計(jì)數(shù)器:發(fā)送出錯(cuò)計(jì)數(shù)器和接收出錯(cuò)計(jì)數(shù)器 ,錯(cuò)誤計(jì)數(shù)器的值按照一定的規(guī)則進(jìn)行修正。當(dāng)節(jié)點(diǎn)的發(fā)送計(jì)數(shù)器或接收計(jì)數(shù)器的值超過127時(shí) ,則監(jiān)控器要求置相應(yīng)節(jié)點(diǎn)為“錯(cuò)誤一認(rèn)可”狀態(tài) ,送出一個(gè)激活標(biāo)志。當(dāng)發(fā)送計(jì)數(shù)器或接收計(jì)數(shù)器的值均小于或等于127時(shí) , “錯(cuò)誤一認(rèn)

9、可”節(jié)點(diǎn)再次變?yōu)?“錯(cuò)誤一激活” 。當(dāng)節(jié)點(diǎn)的發(fā)送計(jì)數(shù)器的值超過255時(shí) ,則監(jiān)控器要求置相應(yīng)節(jié)點(diǎn)為“脫離總線”狀態(tài)。處于“脫離總線”狀態(tài)的節(jié)點(diǎn) ,在監(jiān)測到總線上出現(xiàn)128次11個(gè)連續(xù)的“隱性”位 ,變?yōu)閮蓚€(gè)錯(cuò)誤計(jì)數(shù)器均為0的“錯(cuò)誤一激活”節(jié)點(diǎn)。三、結(jié)構(gòu)設(shè)計(jì)數(shù)據(jù)采集系統(tǒng)由數(shù)據(jù)采集模塊和數(shù)據(jù)傳輸模塊組成, 其中數(shù)據(jù)傳輸通過CAN (Controller Area Network) 總線來實(shí)現(xiàn)。 控制器局域網(wǎng)CAN 屬于現(xiàn)場總線范疇, 它是一種有效支持分布式控制或?qū)崟r(shí)控制的串行通信網(wǎng)絡(luò)。系統(tǒng)采用總線式網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu), 其系統(tǒng)總體結(jié)構(gòu)如圖2所示。圖2 系統(tǒng)總體結(jié)構(gòu)選用CAN 總線連接各節(jié)點(diǎn), 形成多主控

10、制器的局域網(wǎng)。 CAN 總線符合 ISO11898標(biāo)準(zhǔn), 最多可掛接110個(gè)節(jié)點(diǎn), 采用CAN 總線特有的多主傳送方式, 各采集控制器根據(jù)現(xiàn)場需要, 當(dāng)有數(shù)據(jù)時(shí)可自主發(fā)送, 無需主機(jī)不停地輪巡, 節(jié)省了網(wǎng)絡(luò)上的數(shù)據(jù)流量, 提高了傳輸效率。 CAN 總線傳輸介質(zhì)為雙絞線或同軸電纜, 走線少、系統(tǒng)易擴(kuò)展、改型靈活, 正是由于這些其他通信方式無法比擬的優(yōu)點(diǎn), 才使之成為系統(tǒng)分布比較分散的數(shù)據(jù)采集系統(tǒng)的理想總線。數(shù)據(jù)采集系統(tǒng)將由現(xiàn)場傳感器送來的數(shù)據(jù)發(fā)送到空閑的CAN 總線上, 而總線上各節(jié)點(diǎn)通過預(yù)先設(shè)置好的驗(yàn)收碼和驗(yàn)收屏蔽碼, 來決定是否使用這個(gè)消息。 如果采集的數(shù)據(jù)需要進(jìn)一步進(jìn)行處理, 則上位機(jī)可從

11、總線上接收數(shù)據(jù)并對(duì)其處理。 處理后的數(shù)據(jù)再送回CAN 總線, 經(jīng)數(shù)模轉(zhuǎn)換模塊或其他節(jié)點(diǎn)進(jìn)行控制操作。 當(dāng)上位機(jī)需對(duì)某個(gè)節(jié)點(diǎn)施以控制時(shí), 可采用點(diǎn)對(duì)點(diǎn)的方式與該節(jié)點(diǎn)進(jìn)行通訊; 而當(dāng)它需要對(duì)所有節(jié)點(diǎn)加以控制時(shí), 則采用廣播方式將命令發(fā)送到總線。 這樣大大減少了數(shù)據(jù)的傳輸量, 從而提高了系統(tǒng)的傳輸速率, 同時(shí)又保證了系統(tǒng)的實(shí)時(shí)性和可靠性。 下面以數(shù)據(jù)采集系統(tǒng)中的數(shù)據(jù)采集節(jié)點(diǎn)為例來說明單個(gè)節(jié)點(diǎn)的設(shè)計(jì)思想。四、硬件設(shè)計(jì)數(shù)據(jù)采集系統(tǒng)單個(gè)節(jié)點(diǎn)硬件框圖如圖3所示, 由傳感器檢測的信息經(jīng)多路開關(guān)送到可編程放大器PGA 204, 根據(jù)信號(hào)大小調(diào)節(jié)放大倍數(shù)(1, 10, 100, 1 000倍) , 放大后, 經(jīng)A

12、D574轉(zhuǎn)換為數(shù)字信號(hào), 送入微處理器中存儲(chǔ), 然后根據(jù)現(xiàn)場情況的需要, 將信號(hào)發(fā)送到CAN 總線上, 被其他節(jié)點(diǎn)或上位機(jī)接收。圖3 節(jié)點(diǎn)硬件框圖由于以AD574為A/D 轉(zhuǎn)換器的數(shù)據(jù)采集卡比較普及, 故下面重點(diǎn)闡述數(shù)據(jù)傳輸部分, 即CAN 總線智能節(jié)點(diǎn)的設(shè)計(jì)與實(shí)現(xiàn)。 CAN 總線上的節(jié)點(diǎn)是網(wǎng)絡(luò)上的信息接收和發(fā)送站, 由于節(jié)點(diǎn)主要由單片機(jī)和可編程的CAN 通信控制器組成, 能通過編程設(shè)置工作方式、ID 地址、波特率等參數(shù), 故稱其為智能節(jié)點(diǎn)。CAN節(jié)點(diǎn)原理圖如圖4所示。89C51是節(jié)點(diǎn)的微處理器, 作為一個(gè)存儲(chǔ)器 I/O 映象設(shè)備, 負(fù)責(zé)對(duì)控制器SJA 1000初始化, 并控制其實(shí)現(xiàn)數(shù)據(jù)的收發(fā)

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

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

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

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

17、存貯器地址 這些符號(hào)可在程序的頭部用偽指令EQU進(jìn)行定義。后文對(duì)這一點(diǎn)不再作特別說明。CANINI: MOV DPTR, #MOD ;方式寄存器 MOV A, #09H ;進(jìn)入復(fù)位模式 對(duì) SJA1000 進(jìn)行初始化. MOVX DPTR, A MOV DPTR, #CDR ;時(shí)鐘分頻寄存器 MOV A , #88H ;選擇 PeliCAN 模式 關(guān)閉時(shí)鐘輸出 CLKOUTMOVX DPTR, A MOV DPTR, #IER ;中斷允許寄存器 MOV A ,#0DH ;開放發(fā)送中斷 超載中斷和錯(cuò)誤警告中斷 MOVX DPTR, A MOV DPTR ,#AMR ;接收屏蔽寄存器 MOV R6

18、,#4 MOV R0 ,#DAMR ;接收屏蔽寄存器內(nèi)容在片內(nèi) RAM 中的首址 AMR: MOV A R0 MOVX DPTR, A ;接收屏蔽寄存器賦初值 INC DPTR DJNZ R6 ,AMR MOV DPTR ,#ACR ;接收代碼寄存器 MOV R6 ,#4 MOV R0, #DACR ;接收代碼寄存器內(nèi)容在片內(nèi) RAM 中的首址 ACR:MOV A, R0 MOVX DPTR, A ;接收代碼寄存器賦初值 INC DPTR DJNZ R6 ,ACR MOV DPTR, #BTR0 ;總線定時(shí)寄存器 0 MOV A, #03H MOVX DPTR, A MOV DPTR, #BT

19、R1 ;總線定時(shí)寄存器 1 MOV A ,#0FFH ;16MHz 晶振情況下 設(shè)置波特率為 80kbps. MOVX DPTR, A MOV DPTR, #OCR ;輸出控制寄存器 MOV A ,#0AAH MOVX DPTR,A MOV DPTR, #RBSA ;接收緩存器起始地址寄存器 MOV A, #0 ;設(shè)置接收緩存器 FIFO 起始地址為 0 MOVX DPTR, A MOV DPTR, #TXERR ;發(fā)送錯(cuò)誤計(jì)數(shù)寄存器. MOV A ,#0 ;清除發(fā)送錯(cuò)誤計(jì)數(shù)寄存器 MOVX DPTR, A MOV DPTR ,#ECC ;錯(cuò)誤代碼捕捉寄存器 MOVX A ,DPTR ;清除錯(cuò)

20、誤代碼捕捉寄存器 MOV DPTR, #MODE ;方式寄存器 MOV A ,#08H ;設(shè)置單濾波接收方式 并返回工作狀態(tài) MOVX DPTR ,A RET (二)發(fā)送子程序發(fā)送子程序負(fù)責(zé)節(jié)點(diǎn)報(bào)文的發(fā)送,發(fā)送時(shí)用戶只需將待發(fā)送的數(shù)據(jù)按特定格式組合成一幀報(bào)文送入SJA1000 發(fā)送緩存區(qū)中,然后啟動(dòng)SJA1000發(fā)送即可。當(dāng)然在往 SJA1000 發(fā)送緩存區(qū)送報(bào)文之前必須先作一些判斷。如下文程序所示,發(fā)送程序分發(fā)送遠(yuǎn)程幀和數(shù)據(jù)幀兩種:遠(yuǎn)程幀無數(shù)據(jù)場。下面以發(fā)送數(shù)據(jù)幀為例對(duì)發(fā)送子程序作一個(gè)說明 。TDATA:MOV DPTR, #SR ;狀態(tài)寄存器 MOVX A,DPTR ;從 SJA1000

21、讀入狀態(tài)寄存器值 JB ACC.4,TDATA ;判斷是否正在接收 正在接收則等待 TS0: MOVX A, DPTR JNB ACC.3 ,TS0 ;判斷上次發(fā)送是否完成 未完成則等待發(fā)送完成 TS1: MOVX A,DPTR JNB ACC.2 ,TS1 ;判斷發(fā)送緩沖區(qū)是否鎖定 鎖定則等待 TS2: MOV DPTR, #CANTXB ;SJA1000 發(fā)送緩存區(qū)首址 MOV A , #88H ;發(fā)送數(shù)據(jù)長度為 8 個(gè)字節(jié)的擴(kuò)展幀格式報(bào)文 MOVX DPTR, A INC DPTR MOV A , #ID0 ;4 個(gè)字節(jié)的標(biāo)識(shí)符 ID0-ID3 MOVXDPTR, A INC DPTR

22、MOV A, #ID1 MOVX DPTR, A INC DPTR MOV A , #ID2 MOVX DPTR, A INC DPTR MOV A, #ID3 MOVX DPTR,A MOV R0 ,#TRDATA ;CPU 發(fā)送數(shù)據(jù)區(qū)首址 MTBF:MOV A, R0 INC DPTR MOVX DPTR, A INC R0 CJNE R0, #TRDATA+8 MTBF ;向發(fā)送緩沖區(qū)寫 8 個(gè)字節(jié) MOV DPTR, #CMR ;命令寄存器地址 MOV A , #01H MOVX DPTR ,A ;啟動(dòng) SJA1000 發(fā)送 RET(三)查詢方式接收子程序接收子程序負(fù)責(zé)節(jié)點(diǎn)報(bào)文的接收以

23、及其它情況處理,接收子程序比發(fā)送子程序要復(fù)雜一些。因?yàn)樵谔幚斫邮請(qǐng)?bào)文的過程中,同時(shí)要對(duì)諸如總線脫離、錯(cuò)誤報(bào)警、接收溢出等情況進(jìn)行處理SJA1000報(bào)文的接收主要有兩種方式:中斷接收方式和查詢接收方式。如果對(duì)通信的實(shí)時(shí)性要求不是很強(qiáng),建議采用查詢接收方式。兩種接收方式編程的思路基本相同,下面僅以查詢方式接收?qǐng)?bào)文為例對(duì)接收子程序作一個(gè)說明。SEARCH: MOV DPTR, #SR ;狀態(tài)寄存器地址 MOVX A ,DPTR ANL A ,#0C3H ;讀取總線脫離 錯(cuò)誤狀態(tài) 接收溢出 JNZ PROC RET ;無上述狀態(tài) 結(jié)束 PROC:JNB ACC.7 ,PROCI BUSERR:MOV

24、DPTR, #IR ;IR 中斷寄存器 出現(xiàn)總線脫離 MOVX A , DPTR ;讀中斷寄存器 清除中斷位. MOV DPTR, #MODE ;方式寄存器地址 MOV A, #08H MOVX DPTR, A ;將方式寄存器復(fù)位請(qǐng)求位清 0 LCALL ALARM. ;調(diào)用報(bào)警子程序 RET NOP PROCI: MOV DPTR, #IR ;總線正常 MOVX A, DPTR ;讀取中斷位 NB ACC.3, OTHER OVER: MOV DPTR, #CMR ;數(shù)據(jù)溢出中斷置位. MOV A, #0CH MOVX DPTR, A ;在命令寄存器中清除數(shù)據(jù)溢出 RET NOP OTHER

25、:JB ACC.0 ,RECE ;IR.0=1 接收 FIFO 未滿或接收 LJMP RECOUT ;IR.0=0接收緩沖區(qū)無數(shù)據(jù)退出接收 NOP RECE: MOV DPTR, #CANRXB ;接收緩沖區(qū)首地址 16 準(zhǔn)備讀取數(shù) MOVX A, DPTR ;首字節(jié)是接收幀格式字 JNB ACC.6 ,RDATA ;RTR=1 是遠(yuǎn)程請(qǐng)求幀 無數(shù)據(jù) MOV DPTR, #CMR MOV A , #04H ;CMR.2=1 釋放接收緩沖區(qū) MOVX DPTR ,A ;只有接收了數(shù)據(jù)才能釋放接收緩沖區(qū) LCALL TDATA ;發(fā)送對(duì)方請(qǐng)求的數(shù)據(jù) LJMP RECOUT ;退出接收 NOP RD

26、ATA: MOV DPTR, #CANRXB ;讀取并保存接收緩沖區(qū)的數(shù)據(jù) MOV R1, #CPURBF ;CPU 片內(nèi)接收緩沖區(qū)首址 MOVX A, DPTR ;讀取讀取 CAN 緩沖區(qū)的 2 號(hào)字節(jié) MOV R1, A ;保存 ANL A, #0FH ;截取低 4 位是數(shù)據(jù)長度 08 ADD A, #4 ;加 4 個(gè)字節(jié)的標(biāo)識(shí)符 ID MOV R6, A RDATA: INC DPTR INC R1 MOVX A, DPTR MOV R1 ,A DJNZ R6,RDATA0 ;循環(huán)讀取與保存 MOV DPTR, #CMR MOV A, #04H ;釋放 CAN 接收緩沖區(qū) MOVX DP

27、TR ,A RECOUT: MOV DPTR, #ALC MOVX A, DPTR MOV DPTR, #ECC MOVX A, DPTR NOP RET需要注意的是: SJA 1000的初始化只有在復(fù)位模式下才可以進(jìn)行。 在對(duì)SJA 1000寄存器設(shè)定前, 主控制器通過讀復(fù)位模式ö 請(qǐng)求標(biāo)志來檢查SJA 1000是否已達(dá)到復(fù)位模式。 在復(fù)位模式下, 主控制器必須配置SJA 1000控制段的寄存器。 時(shí)鐘輸出控制寄存器 (OCR) 的內(nèi)容決定CAN 控制器的輸出方式。 驗(yàn)收代碼(ACR) 和驗(yàn)收屏蔽(AMR) 寄存器根據(jù)實(shí)際網(wǎng)絡(luò)系統(tǒng)和報(bào)文標(biāo)志符來確定, 須引起注意的是: ACR位 (

28、AC172 AC10) 和信息識(shí)別碼的高8位 ( ID1102ID13) 相等, 且與AMR 位 (AM 172 AM 10) 的相應(yīng)位相或?yàn)?, 即: ( ID1102ID13) (AC172 AC10) (AM 172 AM 10) 1111 1111滿足上述條件的報(bào)文才予以接收 3 。 BTR0、 BTR1寄存器的內(nèi)容可唯一地確定系統(tǒng)的通信波特率和同步跳轉(zhuǎn)寬度, 所以整個(gè)系統(tǒng)中的所有節(jié)點(diǎn), 這兩個(gè)寄存器的內(nèi)容必須相同 (包括上位機(jī)) , 否則將無法進(jìn)行通信。六、測試報(bào)告實(shí)驗(yàn)達(dá)到了預(yù)定結(jié)果,可以將各個(gè)分布點(diǎn)的測量數(shù)據(jù)準(zhǔn)確發(fā)送到指定CAN節(jié)點(diǎn)。CAN總線最高速度達(dá)到1M。實(shí)驗(yàn)用電路板如圖4所

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

30、我的關(guān)懷和幫助也將令我終生難忘。在此,謹(jǐn)向汪老師表示衷心的感謝。感謝我的父母,是他們無私的愛的支持和鼓勵(lì)使我順利完成學(xué)業(yè)!感謝同組的同學(xué)對(duì)我的幫助和支持!此外,我還要感謝在我的論文中所有被援引過的文獻(xiàn)的作者,他們是我的知識(shí)之源!最后,再次向所有曾經(jīng)給予我?guī)椭凸膭?lì)的老師和同學(xué)致以最誠摯的謝意!附錄(一)源程序:#include "reg51.h"#define uchar unsigned char#define uint unsigned intsbit PB=P27;sbit LAMP=P26;uchar RTR_BIT=0;uchar INT_FLAG=0;uchar

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

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

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

34、TE 0x2b#define CANINTF 0x2c#define EFLG 0x2d/高4地址:0011#define TXB0CTRL 0x30 #define TXB0SIDH 0x31#define TXB0SIDL 0x32#define TXB0EID8 0x33#define TXB0EID0 0x34#define TXB0DLC 0x35 #define TXB0D0 0x36#define TXB0D1 0x37#define TXB0D2 0x38#define TXB0D3 0x39#define TXB0D4 0x3a #define TXB0D5 0x3b#def

35、ine TXB0D6 0x3c#define TXB0D7 0x3d/高4地址:0100#define TXB1CTRL 0x40 #define TXB1SIDH 0x41#define TXB1SIDL 0x42#define TXB1EID8 0x43#define TXB1EID0 0x44#define TXB1DLC 0x45 #define TXB1D0 0x46#define TXB1D1 0x47#define TXB1D2 0x48#define TXB1D3 0x49#define TXB1D4 0x4a #define TXB1D5 0x4b#define TXB1D6

36、 0x4c#define TXB1D7 0x4d/高4地址:0101#define TXB2CTRL 0x50 #define TXB2SIDH 0x51#define TXB2SIDL 0x52#define TXB2EID8 0x53#define TXB2EID0 0x54#define TXB2DLC 0x55 #define TXB2D0 0x56#define TXB2D1 0x57#define TXB2D2 0x58#define TXB2D3 0x59#define TXB2D4 0x5a #define TXB2D5 0x5b#define TXB2D6 0x5c#defi

37、ne TXB2D7 0x5d/高4地址:0110#define RXB0CTRL 0x60 #define RXB0SIDH 0x61#define RXB0SIDL 0x62#define RXB0EID8 0x63#define RXB0EID0 0x64#define RXB0DLC 0x65 #define RXB0D0 0x66#define RXB0D1 0x67#define RXB0D2 0x68#define RXB0D3 0x69#define RXB0D4 0x6a #define RXB0D5 0x6b#define RXB0D6 0x6c#define RXB0D7

38、0x6d/高4地址:0111#define RXB1CTRL 0x70 #define RXB1SIDH 0x71#define RXB1SIDL 0x72#define RXB1EID8 0x73#define RXB1EID0 0x74#define RXB1DLC 0x75 #define RXB1D0 0x76#define RXB1D1 0x77#define RXB1D2 0x78#define RXB1D3 0x79#define RXB1D4 0x7a #define RXB1D5 0x7b#define RXB1D6 0x7c#define RXB1D7 0x7d/*/SPI

39、指令集#define CMD_RESET 0xC0 #define CMD_READ 0x03#define CMD_RD_RXBUF 0x90#define CMD_WRITE 0x02#define CMD_WR_TXBUF 0x40#define CMD_RTS 0x80#define CMD_RD_STATUS 0xa0#define CMD_RX_STATUS 0xb0#define CMD_BIT_M 0x05/SPI控制寄存器SPCTL#define SPI_CLK_4 0x0#define SPI_CLK_16 0x01#define SPI_CLK_64 0x02#defin

40、e SPI_CLK_128 0x03#define SPI_CPHA 0x04#define SPI_CPOL 0x08#define SPI_MSTR 0x10#define SPI_DORD 0x20#define SPI_SPEN 0x40#define SPI_SSIG 0x80/SPI狀態(tài)寄存器SPSTAT#define SPI_SPIF 0x80#define SPI_WCOL 0x40/sbit SS=P14;uchar SPIdata16;uchar uart_data;uchar Status;void SendByte(uchar temp) ES=0;TI=0;SBUF=

41、temp;while(!TI);TI=0;ES=1;Uart_int() interrupt 4 if(RI=1) RI=0; uart_data=SBUF; SendByte(uart_data);else TI=0; void Uart_Init() TMOD=0x20;TL1=0xfd;TH1=0xfd;SCON=0x50;AUXR&=0xbf; ET1=0;TR1=1;EA=1; void delay(uchar n) uchar i;for(i=0;i<n;i+);void SPI_Initial()/CPU時(shí)鐘64分頻,SPI 1,1模式,SPI主機(jī)模式,MSB傳輸,

42、SPI使能,SS引腳忽略,用于I/O輸出 SPCTL=SPI_CLK_64|SPI_CPHA|SPI_CPOL|SPI_MSTR|SPI_SPEN|SPI_SSIG; /配置SS引腳,推挽輸出,初始化高電平 P1M0|=0<<4; P1M1|=1<<4; SS=1; /SPI中斷禁止,使用軟件查詢方式 EADC_SPI=0;AUXR&=!(1<<3);/參數(shù)1:數(shù)組指針,指向待傳輸?shù)臄?shù)組首/參數(shù)2:傳送字節(jié)數(shù)/功能完成SPI連續(xù)寫操作void SPI_Write(uchar a,uchar n) uchar i=0; SS=0; SPSTAT|=SP

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

44、dr,uchar n) SPIdata0=CMD_READ;SPIdata1=addr; SPI_Write(SPIdata,n+2);#define AddrFunc_RXB0SIDH 0x0#define AddrFunc_RXB0D0 0x1#define AddrFunc_RXB1SIDH 0x2#define AddrFunc_RXB1D0 0x3/參數(shù)1:讀RX緩沖器4功能地址之一/參數(shù)2:連續(xù)讀寫寄存器的個(gè)數(shù)/SJ1000讀緩沖器操作/讀取的內(nèi)容存儲(chǔ)在SPIdata1SPIdata16中,存儲(chǔ)字節(jié)由n決定void SJ1000_RD_Buffer(uchar addr,uchar n) SPIdata0=CMD_RD_RXBUF+(addr<<1);SPI_Write(SP

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論