2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  機(jī)電工程學(xué)院</b></p><p><b>  畢業(yè)設(shè)計(jì)說明書</b></p><p>  設(shè)計(jì)題目: CAN總線通信接口及程序設(shè)計(jì) </p><p>  2012 年 5 月 21 日</p&g

2、t;<p><b>  目 次</b></p><p>  1 CAN總線介紹</p><p>  1.1 CAN總線的發(fā)展背景</p><p>  隨著汽車產(chǎn)業(yè)的發(fā)展,需要一種更利于信息數(shù)據(jù)傳輸交換的通信協(xié)議。汽車中的各種電子控制系統(tǒng)需要較高的技術(shù)支持,而隨著汽車的發(fā)展,汽車是否安全、是否便利、成本是否低、是否舒適都已成

3、為人們首要考慮的事情。但是傳統(tǒng)的汽車控制技術(shù)已不足以滿足人們?cè)絹碓礁叩囊?,也已不適以汽車的發(fā)展方向。20世紀(jì)80年代,德國(guó)Bosch公司著手研究用于汽車產(chǎn)業(yè)的新的通信協(xié)議及控制方法,并首先提出了CAN總線控制系統(tǒng)。這一嶄新的網(wǎng)絡(luò)協(xié)議使得汽車產(chǎn)業(yè)得到了飛速的發(fā)展。</p><p>  CAN總線最明顯的特點(diǎn)是最大程度地減少了汽車控制系統(tǒng)中的線束的數(shù)量及長(zhǎng)度,另外還大大提高了系統(tǒng)控制的可靠性和穩(wěn)定性。在沒有CAN總

4、線協(xié)議之前,一輛汽車中用于各種控制通信的線束的總長(zhǎng)度達(dá)3公里之長(zhǎng),嚴(yán)重影響了汽車的通信速度和通信精度。并且還使汽車的整體結(jié)構(gòu)繁冗復(fù)雜,可靠性低,成本高,難以維護(hù)。因此CAN總線的出現(xiàn)無疑具有重大的意義和作用。作為一種新的網(wǎng)絡(luò)通信協(xié)議,CAN總線不僅減少了汽車中線束的長(zhǎng)度,還提高了汽車的整體性能,極大的促進(jìn)了汽車產(chǎn)業(yè)的發(fā)展。</p><p>  CAN總線剛被提出的時(shí)候,僅僅應(yīng)用于汽車產(chǎn)業(yè)上,但CAN總線通信協(xié)議的

5、性能和可靠性經(jīng)過多年的檢驗(yàn),已被應(yīng)用于越來越多的產(chǎn)業(yè),比如航空、船舶、機(jī)床等產(chǎn)業(yè)設(shè)備方面。僅僅二十多年的發(fā)展,CAN總線便已成為自動(dòng)化領(lǐng)域技術(shù)的潮流。</p><p>  CAN總線是串行通信網(wǎng)絡(luò)。傳統(tǒng)運(yùn)用的是基于R線構(gòu)建分布式控制系統(tǒng),這種傳統(tǒng)的控制系統(tǒng)是基于通信節(jié)點(diǎn)的地址編碼的,因此其結(jié)構(gòu)復(fù)雜,直接導(dǎo)致系統(tǒng)的通信效率不高,并且控制的可靠性能低。CAN總線通過每個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)通信,每個(gè)節(jié)點(diǎn)可以互相收發(fā)數(shù)據(jù),

6、CAN總線協(xié)議對(duì)通信數(shù)據(jù)編碼,不對(duì)節(jié)點(diǎn)地址編碼,使各個(gè)節(jié)點(diǎn)可以同時(shí)接收到相同的數(shù)據(jù),大大增強(qiáng)了數(shù)據(jù)通信的實(shí)時(shí)控制及傳輸性能。另一方面CAN總線使用起來非常方便。CAN總線的結(jié)構(gòu)十分簡(jiǎn)單,僅有2根線(CANH和CANL)和外部設(shè)備相連,但CAN總線的內(nèi)部卻有非常復(fù)雜和智能的通信模塊,可以方便快捷準(zhǔn)確無誤的進(jìn)行數(shù)據(jù)的自由通信。</p><p>  1.2 CAN總線的通信層介紹</p><p&g

7、t;  CAN總線是串行通信協(xié)議,可以實(shí)現(xiàn)各個(gè)節(jié)點(diǎn)在數(shù)據(jù)傳輸時(shí)的自由通信及互不影響,因此CAN總線應(yīng)具有標(biāo)準(zhǔn)的通信協(xié)議,這樣可以使CAN總線更加方便的應(yīng)用于控制系統(tǒng)中。為了實(shí)現(xiàn)這樣的設(shè)計(jì)理念,根據(jù)ISO/OSI參考模型,CAN總線包含ISO/OSI參考模型中的數(shù)據(jù)鏈路層(Data Link Layer)和物理層(Physical Layer)。</p><p><b> ?。?)數(shù)據(jù)鏈路層</b&

8、gt;</p><p>  數(shù)據(jù)鏈路層連接硬件和軟件的結(jié)合層,主要作用是通過各種數(shù)據(jù)協(xié)議而實(shí)現(xiàn)數(shù)據(jù)的傳輸。CAN總線中的數(shù)據(jù)鏈路層又可以分為兩個(gè)子層:邏輯鏈路控制子層(LLC)和介質(zhì)方向控制子層(MAC)。邏輯鏈路控制子層是數(shù)據(jù)鏈路層的核心層,它為遠(yuǎn)程數(shù)據(jù)的傳輸提供服務(wù),控制數(shù)據(jù)的邏輯傳輸。</p><p><b> ?。ǎ玻┪锢韺?lt;/b></p>&l

