單片機(jī)和MCP2510的CAN總線通信模塊設(shè)計(jì)_第1頁
單片機(jī)和MCP2510的CAN總線通信模塊設(shè)計(jì)_第2頁
單片機(jī)和MCP2510的CAN總線通信模塊設(shè)計(jì)_第3頁
單片機(jī)和MCP2510的CAN總線通信模塊設(shè)計(jì)_第4頁
單片機(jī)和MCP2510的CAN總線通信模塊設(shè)計(jì)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、單片機(jī)和MCP2510的CAN總線通信模塊設(shè)計(jì) 單片機(jī)和MCP2510的CAN總線通信模塊設(shè)計(jì) CAN(Controller Area Network)總線,即控制器局域網(wǎng)。由于具有高性能、高可靠性以及獨(dú)特的設(shè)計(jì),CAN總線越來越受到人們的重視。德國的Bosch公司最初為汽車監(jiān)控和控制系統(tǒng)設(shè)計(jì)了CAN總線,現(xiàn)在,其應(yīng)用已面向過程工業(yè)、機(jī)械工業(yè)、紡織工業(yè)、農(nóng)用機(jī)械、機(jī)器人、數(shù)控機(jī)床、醫(yī)療器械及傳感器等領(lǐng)域發(fā)展。CAN總線已經(jīng)形成國際標(biāo)準(zhǔn),并已經(jīng)公認(rèn)為是最有前途的現(xiàn)場總線之一。CAN總線規(guī)范已經(jīng)被國際標(biāo)準(zhǔn)化組織制訂為國際標(biāo)準(zhǔn)ISO11898,并得到眾多半導(dǎo)體器件廠商的支持,推出各種集成有CAN協(xié)議

2、的產(chǎn)品。CAN總線系統(tǒng)智能節(jié)點(diǎn)是網(wǎng)絡(luò)上報(bào)文的接收和發(fā)送站,一般由單片機(jī)和CAN控制器或二者合二為一組成。 MCP25l0是Microchip公司生產(chǎn)的一種獨(dú)立的可編程CAN控制器芯片。本文將介紹新型的獨(dú)立CAN通信控制器MCP2510,并給出其在CAN總線系統(tǒng)智能節(jié)點(diǎn)中的應(yīng)用實(shí)例。 1.MCP2510芯片介紹 MCP25lO是一種帶有SPI接口的CAN控制器,DIP封裝如圖1所示。它支持CAN技術(shù)規(guī)范V2.OA/B,能夠發(fā)送或接收標(biāo)準(zhǔn)的和擴(kuò)展的信息幀,同時(shí)具有接收濾波和信息管理的功能。MCP2510通過SI接口與MCU進(jìn)行數(shù)據(jù)傳輸,最高數(shù)據(jù)傳輸速率可達(dá)5 Mbps,MCU可通過MCP2510與

3、CAN總線上的其他MCU單元通信。MCP2510內(nèi)含3個(gè)發(fā)送緩沖器和2個(gè)接收緩沖器,同時(shí)還具有靈活的中斷管理能力,這些特點(diǎn)使得MCU對(duì)CAN總線的操作變得非常簡便。 1.1 MCP2510的主要特點(diǎn) 支持CANV 2.0A/B; 具有SPI接口,支持SPI模式0,0和1,1; 內(nèi)含3個(gè)發(fā)送緩沖器和2個(gè)接收緩沖器,可對(duì)其優(yōu)先權(quán)進(jìn)行編程; 具有6個(gè)接收過濾器,2個(gè)接收過濾器屏蔽; 具有靈活的中斷管理能力; 采用低功耗CMOS工藝技術(shù),其工作電壓范圍為3.05.5 V,有效電流為5 mA,維持電流為10A; 工作溫度范圍為-40+125。 1.2 結(jié)構(gòu)及工作原理 MCP2510有PDIP、SOIC和

4、TSSOP三種封裝形式。圖2是MCP2510的內(nèi)部結(jié)構(gòu)框圖。CAN協(xié)議機(jī)負(fù)責(zé)與CAN總線的接口,SPI接口邏輯用于實(shí)現(xiàn)同MCU的通信,而寄存、緩沖器組與控制邏輯則用來完成各種方式的設(shè)定和操作控制。現(xiàn)結(jié)合其工作過程將各部分的功能、原理作一介紹。 (1) 收發(fā)操作 MCP251O的發(fā)送操作通過3個(gè)發(fā)送緩沖器來實(shí)現(xiàn)。這3個(gè)發(fā)送緩沖器各占據(jù)14字節(jié)的SRAM。第1字節(jié)是控制寄存器TXBNCTRL,該寄存器用來設(shè)定信息發(fā)送的條件,且給出了信息的發(fā)送狀態(tài);第26字節(jié)用來存放標(biāo)準(zhǔn)的和擴(kuò)展的標(biāo)識(shí)符以及仲裁信息;最后8字節(jié)則用來存放待發(fā)送的數(shù)據(jù)信息。在進(jìn)行發(fā)送前,必須先對(duì)這些寄存器進(jìn)行初始化。 (2) 中斷管理

