版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 機(jī)電工程學(xué)院</b></p><p><b> 畢業(yè)設(shè)計說明書</b></p><p> 設(shè)計題目: CAN總線通信接口及程序設(shè)計 </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ù)已不足以滿足人們越來越高的要求,也已不適以汽車的發(fā)展方向。20世紀(jì)80年代,德國Bosch公司著手研究用于汽車產(chǎn)業(yè)的新的通信協(xié)議及控制方法,并首先提出了CAN總線控制系統(tǒng)。這一嶄新的網(wǎng)絡(luò)協(xié)議使得汽車產(chǎn)業(yè)得到了飛速的發(fā)展。</p><p> CAN總線最明顯的特點是最大程度地減少了汽車控制系統(tǒng)中的線束的數(shù)量及長度,另外還大大提高了系統(tǒng)控制的可靠性和穩(wěn)定性。在沒有CAN總
4、線協(xié)議之前,一輛汽車中用于各種控制通信的線束的總長度達(dá)3公里之長,嚴(yán)重影響了汽車的通信速度和通信精度。并且還使汽車的整體結(jié)構(gòu)繁冗復(fù)雜,可靠性低,成本高,難以維護(hù)。因此CAN總線的出現(xiàn)無疑具有重大的意義和作用。作為一種新的網(wǎng)絡(luò)通信協(xié)議,CAN總線不僅減少了汽車中線束的長度,還提高了汽車的整體性能,極大的促進(jìn)了汽車產(chǎn)業(yè)的發(fā)展。</p><p> CAN總線剛被提出的時候,僅僅應(yīng)用于汽車產(chǎn)業(yè)上,但CAN總線通信協(xié)議的
5、性能和可靠性經(jīng)過多年的檢驗,已被應(yīng)用于越來越多的產(chǎn)業(yè),比如航空、船舶、機(jī)床等產(chǎn)業(yè)設(shè)備方面。僅僅二十多年的發(fā)展,CAN總線便已成為自動化領(lǐng)域技術(shù)的潮流。</p><p> CAN總線是串行通信網(wǎng)絡(luò)。傳統(tǒng)運用的是基于R線構(gòu)建分布式控制系統(tǒng),這種傳統(tǒng)的控制系統(tǒng)是基于通信節(jié)點的地址編碼的,因此其結(jié)構(gòu)復(fù)雜,直接導(dǎo)致系統(tǒng)的通信效率不高,并且控制的可靠性能低。CAN總線通過每個網(wǎng)絡(luò)節(jié)點進(jìn)行數(shù)據(jù)通信,每個節(jié)點可以互相收發(fā)數(shù)據(jù),
6、CAN總線協(xié)議對通信數(shù)據(jù)編碼,不對節(jié)點地址編碼,使各個節(jié)點可以同時接收到相同的數(shù)據(jù),大大增強(qiáng)了數(shù)據(jù)通信的實時控制及傳輸性能。另一方面CAN總線使用起來非常方便。CAN總線的結(jié)構(gòu)十分簡單,僅有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é)議,可以實現(xiàn)各個節(jié)點在數(shù)據(jù)傳輸時的自由通信及互不影響,因此CAN總線應(yīng)具有標(biāo)準(zhǔn)的通信協(xié)議,這樣可以使CAN總線更加方便的應(yīng)用于控制系統(tǒng)中。為了實現(xiàn)這樣的設(shè)計理念,根據(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é)議而實現(xiàn)數(shù)據(jù)的傳輸。CAN總線中的數(shù)據(jù)鏈路層又可以分為兩個子層:邏輯鏈路控制子層(LLC)和介質(zhì)方向控制子層(MAC)。邏輯鏈路控制子層是數(shù)據(jù)鏈路層的核心層,它為遠(yuǎn)程數(shù)據(jù)的傳輸提供服務(wù),控制數(shù)據(jù)的邏輯傳輸。</p><p><b> (2)物理層</b></p>&l
9、t;p> 物理層是OSI參考模型中的最底層,主要作用是規(guī)定節(jié)點電氣方面的特征。為了實現(xiàn)數(shù)據(jù)的自由收發(fā),在同一網(wǎng)絡(luò)中的物理層應(yīng)該是處處一樣的。</p><p> 1.3 CAN總線報文幀格式</p><p> CAN總線上的數(shù)據(jù)信息都是以報文的形式發(fā)送的。報文的格式并不唯一,而是有幾種不同的格式,但是報文的長度卻受到電氣及內(nèi)部控制的限制。CAN總線的報文傳輸也就是幀的傳輸,幀是
10、CAN總線傳送數(shù)據(jù)單位。幀也有不同的格式,主要區(qū)別在于標(biāo)識符長度不同。在CAN2.0A協(xié)議下幀具有11位標(biāo)識符,叫作標(biāo)準(zhǔn)幀;而在最新的CAN2.0B協(xié)議下具有29位標(biāo)識符的幀叫作擴(kuò)展幀。</p><p> 為了實現(xiàn)數(shù)據(jù)的傳輸和控制,CAN總線報文傳輸具有4種不同類型的幀結(jié)構(gòu):數(shù)據(jù)幀、遠(yuǎn)程幀、錯誤幀、過載幀。其中數(shù)據(jù)幀的結(jié)構(gòu)圖如圖1-1所示。</p><p> 詳細(xì)的CAN總線報文幀結(jié)構(gòu)
11、可以參閱參考資料[6].</p><p> 1.4 CAN總線的優(yōu)勢</p><p> CAN總線已經(jīng)成為現(xiàn)在控制領(lǐng)域最流行的控制方案,只所以從CAN總線誕生以來僅僅二十年間便已成為公認(rèn)的最好的工業(yè)生產(chǎn)控制方案,是因為CAN總線相比其他控制總線在通信能力和速度方面具有明顯的優(yōu)勢。雖然現(xiàn)在還有很多基于R線組建的工業(yè)控制系統(tǒng),但它不具備CAN總線的諸多優(yōu)點。相比于其他的控制系統(tǒng),CAN的
12、優(yōu)勢在于:(1)CAN總線是多主工作方式,CAN總線舍棄了傳統(tǒng)控制系統(tǒng)中站地址編碼方法,而是對通信的數(shù)據(jù)進(jìn)行編碼,也就是說,CAN總線的節(jié)點是根據(jù)傳輸數(shù)據(jù)信息確定是否接收數(shù)據(jù)。這樣可以簡化控制系統(tǒng)。從面增強(qiáng)了CAN總線網(wǎng)絡(luò)的數(shù)據(jù)通信能力,也提高了系統(tǒng)的可靠性。(2)CAN總線的多個節(jié)點同時向總線上發(fā)送數(shù)據(jù)時,不會致使總線出現(xiàn)短路現(xiàn)象。因為CAN總線是通過CAN收發(fā)器芯片的兩個輸出端CANH和CANL和物理總線連在一起的,但CANH端只能
13、是高電平或者懸空狀態(tài),CANL只能是低電平或者懸空狀態(tài)。這樣就使CAN節(jié)點同時向總線發(fā)送數(shù)據(jù)時,不會短路。另外,CAN總線還有節(jié)點出現(xiàn)嚴(yán)重錯誤時自動關(guān)閉節(jié)點功能,以免其他節(jié)點受到影響。</p><p> 2 CAN總線通信芯片簡述</p><p> 2.1 CAN總線控制器SJA1000簡介</p><p> CAN總線只有OSI參考模式中的數(shù)據(jù)鏈路層和物
14、理層,但要實現(xiàn)這兩層的功能,必須制定相應(yīng)的協(xié)議和控制規(guī)則。通過CAN總線控制器可以實現(xiàn)對CAN總線的控制及數(shù)據(jù)通信。CAN總線控制器是一塊可編程的芯片,它與微處理器相接。通過對CAN總線控制器的編程,實現(xiàn)數(shù)據(jù)的通信?,F(xiàn)在有許多類型的CAN控制器芯片,但工業(yè)上的控制系統(tǒng)最常用的還是SJA1000 CAN控制器,下面簡要介紹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é)接收緩沖器、同時支持CAN2.0A和CAN2.0B協(xié)議、同時支持11位和29位標(biāo)識碼、通信速率可以達(dá)到1Mbps。另外,PeliCAN模式下還有一些新的功能,如擴(kuò)展到8個字節(jié)的驗收濾波器、自檢測等功能。</p><p> 對于SJA1000工作在BasicCAN模式還是工作在PeliCAN模式,即工作方式的選擇是由時鐘分頻寄存器(CDR)中的CAN模式位控制的。通電默認(rèn)的工作方
17、式是BAsicCAN模式。</p><p> 驗收濾波器(Acceptance Filter)是SJA1000中的核心寄存器,利用它,可以接收到預(yù)定中的數(shù)據(jù)。驗收濾波器又分為驗收代碼寄存器(ACR)和驗收屏蔽寄存器(AMR)。SJA1000中有4個ACR(ACR0、ACR1、ACR2、ACR3)和4個AMR(AMR0、AMR1、AMR2、AMR3)。標(biāo)識符也由原來的11位擴(kuò)展到29位,而濾波方式也有兩種,單濾波
18、模式和雙濾波模式(由模式寄存器中的AFM位決定)。需要接收的報文的標(biāo)識符存于驗收代碼寄存器中,相應(yīng)的屏蔽位存放在驗收屏蔽寄存器中。只有在發(fā)送的報文的標(biāo)識符與節(jié)點的標(biāo)識符和AMR的相應(yīng)位一致的情況下,節(jié)點才會接收報文。下面主要介紹雙濾波模式下擴(kuò)展幀格式的驗收濾波器的設(shè)置。</p><p> 雙濾波模式,顧名思義,就是有兩個濾波器,濾波器1由ACR0、ACR1和AMR0、AMR1組成;濾波器2由ACR2、ACR3和
19、AMR2、AMR3組成。接收報文時報文中的標(biāo)識符信息要與兩個濾波器中的值比較,但并不是兩個濾波器都必須通過才接收報文,而是只要有一個濾波器通過驗收就可以接收報文了。</p><p> 2.3 PCA82C250 CAN收發(fā)器介紹</p><p> CAN總線收發(fā)器是CAN控制器與物理總線之間的接口器件,它對總線提供差動發(fā)送和接收數(shù)據(jù)功能。CAN總線收發(fā)器也決定著系統(tǒng)的安全性、可靠性和
20、兼容性的優(yōu)劣。PCA82C250具有許多優(yōu)越的性能。在本次設(shè)計中PCA82C250僅僅用到了短路保護(hù)功能。</p><p> PCA82C250通過對引腳Rs的不同接法可以得到3種不同的工作模式:高速模式、斜率控制模式和待機(jī)模式。高速模式時VRs<0.3Vcc,VRs與地之間接1個0-1.8KΩ的電阻可以使PCA82C250工作在高速模式;斜率控制模式時與地之間接1個16.5KΩ-140KΩ的電阻;待機(jī)模
21、式時Rs保持高電平,VRs要大于0.75Vcc。</p><p> 3 CAN總線的通信設(shè)計及方案</p><p> 3.1 CAN總線通信的技術(shù)要求及目標(biāo)</p><p> 本次設(shè)計主要是利用51單片機(jī)和CAN芯片SJA1000實現(xiàn)點對點的相互通信。SJA1000是CAN控制器,主要用于一般的區(qū)域網(wǎng)絡(luò)控制。51單片機(jī)與SJA1000相連,SJA1000內(nèi)
22、的數(shù)據(jù)存儲地址相當(dāng)于51單片機(jī)的片外存儲器,利用51單片機(jī)的片外尋址,對SJA1000內(nèi)的各個寄存器進(jìn)行讀寫,進(jìn)而控制SJA1000實現(xiàn)CAN總線的點對點的通信。另外,還需要接入CAN收發(fā)器82C250來實現(xiàn)CAN總線的發(fā)送和接收功能。</p><p> 本次設(shè)計的目標(biāo)是將51單片機(jī)、CAN控制器SJA1000和CAN收發(fā)器82C250連在一起,編寫程序,實現(xiàn)點對點通信的收發(fā)。</p><p
23、> 3.2 CAN總線通信接口方案</p><p> CAN總線的硬件電路的節(jié)口非常簡單,只需要微處理器和CAN控制器及CAN收發(fā)器便可構(gòu)成。CAN總線通信接口通常情況下有2種實現(xiàn)方式:一種是由微處理器、獨立的CAN控制器和CAN收發(fā)器組成的硬件電路;另一種是集成CAN控制器的單片機(jī)和CAN收發(fā)器構(gòu)成的硬件電路。CAN總線在經(jīng)過二十多年的發(fā)展,已經(jīng)產(chǎn)生了許多類型的CAN總線協(xié)議的芯片,其中有獨立的CA
24、N控制器芯片,也有集成CAN控制器的微處理器芯片。獨立的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é)點</p><p> 采用AT89C51、SJA1000 CAN控制器和 PCA82C250 CAN收發(fā)器設(shè)計CAN通信節(jié)點。這種方案的設(shè)計思路很簡單,控制過程也比較方便。通過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é)點通信</p><p> Philips公司的P8xC591是集成CAN控制器的單片機(jī),這個方案中的節(jié)點只需要P8xC591和82C250 CAN收發(fā)器,CAN控制器內(nèi)置于P8xC591芯片中。雖然CAN控制器內(nèi)置于P8xC591中,但P8xC591還保留SJA1000的一切功能,甚至比SJA1000的功能更加強(qiáng)大,這種方案還大大簡化了硬件系統(tǒng)電路。</p><p>
27、 方案比較:方案2中,集成CAN控制器的單片機(jī)P8xC591因為其內(nèi)部已經(jīng)內(nèi)置了CAN控制器,所以不需要再進(jìn)行電路設(shè)計,這樣難以深入理解CAN總線的原理。P8xC591芯片是一種高性能通信芯片,價格比較高。在一般的系統(tǒng)控制中,實現(xiàn)簡單的控制就可滿足需要,常采用單片機(jī)和獨立的CAN控制器作為CAN節(jié)點進(jìn)行通信,這樣成本低,也可以更好的了解CAN總線的通信協(xié)議。另外,市場上有大量的單片機(jī),使用獨立的CAN控制器SJA1000可以根據(jù)控制要求
28、選擇適用的單片機(jī),從而更好的達(dá)到控制要求。因此,本設(shè)計采用方案1。</p><p> 3.3 CAN通信節(jié)點硬件電路設(shè)計</p><p> 節(jié)點是網(wǎng)絡(luò)上信息的接收和發(fā)送站。我們平常所用的節(jié)點都是由微處理器、CAN控制器和CAN收發(fā)器組成的。本設(shè)計中的硬件電路原理圖如圖3-1所示。</p><p> 由圖3-1可以看出,電路主要由AT89C51單片機(jī)、SJA1
29、000 CAN控制器、PCA82C250 CAN收發(fā)器組成。由AT89C51控制SJA1000,實現(xiàn)SJA1000的初始化、接收和發(fā)送數(shù)據(jù)。SJA1000的AD0~AD7分別接到AT89C51的P0口,CS接到AT89C51的P2.0。當(dāng)CS為低電平時(P2.0為0),CPU的片外存儲器地址可選中SJA1000,這樣CPU就可以通過這些地址對SJA1000相應(yīng)的寄存器進(jìn)行讀/寫操作。SJA1000的WR、RD、ALE分別與AT89C51
30、的對應(yīng)引腳相連接,INT接AT89C51的INT0引腳。</p><p> 對于一些較長距離通信的場合,要保證通信的可靠性和準(zhǔn)確性,一般不直接將SJA1000的TX0和RX0和82C250的TXD和RXD相接。而是通過高速光耦6N137后再與82C250相接。這樣的好處是大大增強(qiáng)了CAN總線節(jié)點的抗干擾能力。但在本次設(shè)計中并沒有采用6N137進(jìn)行電氣隔離,而是直接將SJA1000與82C250相接,因為本次設(shè)計
31、不是遠(yuǎn)距離輸送數(shù)據(jù),相應(yīng)的節(jié)點的抗干擾能力都可以滿足設(shè)計要求,所以不需要再接入6N137,這樣可以在滿足控制要求的情況下簡化系統(tǒng)的設(shè)計。</p><p> 對于82C250與CAN總線的接口也要進(jìn)行一些必要的防護(hù)措施。82C250的CANH和CANL引腳是通過一個5Ω的電阻與CAN總線相接的,這個5Ω的電阻可以起到一定的限流作用,從而保護(hù)82C250免以受到過大電流。</p><p>
32、 4 CAN總線通信的軟件設(shè)計</p><p> CAN總線節(jié)點的軟件設(shè)計一般包括三部分,即SJA1000的初始化、報文發(fā)送和報文接收。這三部分是保證CAN總線通信的基礎(chǔ),總程序見附錄1。下面章節(jié)將對這三部分的通信設(shè)計進(jìn)行詳細(xì)的說明。</p><p> 4.1 SJA1000的初始化過程</p><p> SJA1000的初始化只能在復(fù)位模式下進(jìn)行。初始化
33、過程主要是對一些寄存器設(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è)計了。發(fā)送子程序控制節(jié)點報文的發(fā)送。將要發(fā)送的報文放在發(fā)送緩存區(qū),然后通過中斷程序判斷是否向總線發(fā)送數(shù)據(jù)。但是在將報文送入SJA1000的發(fā)送緩存區(qū)之前,先要對一些寄存器進(jìn)行判斷,然后才能開啟發(fā)送。本次設(shè)計中當(dāng)SJA1000接收到報文后,應(yīng)將接收到的報文放于發(fā)送緩存區(qū)中,然后再將此報文發(fā)送出去并在相應(yīng)的界面上收到這組報文。</p><p> 4.3 SJA1000的接收子程序<
35、/p><p> 接收子程序負(fù)責(zé)節(jié)點報文的接收。在處理接收報文的同時,會出現(xiàn)各種情況。要根據(jù)狀態(tài)寄存器(SR)和命令寄存器(CMR)進(jìn)行讀寫操作,然后判斷需要接收的數(shù)據(jù),完成接收過程。本次設(shè)計中從串口工具界面上輸入一組數(shù)據(jù),然后發(fā)送到總線上,經(jīng)過驗收濾波器驗收過濾之后,在相應(yīng)的節(jié)點上接收到這組數(shù)據(jù),并存入接收緩沖區(qū)。</p><p><b> 設(shè)計總結(jié)</b></
36、p><p> 在設(shè)計之前,我沒有聽說過CAN總線通信協(xié)議。自從看到CAN總線通信設(shè)計這個設(shè)計后,經(jīng)過多方查閱相關(guān)資料和文獻(xiàn),我初步了解了CAN總線通信的有關(guān)協(xié)議和通信原理。CAN總線的通信是借助單片機(jī)對CAN控制器進(jìn)行相應(yīng)的編程,以此實現(xiàn)數(shù)據(jù)的通信。通常情況下,CAN總線通信可以達(dá)到很高的通信速率,滿足大多數(shù)工業(yè)控制的要求,特別是雖著CAN控制器的發(fā)展,以及CAN通信協(xié)議的標(biāo)準(zhǔn)化,使CAN總線越來越多地運用于各行各
37、業(yè)的控制系統(tǒng)中。</p><p> 本次設(shè)計用AT89C51微處理器、SJA1000 CAN控制器、PCA82C250 CAN收發(fā)器組成CAN通信節(jié)點來進(jìn)行CAN通信節(jié)點數(shù)據(jù)的收發(fā)。經(jīng)過仔細(xì)編程和調(diào)試,終于實現(xiàn)了CAN節(jié)點之間數(shù)據(jù)的收發(fā)通信。但本次設(shè)計也有不足之處,我所設(shè)計的硬件電路圖是極其簡單的系統(tǒng),其中沒有包含抗干擾能力措施和防護(hù)措施,只能進(jìn)行短距離的數(shù)據(jù)通信,若進(jìn)行長距離的數(shù)據(jù)通信,可能受到各種電磁信號的
38、干擾和輻射。若要進(jìn)行長距離的通信,在本次設(shè)計的基礎(chǔ)上還需要增加一些防護(hù)措施,比如在CANH和CANL與地之間各接一個小電容,可以有效的防止電磁輻射。</p><p> 總之,通過本次設(shè)計我還是學(xué)到了很多新的知識。以前根本沒有接觸過CAN總線,現(xiàn)在我已經(jīng)能夠看懂簡單的CAN總線通信程序和進(jìn)行一些簡單的CAN通信設(shè)計。</p><p> 另外我還要感謝張老師在本次畢業(yè)設(shè)計中對我的指點和幫助
39、,同時也要感謝同學(xué)們對我的幫助。</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è)計北京:北京航空航天大學(xué)出版社,1996.</p><p> [3] 鄔寬明.現(xiàn)場總
40、線技術(shù)應(yīng)用選編2[M].北京:北京航空航天大學(xué)出版社,2004.</p><p> [4] 李正軍.現(xiàn)場總線及其應(yīng)用技術(shù)[M].北京:機(jī)械工業(yè)出版社,2005. </p><p> [5] 張培人,王洪波.獨立CAN總線控制器SJA1000.國外電子元器件,2001.</p><p> [6] 鄒繼軍.現(xiàn)場總線CAN原理與應(yīng)用技術(shù).北京:北京航空航天大學(xué)出版社
41、,2007.</p><p> [7] 陽憲惠.現(xiàn)場總線技術(shù)及其應(yīng)用[M]. 北京:清華大學(xué)出版社,1999.</p><p> [8] 萬福君,潘松峰.單片微機(jī)原理系統(tǒng)設(shè)計與應(yīng)用.中國科學(xué)技術(shù)大學(xué)出版社,2001.</p><p> [9] 馮博琴,吳寧.微型計算機(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);//釋放仲裁隨時捕捉寄存器</p><p> Buf = Read_SJA1000(ECC);//釋放錯誤代碼捕捉寄存器</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); 千萬不要這樣賦值,否則出錯</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個數(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); //配置時鐘分頻寄存器,選擇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); //配置驗收代碼
86、/屏蔽寄存器</p><p> Write_SJA1000(REG_CAN_BTR0,BTR0); //配置總線定時器0x00</p><p> Write_SJA1000(REG_CAN_BTR1,BTR1); //配置總線定時器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個數(shù)據(jù)</p><p> WriteSJARegBlock(21,Send_CAN_Data,8);//擴(kuò)展幀,向發(fā)送緩沖區(qū)寫入8個數(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個數(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錯誤計數(shù)</p><p>
94、 canstatus3 = Read_SJA1000(14); //RX錯誤計數(shù)</p><p> canstatus4 = Read_SJA1000(12); //錯誤代碼捕捉</p><p> if((canstatus&0x0c)==0x0c) //判斷是否可以發(fā)送</p><p> Write_SJA1000(REG_CAN_
95、CMR,0x01);//使能發(fā)送請求,發(fā)送數(shù)據(jù) 對發(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Can總線通信研究與硬件設(shè)計畢業(yè)設(shè)計論文.doc
- 基于PC的CAN總線主節(jié)點監(jiān)控程序設(shè)計.pdf
- 畢業(yè)設(shè)計---串行通信接口設(shè)計
- 并行接口程序設(shè)計
- 畢業(yè)設(shè)計--汽車can總線技術(shù)研究
- 基于單片機(jī)通信接口的程序設(shè)計畢業(yè)論文開題報告
- 基于單片機(jī)通信接口的程序設(shè)計畢業(yè)論文開題報告
- 基于dsp的can總線通信設(shè)計
- can總線中繼器設(shè)計-電路設(shè)計【畢業(yè)設(shè)計】
- 畢業(yè)設(shè)計---基于 can 總線應(yīng)用系統(tǒng) --主控機(jī)設(shè)計
- can總線通信研究與硬件設(shè)計
- 畢業(yè)設(shè)計---基于wifi soc的無線通信模塊系統(tǒng)程序設(shè)計
- 主軸的加工工藝及數(shù)控程序設(shè)計畢業(yè)設(shè)計
- 基于can總線的溫度檢測系統(tǒng)畢業(yè)設(shè)計
- 基于CAN總線的OPC服務(wù)器端的程序設(shè)計.pdf
- 基于CAN總線的USB功能設(shè)備驅(qū)動程序設(shè)計與實現(xiàn).pdf
- can總線通信研究與軟件設(shè)計
- 串行異步通信程序設(shè)計
- 基于javasocket通信程序設(shè)計
- 試飛驗證系統(tǒng)模擬信號源總線接口及驅(qū)動程序設(shè)計.pdf
評論
0/150
提交評論