9、t;p>  物理層是OSI參考模型中的最底層,主要作用是規(guī)定節(jié)點(diǎn)電氣方面的特征。為了實(shí)現(xiàn)數(shù)據(jù)的自由收發(fā),在同一網(wǎng)絡(luò)中的物理層應(yīng)該是處處一樣的。</p><p>  1.3 CAN總線報(bào)文幀格式</p><p>  CAN總線上的數(shù)據(jù)信息都是以報(bào)文的形式發(fā)送的。報(bào)文的格式并不唯一,而是有幾種不同的格式,但是報(bào)文的長(zhǎng)度卻受到電氣及內(nèi)部控制的限制。CAN總線的報(bào)文傳輸也就是幀的傳輸,幀是

10、CAN總線傳送數(shù)據(jù)單位。幀也有不同的格式,主要區(qū)別在于標(biāo)識(shí)符長(zhǎng)度不同。在CAN2.0A協(xié)議下幀具有11位標(biāo)識(shí)符,叫作標(biāo)準(zhǔn)幀;而在最新的CAN2.0B協(xié)議下具有29位標(biāo)識(shí)符的幀叫作擴(kuò)展幀。</p><p>  為了實(shí)現(xiàn)數(shù)據(jù)的傳輸和控制,CAN總線報(bào)文傳輸具有4種不同類型的幀結(jié)構(gòu):數(shù)據(jù)幀、遠(yuǎn)程幀、錯(cuò)誤幀、過載幀。其中數(shù)據(jù)幀的結(jié)構(gòu)圖如圖1-1所示。</p><p>  詳細(xì)的CAN總線報(bào)文幀結(jié)構(gòu)

11、可以參閱參考資料[6].</p><p>  1.4 CAN總線的優(yōu)勢(shì)</p><p>  CAN總線已經(jīng)成為現(xiàn)在控制領(lǐng)域最流行的控制方案,只所以從CAN總線誕生以來僅僅二十年間便已成為公認(rèn)的最好的工業(yè)生產(chǎn)控制方案,是因?yàn)镃AN總線相比其他控制總線在通信能力和速度方面具有明顯的優(yōu)勢(shì)。雖然現(xiàn)在還有很多基于R線組建的工業(yè)控制系統(tǒng),但它不具備CAN總線的諸多優(yōu)點(diǎn)。相比于其他的控制系統(tǒng),CAN的

12、優(yōu)勢(shì)在于:(1)CAN總線是多主工作方式,CAN總線舍棄了傳統(tǒng)控制系統(tǒng)中站地址編碼方法,而是對(duì)通信的數(shù)據(jù)進(jìn)行編碼,也就是說,CAN總線的節(jié)點(diǎn)是根據(jù)傳輸數(shù)據(jù)信息確定是否接收數(shù)據(jù)。這樣可以簡(jiǎn)化控制系統(tǒng)。從面增強(qiáng)了CAN總線網(wǎng)絡(luò)的數(shù)據(jù)通信能力,也提高了系統(tǒng)的可靠性。(2)CAN總線的多個(gè)節(jié)點(diǎn)同時(shí)向總線上發(fā)送數(shù)據(jù)時(shí),不會(huì)致使總線出現(xiàn)短路現(xiàn)象。因?yàn)镃AN總線是通過CAN收發(fā)器芯片的兩個(gè)輸出端CANH和CANL和物理總線連在一起的,但CANH端只能

13、是高電平或者懸空狀態(tài),CANL只能是低電平或者懸空狀態(tài)。這樣就使CAN節(jié)點(diǎn)同時(shí)向總線發(fā)送數(shù)據(jù)時(shí),不會(huì)短路。另外,CAN總線還有節(jié)點(diǎn)出現(xiàn)嚴(yán)重錯(cuò)誤時(shí)自動(dòng)關(guān)閉節(jié)點(diǎn)功能,以免其他節(jié)點(diǎn)受到影響。</p><p>  2 CAN總線通信芯片簡(jiǎn)述</p><p>  2.1 CAN總線控制器SJA1000簡(jiǎn)介</p><p>  CAN總線只有OSI參考模式中的數(shù)據(jù)鏈路層和物

14、理層,但要實(shí)現(xiàn)這兩層的功能,必須制定相應(yīng)的協(xié)議和控制規(guī)則。通過CAN總線控制器可以實(shí)現(xiàn)對(duì)CAN總線的控制及數(shù)據(jù)通信。CAN總線控制器是一塊可編程的芯片,它與微處理器相接。通過對(duì)CAN總線控制器的編程,實(shí)現(xiàn)數(shù)據(jù)的通信?,F(xiàn)在有許多類型的CAN控制器芯片,但工業(yè)上的控制系統(tǒng)最常用的還是SJA1000 CAN控制器,下面簡(jiǎn)要介紹SJA1000 CAN控制器。</p><p>  SJA1000是Philips半導(dǎo)體公司研

15、發(fā)的一種新型的CAN控制器,也是該公司PCA82C200 CAN控制器的替代產(chǎn)品。SJA1000中還加入了一種新的操作模式,PeliCAN模式,相比于此前的BasicCAN模式,這種模式支持最新的CAN2.0B協(xié)議。為了使SJA1000兼容于PCA82C200芯片,SJA1000和PCA82C200相兼容,即SJA1000 CAN控制器既有BasicCAN模式也有PeliCAN模式。</p><p>  SJA1