5、 MCP25lO有8個(gè)中斷源,包括發(fā)送中斷、接收中斷、錯(cuò)誤中斷及總線喚醒中斷等。利用中斷使能寄存器(CANINTE)和中斷屏蔽寄存器(CANINTF)可以方便地實(shí)現(xiàn)對(duì)各種中斷的有效管理。當(dāng)有中斷發(fā)生時(shí),INT引腳變?yōu)榈碗娖讲⒈3衷诘碗娖?,直到MCU清除中斷為止。 (3) 錯(cuò)誤檢測 CAN協(xié)議具有CRCF錯(cuò)誤、應(yīng)答錯(cuò)誤、形式錯(cuò)誤、位錯(cuò)誤和填充錯(cuò)誤等檢測功能。MCP2510內(nèi)含接收出錯(cuò)計(jì)數(shù)器(REC)和發(fā)送出錯(cuò)計(jì)數(shù)器(TEC)兩個(gè)錯(cuò)誤計(jì)數(shù)器。因而對(duì)網(wǎng)絡(luò)中的任何一個(gè)節(jié)點(diǎn)來說,都有可能因?yàn)殄e(cuò)誤汁數(shù)器的數(shù)值不同而使其處于錯(cuò)誤一激活、錯(cuò)誤一認(rèn)可和總線-脫離3種狀態(tài)之一。 2.MCP2510在智能節(jié)點(diǎn)中的應(yīng)

6、用實(shí)例 利用MCP2510和CAN總線收發(fā)器TJA1050可構(gòu)成一個(gè)CAN總線分布式測控網(wǎng)絡(luò)。系統(tǒng)可包括一個(gè)主控制器和多個(gè)節(jié)點(diǎn)控制器,這種節(jié)點(diǎn)控制器可對(duì)電動(dòng)機(jī)的電流、電壓及周圍的溫度進(jìn)行監(jiān)控,其結(jié)構(gòu)如圖3所示。 這種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)采用了總線式結(jié)構(gòu)和無源抽頭連接,且結(jié)構(gòu)簡單、成本低,因而系統(tǒng)的可靠性較高。其信息傳輸采用CAN通信協(xié)議,通信介質(zhì)采用雙絞線。由于CAN總線是基于發(fā)送報(bào)文的編碼,不對(duì)CAN控制節(jié)點(diǎn)進(jìn)行編碼,故系統(tǒng)的可擴(kuò)充性比較好,同時(shí)增刪CAN總線上的控制節(jié)點(diǎn)不會(huì)對(duì)系統(tǒng)的其余節(jié)點(diǎn)造成任何影響。節(jié)點(diǎn)控制器的MCU可選用具有SPI接口的微處理器,也可采用不帶SPI接口的微處理器。本系統(tǒng)采用的

7、是不帶SPI接口的微處理器AT89C51。AT89C51可通過P1口與CAN控制器的SPI接口直接相連,并用軟件算法來實(shí)現(xiàn)SPI接口協(xié)議。CAN總線收發(fā)器TJA1050則作為MCP25l0與物理總線的接口。如果需要進(jìn)一步提高系統(tǒng)的抗干擾能力,則可在MCP2510和TJAl050之間再加一個(gè)光電隔離器。 智能節(jié)點(diǎn)電路原理圖如圖4所示。 2.1 軟件設(shè)計(jì) MCP2510正常工作之前,需要進(jìn)行正確的初始化,包括設(shè)置SPI接口的數(shù)據(jù)傳輸速率、CAN通信的波特率、MCP2510的接收過濾器和屏蔽器以及發(fā)送和接收中斷允許標(biāo)志位等。與SJA1000不同的是,單片機(jī)對(duì)MCP2510的接收緩沖器和發(fā)送緩沖器的操

8、作,必須通過SPI接口用MCP2510內(nèi)置讀寫命令來完成。其讀、寫命令時(shí)序圖如圖5和圖6所示。 本文中MCP2510主要采取中斷模式進(jìn)行總線數(shù)據(jù)的接收和發(fā)送。整個(gè)系統(tǒng)主序提供兩種中斷:定時(shí)器中斷和外部中斷。定時(shí)器中斷的中斷子程序主要負(fù)責(zé)處理來自模擬通道AIN0AIN7的A/D數(shù)據(jù),向MCP2510發(fā)送“數(shù)據(jù)發(fā)送請(qǐng)求命令”以及發(fā)送數(shù)據(jù)。外部中斷的中斷處理子程序主要包括CAN總線錯(cuò)誤處理子程序和數(shù)據(jù)接收子程序。 2.2 軟件主體設(shè)計(jì)流程 軟件主體設(shè)計(jì)流程如圖7所示。軟件設(shè)計(jì)時(shí)需要注意以下問題: 因?yàn)镸CP2510在初始化完成后處于默認(rèn)Config-uration模式下,所以就需要在MCP2510的