16、000的基本特性有:擴(kuò)展的64字節(jié)接收緩沖器、同時(shí)支持CAN2.0A和CAN2.0B協(xié)議、同時(shí)支持11位和29位標(biāo)識(shí)碼、通信速率可以達(dá)到1Mbps。另外,PeliCAN模式下還有一些新的功能,如擴(kuò)展到8個(gè)字節(jié)的驗(yàn)收濾波器、自檢測(cè)等功能。</p><p>  對(duì)于SJA1000工作在BasicCAN模式還是工作在PeliCAN模式,即工作方式的選擇是由時(shí)鐘分頻寄存器(CDR)中的CAN模式位控制的。通電默認(rèn)的工作方

17、式是BAsicCAN模式。</p><p>  驗(yàn)收濾波器(Acceptance Filter)是SJA1000中的核心寄存器,利用它,可以接收到預(yù)定中的數(shù)據(jù)。驗(yàn)收濾波器又分為驗(yàn)收代碼寄存器(ACR)和驗(yàn)收屏蔽寄存器(AMR)。SJA1000中有4個(gè)ACR(ACR0、ACR1、ACR2、ACR3)和4個(gè)AMR(AMR0、AMR1、AMR2、AMR3)。標(biāo)識(shí)符也由原來的11位擴(kuò)展到29位,而濾波方式也有兩種,單濾波

18、模式和雙濾波模式(由模式寄存器中的AFM位決定)。需要接收的報(bào)文的標(biāo)識(shí)符存于驗(yàn)收代碼寄存器中,相應(yīng)的屏蔽位存放在驗(yàn)收屏蔽寄存器中。只有在發(fā)送的報(bào)文的標(biāo)識(shí)符與節(jié)點(diǎn)的標(biāo)識(shí)符和AMR的相應(yīng)位一致的情況下,節(jié)點(diǎn)才會(huì)接收?qǐng)?bào)文。下面主要介紹雙濾波模式下擴(kuò)展幀格式的驗(yàn)收濾波器的設(shè)置。</p><p>  雙濾波模式,顧名思義,就是有兩個(gè)濾波器,濾波器1由ACR0、ACR1和AMR0、AMR1組成;濾波器2由ACR2、ACR3和

19、AMR2、AMR3組成。接收?qǐng)?bào)文時(shí)報(bào)文中的標(biāo)識(shí)符信息要與兩個(gè)濾波器中的值比較,但并不是兩個(gè)濾波器都必須通過才接收?qǐng)?bào)文,而是只要有一個(gè)濾波器通過驗(yàn)收就可以接收?qǐng)?bào)文了。</p><p>  2.3 PCA82C250 CAN收發(fā)器介紹</p><p>  CAN總線收發(fā)器是CAN控制器與物理總線之間的接口器件,它對(duì)總線提供差動(dòng)發(fā)送和接收數(shù)據(jù)功能。CAN總線收發(fā)器也決定著系統(tǒng)的安全性、可靠性和

20、兼容性的優(yōu)劣。PCA82C250具有許多優(yōu)越的性能。在本次設(shè)計(jì)中PCA82C250僅僅用到了短路保護(hù)功能。</p><p>  PCA82C250通過對(duì)引腳Rs的不同接法可以得到3種不同的工作模式:高速模式、斜率控制模式和待機(jī)模式。高速模式時(shí)VRs<0.3Vcc,VRs與地之間接1個(gè)0-1.8KΩ的電阻可以使PCA82C250工作在高速模式;斜率控制模式時(shí)與地之間接1個(gè)16.5KΩ-140KΩ的電阻;待機(jī)模

21、式時(shí)Rs保持高電平,VRs要大于0.75Vcc。</p><p>  3 CAN總線的通信設(shè)計(jì)及方案</p><p>  3.1 CAN總線通信的技術(shù)要求及目標(biāo)</p><p>  本次設(shè)計(jì)主要是利用51單片機(jī)和CAN芯片SJA1000實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的相互通信。SJA1000是CAN控制器,主要用于一般的區(qū)域網(wǎng)絡(luò)控制。51單片機(jī)與SJA1000相連,SJA1000內(nèi)

22、的數(shù)據(jù)存儲(chǔ)地址相當(dāng)于51單片機(jī)的片外存儲(chǔ)器,利用51單片機(jī)的片外尋址,對(duì)SJA1000內(nèi)的各個(gè)寄存器進(jìn)行讀寫,進(jìn)而控制SJA1000實(shí)現(xiàn)CAN總線的點(diǎn)對(duì)點(diǎn)的通信。另外,還需要接入CAN收發(fā)器82C250來實(shí)現(xiàn)CAN總線的發(fā)送和接收功能。</p><p>  本次設(shè)計(jì)的目標(biāo)是將51單片機(jī)、CAN控制器SJA1000和CAN收發(fā)器82C250連在一起,編寫程序,實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信的收發(fā)。</p><p

23、>  3.2 CAN總線通信接口方案</p><p>  CAN總線的硬件電路的節(jié)口非常簡(jiǎn)單,只需要微處理器和CAN控制器及CAN收發(fā)器便可構(gòu)成。CAN總線通信接口通常情況下有2種實(shí)現(xiàn)方式:一種是由微處理器、獨(dú)立的CAN控制器和CAN收發(fā)器組成的硬件電路;另一種是集成CAN控制器的單片機(jī)和CAN收發(fā)器構(gòu)成的硬件電路。CAN總線在經(jīng)過二十多年的發(fā)展,已經(jīng)產(chǎn)生了許多類型的CAN總線協(xié)議的芯片,其中有獨(dú)立的CA

24、N控制器芯片,也有集成CAN控制器的微處理器芯片。獨(dú)立的CAN控制器有Philips公司的PCA82C200、SJA1000,Intel公司的82526、82527等。集成CAN控制器的微處理器也有很多,比如Philips公司的P8XC592/598等。常用的CAN收發(fā)器有Philips公司的PCA82C250等。</p><p>  方案1:由51單片機(jī)、SJA1000 CAN控制器和PCA82C250 CAN

25、收發(fā)器組成的CAN通信節(jié)點(diǎn)</p><p>  采用AT89C51、SJA1000 CAN控制器和 PCA82C250 CAN收發(fā)器設(shè)計(jì)CAN通信節(jié)點(diǎn)。這種方案的設(shè)計(jì)思路很簡(jiǎn)單,控制過程也比較方便。通過AT89C51單片機(jī)編程控制SJA1000的初始化及收發(fā)數(shù)據(jù)。SJA1000負(fù)責(zé)CAN總線上的數(shù)據(jù)的處理,PCA82C250收發(fā)器負(fù)責(zé)傳遞數(shù)據(jù)。</p><p>  方案2:由P8xC591

26、芯片控制的CAN節(jié)點(diǎn)通信</p><p>  Philips公司的P8xC591是集成CAN控制器的單片機(jī),這個(gè)方案中的節(jié)點(diǎn)只需要P8xC591和82C250 CAN收發(fā)器,CAN控制器內(nèi)置于P8xC591芯片中。雖然CAN控制器內(nèi)置于P8xC591中,但P8xC591還保留SJA1000的一切功能,甚至比SJA1000的功能更加強(qiáng)大,這種方案還大大簡(jiǎn)化了硬件系統(tǒng)電路。</p><p> 

27、 方案比較:方案2中,集成CAN控制器的單片機(jī)P8xC591因?yàn)槠鋬?nèi)部已經(jīng)內(nèi)置了CAN控制器,所以不需要再進(jìn)行電路設(shè)計(jì),這樣難以深入理解CAN總線的原理。P8xC591芯片是一種高性能通信芯片,價(jià)格比較高。在一般的系統(tǒng)控制中,實(shí)現(xiàn)簡(jiǎn)單的控制就可滿足需要,常采用單片機(jī)和獨(dú)立的CAN控制器作為CAN節(jié)點(diǎn)進(jìn)行通信,這樣成本低,也可以更好的了解CAN總線的通信協(xié)議。另外,市場(chǎng)上有大量的單片機(jī),使用獨(dú)立的CAN控制器SJA1000可以根據(jù)控制要求

28、選擇適用的單片機(jī),從而更好的達(dá)到控制要求。因此,本設(shè)計(jì)采用方案1。</p><p>  3.3 CAN通信節(jié)點(diǎn)硬件電路設(shè)計(jì)</p><p>  節(jié)點(diǎn)是網(wǎng)絡(luò)上信息的接收和發(fā)送站。我們平常所用的節(jié)點(diǎn)都是由微處理器、CAN控制器和CAN收發(fā)器組成的。本設(shè)計(jì)中的硬件電路原理圖如圖3-1所示。</p><p>  由圖3-1可以看出,電路主要由AT89C51單片機(jī)、SJA1

29、000 CAN控制器、PCA82C250 CAN收發(fā)器組成。由AT89C51控制SJA1000,實(shí)現(xiàn)SJA1000的初始化、接收和發(fā)送數(shù)據(jù)。SJA1000的AD0~AD7分別接到AT89C51的P0口,CS接到AT89C51的P2.0。當(dāng)CS為低電平時(shí)(P2.0為0),CPU的片外存儲(chǔ)器地址可選中SJA1000,這樣CPU就可以通過這些地址對(duì)SJA1000相應(yīng)的寄存器進(jìn)行讀/寫操作。SJA1000的WR、RD、ALE分別與AT89C51

30、的對(duì)應(yīng)引腳相連接,INT接AT89C51的INT0引腳。</p><p>  對(duì)于一些較長(zhǎng)距離通信的場(chǎng)合,要保證通信的可靠性和準(zhǔn)確性,一般不直接將SJA1000的TX0和RX0和82C250的TXD和RXD相接。而是通過高速光耦6N137后再與82C250相接。這樣的好處是大大增強(qiáng)了CAN總線節(jié)點(diǎn)的抗干擾能力。但在本次設(shè)計(jì)中并沒有采用6N137進(jìn)行電氣隔離,而是直接將SJA1000與82C250相接,因?yàn)楸敬卧O(shè)計(jì)

31、不是遠(yuǎn)距離輸送數(shù)據(jù),相應(yīng)的節(jié)點(diǎn)的抗干擾能力都可以滿足設(shè)計(jì)要求,所以不需要再接入6N137,這樣可以在滿足控制要求的情況下簡(jiǎn)化系統(tǒng)的設(shè)計(jì)。</p><p>  對(duì)于82C250與CAN總線的接口也要進(jìn)行一些必要的防護(hù)措施。82C250的CANH和CANL引腳是通過一個(gè)5Ω的電阻與CAN總線相接的,這個(gè)5Ω的電阻可以起到一定的限流作用,從而保護(hù)82C250免以受到過大電流。</p><p> 