9、初始化完后將其置為Normal模式,否則MCP2510將一直停留在Configuration模式下,不能正常進(jìn)行工作。將MCP2510置Normal模式可通過使用MCP2510內(nèi)置的BitModify(位修改)4指令向CANCTRL控制字寫入一個(gè)0字節(jié)來實(shí)現(xiàn)。 在對(duì)MCP2510進(jìn)行任何操作之前,都要由微處理器向MCP2510的片選CS輸出一個(gè)低電平,使得MCP2510選通。 在執(zhí)行MCP2510的“讀”操作時(shí),發(fā)送完讀指令及其地址碼之后,仍然需要向MCP2510提供時(shí)鐘,以接收“讀”到的數(shù)據(jù)??梢酝ㄟ^向MCP2510發(fā)送一個(gè)0字節(jié)來實(shí)現(xiàn)。 在對(duì)MCP2510完成任意操作后,都要延時(shí)一段時(shí)間,

10、使其有足夠的時(shí)間來準(zhǔn)備接收下次操作的命令,防止出現(xiàn)MCP2510“忙”的情況。 3.總結(jié) CAN總線已被公認(rèn)為是最有前途的幾種現(xiàn)場總線之一。因其性價(jià)比高、實(shí)現(xiàn)簡單等突出優(yōu)點(diǎn)深受越來越多的研發(fā)人員的青睞。本文的智能節(jié)點(diǎn)可聯(lián)結(jié)多個(gè)集散控制系統(tǒng),其軟硬件電路的設(shè)計(jì)方法同樣適合于其他基于CAN總線的分布式控制系統(tǒng)的節(jié)點(diǎn)設(shè)汁。上一頁 / =CAN通信程序= #include #include #include / MCP2510寄存器定義 / =常數(shù)和變量定義= #define READ 0x03 / 讀MCP2510指令代碼 #define WRITE 0x02 / 寫MCP2510指令代碼 #def

11、ine RESET 0xC0 / 復(fù)位MCP2510指令代碼 #define RTS 0x80 / MCP2510請(qǐng)求發(fā)送指令代碼 #define STA2510 0xA0 / 讀MCP2510狀態(tài)指令代碼 #define BITMOD 0x05 / MCP2510位修改指令代碼 int a12; / SPI發(fā)送或接收數(shù)據(jù)寄存器int b8; / 發(fā)送或接收的數(shù)據(jù)int c8; / 發(fā)送或接收的數(shù)據(jù)int i; / 臨時(shí)變量int count; / 發(fā)送接收計(jì)數(shù)器int count1=0; / for testint RecID_H=0;int RecID_L=0;int DLC=8;void

12、 SPIINT();void TMR1INT();void CCP1INT();void SPIEXCHANGE(int count);void WAIT_SPI();void RESET2510();int RD2510(int adress,int n);void WR2510(int adress,int n);void RTS2510(int RTSn);int GETS2510();void BM2510(int adress,int mask,int data);void SETNORMAL();void TXCOMPLETE(int adress);void TXMSG(int

13、DLC);int RXMSG();void INIT2510();void INIT877();void INITSPI();void ACK();void wait();/ =主程序= main(void) int l,detect=0; SSPIE=1; TMR1IE=1; CCP1IE=1; CCP2IE=1; PEIE=1; ei(); / 開中斷 INIT877(); / 初始化PIC16F877芯片 INITSPI(); / 初始化SPI接口 INIT2510(); / 初始化MCP2510芯片 flag1=0; flag2=0; CCP1CON=0x05; CCP2CON=0x0

14、4; while(1) RXMSG(); TXMSG(8); / =中斷服務(wù)程序= / SPI中斷服務(wù)子程序 void SPIINT() SSPIF=0; ai+=SSPBUF; / 數(shù)據(jù)暫存a中 count-=1; if(count0) SSPBUF=ai;/ 未發(fā)送完,繼續(xù) else RE2=1; / 否則,片選信號(hào)置高電平 return;/ TMR1中斷服務(wù)子程序 void TMR1INT() TMR1IF=0; T1CON=0; if(!flag1) TMR1H=0xfe; / 512 s 脈沖寬度 TMR1L=0x00; T1CON=0x01; PORTD=0xff; / 輸出所有通