32、 4 CAN總線通信的軟件設(shè)計(jì)</p><p>  CAN總線節(jié)點(diǎn)的軟件設(shè)計(jì)一般包括三部分,即SJA1000的初始化、報(bào)文發(fā)送和報(bào)文接收。這三部分是保證CAN總線通信的基礎(chǔ),總程序見附錄1。下面章節(jié)將對(duì)這三部分的通信設(shè)計(jì)進(jìn)行詳細(xì)的說明。</p><p>  4.1 SJA1000的初始化過程</p><p>  SJA1000的初始化只能在復(fù)位模式下進(jìn)行。初始化

33、過程主要是對(duì)一些寄存器設(shè)定初值,其中包括SJA1000工作方式的設(shè)置、AF的設(shè)置、波特率的設(shè)置和中斷允許寄存器的設(shè)置。在CAN總線通信中,只有先進(jìn)行SJA1000的初始化才能保證CAN總線通信的順利進(jìn)行。完成SJA1000的初始化后,SJA1000還要返回到工作模式,然后開始進(jìn)行通信。</p><p>  4.2 SJA1000的發(fā)送子程序</p><p>  SJA1000初始化之后,

34、就可以進(jìn)行通信的收發(fā)程序設(shè)計(jì)了。發(fā)送子程序控制節(jié)點(diǎn)報(bào)文的發(fā)送。將要發(fā)送的報(bào)文放在發(fā)送緩存區(qū),然后通過中斷程序判斷是否向總線發(fā)送數(shù)據(jù)。但是在將報(bào)文送入SJA1000的發(fā)送緩存區(qū)之前,先要對(duì)一些寄存器進(jìn)行判斷,然后才能開啟發(fā)送。本次設(shè)計(jì)中當(dāng)SJA1000接收到報(bào)文后,應(yīng)將接收到的報(bào)文放于發(fā)送緩存區(qū)中,然后再將此報(bào)文發(fā)送出去并在相應(yīng)的界面上收到這組報(bào)文。</p><p>  4.3 SJA1000的接收子程序<

35、/p><p>  接收子程序負(fù)責(zé)節(jié)點(diǎn)報(bào)文的接收。在處理接收?qǐng)?bào)文的同時(shí),會(huì)出現(xiàn)各種情況。要根據(jù)狀態(tài)寄存器(SR)和命令寄存器(CMR)進(jìn)行讀寫操作,然后判斷需要接收的數(shù)據(jù),完成接收過程。本次設(shè)計(jì)中從串口工具界面上輸入一組數(shù)據(jù),然后發(fā)送到總線上,經(jīng)過驗(yàn)收濾波器驗(yàn)收過濾之后,在相應(yīng)的節(jié)點(diǎn)上接收到這組數(shù)據(jù),并存入接收緩沖區(qū)。</p><p><b>  設(shè)計(jì)總結(jié)</b></

36、p><p>  在設(shè)計(jì)之前,我沒有聽說過CAN總線通信協(xié)議。自從看到CAN總線通信設(shè)計(jì)這個(gè)設(shè)計(jì)后,經(jīng)過多方查閱相關(guān)資料和文獻(xiàn),我初步了解了CAN總線通信的有關(guān)協(xié)議和通信原理。CAN總線的通信是借助單片機(jī)對(duì)CAN控制器進(jìn)行相應(yīng)的編程,以此實(shí)現(xiàn)數(shù)據(jù)的通信。通常情況下,CAN總線通信可以達(dá)到很高的通信速率,滿足大多數(shù)工業(yè)控制的要求,特別是雖著CAN控制器的發(fā)展,以及CAN通信協(xié)議的標(biāo)準(zhǔn)化,使CAN總線越來越多地運(yùn)用于各行各

37、業(yè)的控制系統(tǒng)中。</p><p>  本次設(shè)計(jì)用AT89C51微處理器、SJA1000 CAN控制器、PCA82C250 CAN收發(fā)器組成CAN通信節(jié)點(diǎn)來進(jìn)行CAN通信節(jié)點(diǎn)數(shù)據(jù)的收發(fā)。經(jīng)過仔細(xì)編程和調(diào)試,終于實(shí)現(xiàn)了CAN節(jié)點(diǎn)之間數(shù)據(jù)的收發(fā)通信。但本次設(shè)計(jì)也有不足之處,我所設(shè)計(jì)的硬件電路圖是極其簡(jiǎn)單的系統(tǒng),其中沒有包含抗干擾能力措施和防護(hù)措施,只能進(jìn)行短距離的數(shù)據(jù)通信,若進(jìn)行長(zhǎng)距離的數(shù)據(jù)通信,可能受到各種電磁信號(hào)的

38、干擾和輻射。若要進(jìn)行長(zhǎng)距離的通信,在本次設(shè)計(jì)的基礎(chǔ)上還需要增加一些防護(hù)措施,比如在CANH和CANL與地之間各接一個(gè)小電容,可以有效的防止電磁輻射。</p><p>  總之,通過本次設(shè)計(jì)我還是學(xué)到了很多新的知識(shí)。以前根本沒有接觸過CAN總線,現(xiàn)在我已經(jīng)能夠看懂簡(jiǎn)單的CAN總線通信程序和進(jìn)行一些簡(jiǎn)單的CAN通信設(shè)計(jì)。</p><p>  另外我還要感謝張老師在本次畢業(yè)設(shè)計(jì)中對(duì)我的指點(diǎn)和幫助

39、,同時(shí)也要感謝同學(xué)們對(duì)我的幫助。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 倪志蓮.單片機(jī)應(yīng)用技術(shù)(第2版).北京理工大學(xué)出版社.2011.</p><p>  [2] 鄔寬明.CAN總線原理和應(yīng)用系統(tǒng)設(shè)計(jì)北京:北京航空航天大學(xué)出版社,1996.</p><p>  [3] 鄔寬明.現(xiàn)場(chǎng)總

40、線技術(shù)應(yīng)用選編2[M].北京:北京航空航天大學(xué)出版社,2004.</p><p>  [4] 李正軍.現(xiàn)場(chǎng)總線及其應(yīng)用技術(shù)[M].北京:機(jī)械工業(yè)出版社,2005. </p><p>  [5] 張培人,王洪波.獨(dú)立CAN總線控制器SJA1000.國(guó)外電子元器件,2001.</p><p>  [6] 鄒繼軍.現(xiàn)場(chǎng)總線CAN原理與應(yīng)用技術(shù).北京:北京航空航天大學(xué)出版社

41、,2007.</p><p>  [7] 陽憲惠.現(xiàn)場(chǎng)總線技術(shù)及其應(yīng)用[M]. 北京:清華大學(xué)出版社,1999.</p><p>  [8] 萬福君,潘松峰.單片微機(jī)原理系統(tǒng)設(shè)計(jì)與應(yīng)用.中國(guó)科學(xué)技術(shù)大學(xué)出版社,2001.</p><p>  [9] 馮博琴,吳寧.微型計(jì)算機(jī)原理及應(yīng)用.清華大學(xué)出版社.2011.</p><p><b&g

42、t;  附錄1(源程序)</b></p><p><b>  硬件連接</b></p><p>  AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7</p><p>  P10 P11 P12 P13 P14 P15 P16 P17</p><p>  C

43、SCCAN P32</p><p>  INTCAN INT1 P33</p><p><b>  RS P00</b></p><p>  RSTCAN P34</p><p><b>  ALE P07</b></p><p><b>  WR P

44、36</b></p><p><b>  RD P37</b></p><p>  #include <STC89C51.h></p><p>  #include <stdio.h></p><p>  #include <intrins.h></p>&

45、lt;p>  #include <uart.h></p><p>  #include <can1.h></p><p>  void main()</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  WD

46、T_CONTR= 0x00; //關(guān)閉看門狗</p><p>  P2 = 0x21; //關(guān)顯示R 接收</p><p>  UartInital();</p><p>  delayms(200);</p><p>  TestCan();</p><p><b> ?。?lt;/b

47、></p><p>  void TestCan();</p><p>  sbit CANCSC = P3^2;</p><p>  sbit RSTCAN =P3^4; //=1 reset</p><p>  sbit CANALE = P0^7;</p><p>  sbit CANWR = P3^

48、6;</p><p>  sbit CANRD = P3^7;</p><p>  #define REG_CAN_CDR 31</p><p>  #define REG_CAN_MOD 0</p><p>  #define REG_CAN_BTR0 6</p><p>  #define REG_CAN_BTR1

49、 7</p><p>  #define REG_CAN_OCR 8</p><p>  #define REG_CAN_IER 4</p><p>  #define REG_CAN_CMR 1</p><p>  #define REG_CAN_SR 2</p><p>  #define REG_CAN_IR

50、3</p><p>  #define RBSR 16</p><p>  #define RBSR1 17</p><p>  #define RBSR2 18</p><p>  #define RBSR3 19</p><p>  #define RBSR4 20</p>&

51、lt;p>  #define RBSR5 21</p><p>  #define RBSR6 22</p><p>  #define RBSR7 23</p><p>  #define RBSR8 24</p><p>  #define RBSR9 25</p><p>  

52、#define RBSR10 26</p><p>  #define RBSR11 27</p><p>  #define RBSR12 28</p><p>  #define ALC 11 //11 // 仲裁丟失捕捉寄存器</p><p>  #define ECC 12 //12

53、 // 誤碼捕捉寄存器</p><p>  typedef struct CANPeremeter</p><p><b>  {</b></p><p>  unsigned char CanAddr;</p><p><b>  };</b></p><p>  st

54、ruct CANPeremeter CANPeremeter1;</p><p>  unsigned char RXD_flag =0;</p><p>  unsigned char Read_SJA1000(unsigned char Addr)</p><p><b>  {</b></p><p>  unsi

55、gned char Buf;</p><p>  CANALE = 0;</p><p>  CANWR = 1;</p><p>  CANCSC = 1;</p><p>  CANRD = 1;</p><p>  CANALE = 1;</p><p>  P1 = Addr;</

56、p><p>  CANALE =0;</p><p>  CANCSC =0;</p><p>  CANRD = 0;</p><p>  P1 = 0xff;</p><p><b>  Buf = P1;</b></p><p>  CANRD = 1;</p>

57、;<p>  CANCSC =1;</p><p>  CANALE = 0;</p><p>  return(Buf);</p><p><b>  }</b></p><p>  void Write_SJA1000(unsigned char Addr,unsigned char Data)<