15、道 flag1=1; else flag1=0; PORTD=0; T1CON=0; return;/ CCP1中斷服務(wù)子程序 void CCP1INT() CCP1IF=0; T1CON=0x01; return;/ CCP2中斷服務(wù)子程序 void CCP2INT() CCP2IF=0; T1CON=0x01; return;/ 中斷入口,保護(hù)現(xiàn)場,判中斷類型 void interrupt INTS() di(); if(TMR1IF) TMR1INT(); / 定時(shí)器TMR1中斷 else if(CCP1IF) CCP1INT(); / 電壓過零捕捉中斷1 else if(CCP2IF)

16、 CCP2INT(); / 電壓過零捕捉中斷2 else if(SSPIF) SPIINT(); / SPI接口中斷 ei();/ =子程序= / 啟動(dòng)SPI傳送 void SPIEXCHANGE(count) int count; if(count0) / 有數(shù)據(jù)可送? i=0; RE2=0; / 片選位置低電平 SSPBUF=ai; / 送數(shù) else ; / 否則,空操作,并返回 return;/ 等待SPI傳送完成 void WAIT_SPI() do ; while(count0); / 當(dāng)count!=0時(shí),等待 to add CLRWDT return;/ 對(duì)MCP2510芯片進(jìn)

17、行復(fù)位 void RESET2510() a0=RESET; count=1; SPIEXCHANGE(count); / 送復(fù)位指令 WAIT_SPI(); return;/ 讀取從地址adress開始的寄存器中的數(shù)據(jù),共n個(gè),存放在數(shù)組bn中 int RD2510(adress,n) int adress; int n; int j; a0=READ; a1=adress; for(j=0;jn;j+) aj+2=0; count=n+2; / 指令、地址和要得到的數(shù)據(jù)量n SPIEXCHANGE(count); WAIT_SPI(); for(j=0;jn;j+) bj=aj+2;/ 數(shù)

18、據(jù)存到數(shù)組b中 return;/ 向從地址adress開始的寄存器寫入數(shù)據(jù),共n個(gè),數(shù)據(jù)存放數(shù)組bn中 void WR2510(adress,n) int adress; int n; int j; a0=WRITE; a1=adress; for(j=0;jn;j+) aj+2=bj; count=n+2; / 指令、地址和要寫入的數(shù)據(jù)量n SPIEXCHANGE(count); WAIT_SPI(); return;/ MCP2510芯片請(qǐng)求發(fā)送程序 void RTS2510(RTSn) int RTSn; a0=RTSRTSn; count=1; SPIEXCHANGE(count);

19、/ 發(fā)送MCP2510芯片,請(qǐng)求發(fā)送指令 WAIT_SPI(); return;/ 讀取MCP2510芯片的狀態(tài) int GETS2510() a0=STA2510; a1=0; count=2; SPIEXCHANGE(count); / 讀取MCP2510芯片狀態(tài) WAIT_SPI(); b0=a1; / 狀態(tài)存到數(shù)組b中 return;/ 對(duì)MCP2510芯片進(jìn)行位修改子程序 void BM2510(adress,mask,data) int adress; int mask; int data; a0=BITMOD; / 位修改指令 a1=adress; / 位修改寄存器地址 a2=m

20、ask; / 位修改屏蔽位 a3=data; / 位修改數(shù)據(jù) count=4; SPIEXCHANGE(count); WAIT_SPI(); return;/ 設(shè)置MCP2510芯片為正常操作模式 void SETNORMAL() int k=1; BM2510(CANCTRL,0xe0,0x00); / 設(shè)置為正常操作模式 do RD2510(CANSTAT,1); k=b0&0xe0; while(k); / 確認(rèn)已進(jìn)入正常操作模式 return;/ 對(duì)MCP2510進(jìn)行初始化 void INIT2510() RESET2510(); / 使芯片復(fù)位 b0=0x02; b1=0x90;

21、b2=0x07; WR2510(CNF3,3); / 波特率為 125 kbps b0=0x00; b1=0x00; WR2510(RXM0SIDH,2); b0=0x00; b1=0x00; WR2510(RXF0SIDH,2); / RX0接收,屏蔽位為0,過濾器為0 b0=0x00; WR2510(CANINTE,1); / CAN中斷不使能 SETNORMAL(); / 設(shè)置為正常操作模式 return;/ MCP2510芯片發(fā)送完成與否判斷,郵箱號(hào)為adress void TXCOMPLETE(adress)int adress; int k=1; do RD2510(adress,1); k=b0&0x08; while(k); / 確認(rèn)是否已發(fā)送完畢 to add CLRWDT return;/ 初始化PIC16F877芯片 void INIT877() PORTA=0; PORTB=0; P

溫馨提示

  • 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)論