58、/p><p><b>  {</b></p><p>  CANALE = 0;</p><p>  CANWR = 1;</p><p>  CANCSC = 1;</p><p>  CANRD = 1;</p><p>  CANALE =1;</p>&l

59、t;p>  P1 = Addr;</p><p>  CANALE = 0; //地址鎖存</p><p>  CANCSC =0; //片選</p><p>  CANWR = 0; //寫選通</p><p>  P1 = Data; //數(shù)據(jù)</p><p>  CANWR = 1

60、; //</p><p>  CANCSC =1;</p><p>  CANALE = 0;</p><p><b>  }</b></p><p>  void delayus(unsigned int t);</p><p>  void IO_Init()</p>&l

61、t;p><b>  {</b></p><p>  P0 = 0XFF;</p><p><b>  P1 =0XFF;</b></p><p><b>  P3 =0XFF;</b></p><p>  P4 = 0XFF;</p><p>  

62、P0M0 = 0X00;</p><p>  P0M1 = 0X00;</p><p>  P1M0 = 0X00;</p><p>  P1M1 = 0X00;</p><p>  P3M0 = 0X00;</p><p>  P3M1 = 0X00;</p><p><b>  E

63、X1 = 1;</b></p><p>  IT1 = 0;//CAN總線接收中斷</p><p>  //IT0 = 1;//外部中斷0負(fù)邊沿觸發(fā)</p><p>  //EX0 = 1;//打開外部中斷0</p><p>  EA = 1; //打開總中斷</p><p><b>  }<

64、;/b></p><p>  unsigned char RX_buffer[15];</p><p>  void CAN_RXD( void ) interrupt 2</p><p>  {//接收數(shù)據(jù)函數(shù),在中斷服務(wù)程序中調(diào)用</p><p>  unsigned char Buf;</p><p>  

65、EA = 0;//關(guān)CPU中斷</p><p><b>  IE1 = 0;</b></p><p>  Buf=Read_SJA1000(REG_CAN_IR);</p><p>  if( Buf & 0x01)</p><p>  {//IR.0 = 1 接收中斷</p><p>&

66、lt;b>  LED = 0;</b></p><p>  RX_buffer[0] = Read_SJA1000(RBSR);</p><p>  RX_buffer[1] = Read_SJA1000(RBSR1);</p><p>  RX_buffer[2] = Read_SJA1000(RBSR2);</p><p&g

67、t;  RX_buffer[3] = Read_SJA1000(RBSR3);</p><p>  RX_buffer[4] = Read_SJA1000(RBSR4);</p><p>  RX_buffer[5] = Read_SJA1000(RBSR5);</p><p>  RX_buffer[6] = Read_SJA1000(RBSR6);</p&

68、gt;<p>  RX_buffer[7] = Read_SJA1000(RBSR7);</p><p>  RX_buffer[8] = Read_SJA1000(RBSR8);</p><p>  RX_buffer[9] = Read_SJA1000(RBSR9);</p><p>  RX_buffer[10] = Read_SJA1000(R

69、BSR10);</p><p>  RX_buffer[11] = Read_SJA1000(RBSR11);</p><p>  RX_buffer[12] = Read_SJA1000(RBSR12);</p><p>  RXD_flag = 1;//置有接收標(biāo)志</p><p>  Write_SJA1000(REG_CAN_CMR,

70、0x04);</p><p>  Buf = Read_SJA1000(ALC);//釋放仲裁隨時(shí)捕捉寄存器</p><p>  Buf = Read_SJA1000(ECC);//釋放錯(cuò)誤代碼捕捉寄存器</p><p><b>  }</b></p><p>  Write_SJA1000(REG_CAN_IER,0x

71、01);// .0=1--接收中斷使能;</p><p>  EA = 1;//打開CPU中斷</p><p><b>  }</b></p><p>  void delayus(unsigned int t)</p><p><b>  {</b></p><p>  u

72、nsigned int i,j;</p><p>  for(i=0;i<t;i++)</p><p>  for(j=0;j<10;j++)</p><p><b>  {;}</b></p><p><b>  }</b></p><p>  void SJA

73、100HardWareRest()</p><p><b>  {</b></p><p>  RSTCAN = 0;</p><p>  delayus(100);</p><p>  RSTCAN = 1; //reset</p><p>  delayus(100);</p>

74、<p>  RSTCAN = 0;</p><p>  delayus(100);</p><p><b>  }</b></p><p>  void SJAEntryResetMode()</p><p><b>  {</b></p><p>  unsi

75、gned char Judge;</p><p>  Judge = Read_SJA1000(REG_CAN_MOD);</p><p>  Judge = Judge|0x01;</p><p><b>  do</b></p><p><b>  {</b></p><p&

76、gt;  Write_SJA1000(REG_CAN_MOD,Judge);</p><p>  }while((Read_SJA1000(REG_CAN_MOD)&0x01)==0);</p><p><b>  }</b></p><p>  void SJAQuitResetMode()</p><p>&

77、lt;b>  {</b></p><p>  unsigned char Judge;</p><p>  Judge = Read_SJA1000(REG_CAN_MOD);</p><p>  Judge = Judge&0xfe;</p><p><b>  do</b></p>

78、;<p><b>  {</b></p><p>  Write_SJA1000(REG_CAN_MOD,Judge);</p><p>  //Write_SJA1000(REG_CAN_MOD,0x00); 千萬不要這樣賦值,否則出錯(cuò)</p><p>  }while((Read_SJA1000(REG_CAN_MOD)&

79、amp;0x01)==1);</p><p><b>  }</b></p><p>  #define uchar unsigned char</p><p>  void WriteSJARegBlock(unsigned char addr,unsigned char *Pbuf,unsigned char len)</p>

80、<p><b>  {</b></p><p><b>  uchar i;</b></p><p>  for(i=0;i<len;i++)</p><p><b>  {</b></p><p>  Write_SJA1000(addr+i,*Pbuf);

81、</p><p><b>  Pbuf++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  unsigned char Send_CAN_Filter[8]={0x00,0x00,0x00,0x00,0x00,0x0

82、0,0x00,0x00}; </p><p>  unsigned char Send_CAN_Info_ID[5]={0x88,0x00,0x00,0x00,0x00}; //88: 擴(kuò)展貞 8個(gè)數(shù)據(jù) </p><p>  unsigned char Send_CAN_Data[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

83、</p><p>  uchar BTR0,BTR1;</p><p>  SJA1000_Config_Normal()</p><p><b>  {</b></p><p>  uchar RegBuf;</p><p>  BTR0=0x00;</p><p>  

84、BTR1=0x1b; //設(shè)置為1M波特率通信 f=400k</p><p>  SJAEntryResetMode(); //進(jìn)入復(fù)位模式</p><p>  Write_SJA1000(REG_CAN_CDR,0xc0); //配置時(shí)鐘分頻寄存器,選擇PeliCAN模式 f/10</p><p>  RegBuf =

85、 Read_SJA1000(REG_CAN_MOD);</p><p>  RegBuf = RegBuf&0xf3;</p><p>  Write_SJA1000(REG_CAN_MOD,RegBuf); //配置模式寄存器,選擇雙濾波</p><p>  WriteSJARegBlock(16,Send_CAN_Filter,8); //配置驗(yàn)收代碼

86、/屏蔽寄存器</p><p>  Write_SJA1000(REG_CAN_BTR0,BTR0); //配置總線定時(shí)器0x00</p><p>  Write_SJA1000(REG_CAN_BTR1,BTR1); //配置總線定時(shí)器0x14</p><p>  Write_SJA1000(REG_CAN_OCR,0xaa);</p><

87、;p>  SJAQuitResetMode(); //退出復(fù)位模式,進(jìn)入工作模式</p><p><b>  }</b></p><p>  void TestCan()</p><p>  { uchar canstatus,canstatus1;</p><p>  uchar cansta

88、tus2,canstatus3,canstatus4;</p><p>  IO_Init();</p><p>  SJA100HardWareRest();</p><p>  SJA1000_Config_Normal(); //SJA1000進(jìn)入正常模式配置</p><p>  Write_SJA1000(REG_CAN_IER,

89、0x01); //使能SJA1000接收中斷位</p><p>  WriteSJARegBlock(16,Send_CAN_Info_ID,5); //擴(kuò)展幀,向發(fā)送緩沖區(qū)寫入5個(gè)數(shù)據(jù)</p><p>  WriteSJARegBlock(21,Send_CAN_Data,8);//擴(kuò)展幀,向發(fā)送緩沖區(qū)寫入8個(gè)數(shù)據(jù)</p><p><b>  

90、while(1)</b></p><p><b>  {</b></p><p>  if(RXD_flag==1)</p><p>  { Send_CAN_Data[0] = RX_buffer[5];</p><p>  Send_CAN_Data[1] = RX_buffer[6];</p&g

91、t;<p>  Send_CAN_Data[2] = RX_buffer[7];</p><p>  Send_CAN_Data[3] = RX_buffer[8];</p><p>  Send_CAN_Data[4] = RX_buffer[9];</p><p>  Send_CAN_Data[5] = RX_buffer[10];</p&

92、gt;<p>  Send_CAN_Data[6] = RX_buffer[11];</p><p>  Send_CAN_Data[7] = RX_buffer[12];</p><p><b>  EA =0;</b></p><p>  WriteSJARegBlock(21,Send_CAN_Data,8);//擴(kuò)展幀,向

93、發(fā)送緩沖區(qū)寫入8個(gè)數(shù)據(jù)</p><p>  canstatus = Read_SJA1000(REG_CAN_SR);</p><p>  canstatus1 = Read_SJA1000(REG_CAN_MOD);</p><p>  canstatus2 = Read_SJA1000(15); //TX錯(cuò)誤計(jì)數(shù)</p><p>

94、  canstatus3 = Read_SJA1000(14); //RX錯(cuò)誤計(jì)數(shù)</p><p>  canstatus4 = Read_SJA1000(12); //錯(cuò)誤代碼捕捉</p><p>  if((canstatus&0x0c)==0x0c) //判斷是否可以發(fā)送</p><p>  Write_SJA1000(REG_CAN_

95、CMR,0x01);//使能發(fā)送請(qǐng)求,發(fā)送數(shù)據(jù) 對(duì)發(fā)</p><p>  while((canstatus&0x08) ==0)</p><p>  {canstatus = Read_SJA1000(REG_CAN_SR);}</p><p><b>  }</b></p><p><b>  EA

96、=1;</b></p><p>  RXD_flag =0;</p><p>  UartSendbytes(RX_buffer,13);</p><p>  delayms(50);</p><p><b>  LED =1;</b></p><p><b>  }<

溫馨提示

  • 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. 眾賞文庫(kù)僅提供信息存儲(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)論