MCP2515軟件設(shè)計(jì)_第1頁(yè)
MCP2515軟件設(shè)計(jì)_第2頁(yè)
MCP2515軟件設(shè)計(jì)_第3頁(yè)
MCP2515軟件設(shè)計(jì)_第4頁(yè)
MCP2515軟件設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于MCP2515的SPI接口CAN總線控制器的軟件設(shè)計(jì)摘要:CAN總線是德國(guó)bosch公司在1986年面向汽車(chē)各子系統(tǒng)間通信而開(kāi)發(fā)出的通信協(xié)議。由于它的高性能和可靠性已被廣泛地應(yīng)用于工業(yè)自動(dòng)化、安防、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等其他領(lǐng)域,并已成為現(xiàn)場(chǎng)總線技術(shù)的發(fā)展熱點(diǎn)之一。目前工業(yè)設(shè)計(jì)中較多使用并口can總線控制器,并口can總線芯片占用了MCU較多的普通IO口資源。而目前MCU中大都包含著SPI接口模塊,如能通過(guò)SPI接口對(duì)can總線控制器進(jìn)行設(shè)置和收發(fā),將使MCU的IO接口得到了高效的使用。本論文將就使用MCU的SPI接口的can總線控制器的軟件設(shè)計(jì)進(jìn)行分析。關(guān)鍵詞:MCP2515MCUC

2、AN總線控制器SPI接口一、總線系統(tǒng)結(jié)構(gòu):CAN總線屬于目前眾多現(xiàn)場(chǎng)總線的一種,是一種集散型多主方式控制的串行通信網(wǎng)絡(luò)。網(wǎng)絡(luò)中各節(jié)點(diǎn)根據(jù)各自的總線訪問(wèn)優(yōu)先權(quán)(即標(biāo)準(zhǔn)或擴(kuò)展報(bào)文標(biāo)識(shí)符),采用仲裁方式競(jìng)向總線發(fā)送數(shù)據(jù)。CAN總線通過(guò)CAN控制器的兩個(gè)輸出端CANH和CANL與物理總線連接,特點(diǎn):1、CANH端是高電平或懸浮狀態(tài);2、CANL端是低電平或懸浮狀態(tài);其結(jié)構(gòu)特性使總線避免了當(dāng)系統(tǒng)出現(xiàn)錯(cuò)誤,多節(jié)點(diǎn)同時(shí)發(fā)送數(shù)據(jù)造成的總線短路。另外,CAN總線節(jié)點(diǎn)在錯(cuò)誤情況下具有自鎖功能,可有效避免總線癱瘓。由于采用CRC檢驗(yàn)并可提供相應(yīng)的錯(cuò)誤處理功能,保證了數(shù)據(jù)通信的可靠。它所具有的卓越性能和獨(dú)特設(shè)計(jì),特別

3、適合工業(yè)設(shè)備測(cè)控單元互連,公認(rèn)為最有前途的現(xiàn)場(chǎng)總線之一。二、串、并口CAN總線控制器概述1、并口CAN總線控制器特點(diǎn)一般并口CAN總線控制器芯片為SJA1000或82C200,并口的優(yōu)點(diǎn)是數(shù)據(jù)讀寫(xiě)速度快,但占用I/O口較多,硬件較復(fù)雜。在與MCU的接線中,最少使用13個(gè)IO口。2、SPI接口的CAN總線控制器特點(diǎn)SPI接口是標(biāo)準(zhǔn)串行外設(shè)接口(SerialPeripheralInterface,SPI),是芯片間通信總線。常見(jiàn)SPI接口can總線節(jié)點(diǎn)控制器microchip公司的MCP2510和MCP2515。其中,MCP2515完全支持CANV2.0B技術(shù)規(guī)范,它不僅能發(fā)送和接收標(biāo)準(zhǔn)和擴(kuò)展數(shù)據(jù)

4、幀以及遠(yuǎn)程幀。還自帶兩個(gè)驗(yàn)收屏蔽寄存器和六個(gè)驗(yàn)收濾波寄存器可以過(guò)濾掉不想要的報(bào)文。MCP2515與MCU的連接是通過(guò)SPI接口來(lái)實(shí)現(xiàn)的,接線使用了4個(gè)IO接口,因此減少了MCU的硬件開(kāi)銷(xiāo),但提高了軟件設(shè)計(jì)難度。三、CAN總線控制器MCP2515的軟件設(shè)計(jì)以microchip的MCU芯片編寫(xiě)軟件,分為四部分:SPI接口讀寫(xiě)、CAN節(jié)點(diǎn)初始化、報(bào)文發(fā)送和報(bào)文接收。1、MCP2515的SPI接口讀寫(xiě)SPI是標(biāo)準(zhǔn)四線同步的高速雙向串行總線。由時(shí)鐘線SCK、數(shù)據(jù)輸入SDI、數(shù)據(jù)輸出SDO、片選CS組成。通訊原理是:由SCK提供時(shí)鐘脈沖,SDI,SDO則基于此脈沖一位一位的串行完成數(shù)據(jù)傳輸。其中,數(shù)據(jù)在時(shí)

5、鐘上升沿或下降沿時(shí)改變,在緊接著的下降沿或上升沿被讀取。對(duì)于microchip的中檔MCU,芯片內(nèi)部包含了SPI模塊,所以軟件設(shè)計(jì)時(shí)不用再考慮傳輸原理,使SPI的編程變得非常簡(jiǎn)單。voidsend_SPI(unsignedchardata1)/*寫(xiě)SPI函數(shù)*/SSPBUF=data1;/啟動(dòng)發(fā)送while(SSPIF=0);/等待發(fā)送完畢SSPIF=0;/清除SSPIF標(biāo)志-unsignedcharreceive_SPI(void)/*讀SPI函數(shù)*/unsignedchardata2;SSPBUF=0;/清除SPI緩存while(SSPIF=0);/查詢數(shù)據(jù)接收完畢否SSPIF=0;dat

6、a2=SSPBUF;return(data2);2、對(duì)于MCP2515的CAN初始化:MCP2515在正常運(yùn)行之前必須進(jìn)行初始化。MCP2515有配置模式、正常模式、休眠模式、監(jiān)聽(tīng)模式、環(huán)回模式五種工作模式,通過(guò)CANCTRL.REQOP位的設(shè)置才能進(jìn)入相應(yīng)工作模式。CAN的初始化只有在配置模式下才能進(jìn)行。配置模式下,可以對(duì)CNF1、CNF2和CNF3波特率設(shè)置寄存器以及TXRTSCTRL發(fā)送控制寄存器和驗(yàn)收過(guò)濾寄存器進(jìn)行修改。初始化設(shè)置的次序:a.設(shè)置CANCTRL,進(jìn)入CAN配置模式;讀CANSTAT狀態(tài),判斷是否進(jìn)入配置狀態(tài)。b.設(shè)置CAN總線的波特率-CNF1/CNF2/CNF3;c.

7、設(shè)置TXRTSCTRL(發(fā)送請(qǐng)求控制寄存器),確定TX0RTSTX2RTS引腳的適用狀態(tài);d.設(shè)置TXBnCTRL(發(fā)送郵箱控制寄存器),確定郵箱0、郵箱1、郵箱2的優(yōu)先級(jí),以及ABTF位/MLOA位/TXERR位/TXREQ位清零報(bào)文寫(xiě)入郵箱之前,清零TXBnCTRL.TXREQ,表明發(fā)送郵箱無(wú)舊報(bào)文要發(fā)送;e.設(shè)置TXBnSIDH/TXBnSIDL(郵箱n的標(biāo)準(zhǔn)標(biāo)識(shí)符);TXBnEID8/TXBnEID0(郵箱n的擴(kuò)展標(biāo)識(shí)符);并將TXBnSIDL.EXIDE置一(擴(kuò)展符狀態(tài))。f.設(shè)置TXBnDLC(郵箱長(zhǎng)度碼),確定數(shù)據(jù)長(zhǎng)度(0-8字節(jié))g設(shè)置TXBnDn,發(fā)送郵箱n的數(shù)據(jù)字節(jié);例TX

8、B0D0、TXB0D1.TXB0D7h.設(shè)置CANINTE.TXnIE初始化,以便報(bào)文發(fā)送時(shí),禁止或使能中斷。I.設(shè)置CANCTRL,進(jìn)入CAN巡回/正常模式;voidInit_MCP2515(void)/MCP2515初始化函數(shù)reset_MCP2515();/復(fù)位MCP2515bit_modify_MCP2515(CANCTRL,0b11100000,0b10000000);/配置模式write_MCP2515(CNF1,0b00001001);/設(shè)置波特率write_MCP2515(CNF2,0b10010000);/設(shè)置波特率write_MCP2515(CNF3,0b01000010)

9、;/設(shè)置波特率write_MCP2515(RXB0CTRL,0b01100000);bit_modify_MCP2515(CANCTRL,0b11100000,0b00000000);/返回正常模式write_MCP2515(CANINTF,0b00000000);/接收緩沖器0滿中斷標(biāo)志位清零write_MCP2515(CANINTE,0b00000001);/接收緩沖器0滿中斷使能3、MCP2515的報(bào)文發(fā)送MCP2515有三個(gè)發(fā)送緩沖器。每個(gè)發(fā)送緩沖器占用14字節(jié)的SRAM,并映射到器件存儲(chǔ)器中。其中第一個(gè)字節(jié)TXBnCTRL是與報(bào)文緩沖器相關(guān)的控制寄存器。該寄存器中的信息決定了報(bào)文在何

10、種條件下發(fā)送,并在報(bào)文發(fā)送時(shí)指示其狀態(tài)。啟動(dòng)發(fā)送:設(shè)置TXBnCTRL.TXREQ為一,表明數(shù)據(jù)準(zhǔn)備好,等待總線空閑時(shí)發(fā)送。發(fā)送的三種方式:a、利用SPI寫(xiě)命令寫(xiě)寄存器,啟動(dòng);b、發(fā)送SPI的RTS命令,啟動(dòng);c、置TXnRTS引腳為低電平,啟動(dòng);報(bào)文發(fā)送函數(shù):write_MCP2515(TXB0CTRL,0x03);/設(shè)置為發(fā)送最高優(yōu)先級(jí)write_MCP2515(TXB0SIDH,0xFF);/SID10-SID3write_MCP2515(TXB0SIDL,0xE0);/SID2-SID0write_MCP2515(TXB0DLC,0x08);/發(fā)送數(shù)據(jù)長(zhǎng)度為8字節(jié)write_MCP25

11、15(TXB0D0,0x88);/發(fā)送的數(shù)據(jù)88send_TXB0();/請(qǐng)求發(fā)送while(read_MCP2515(TXB0CTRL)&0x08)=0x08);/等待發(fā)送完畢4、MCP2515的報(bào)文接收MCP2515具有兩個(gè)全接收緩沖器,應(yīng)接收不同的緩沖器有兩個(gè)驗(yàn)收屏蔽寄存器和六個(gè)驗(yàn)收濾波寄存器。除上述專(zhuān)用接收緩沖器外,MCP2515還具有單獨(dú)的報(bào)文集成緩沖器(MessageAssemblyBuffer,MAB),可作為第三個(gè)接收緩沖器。報(bào)文接收開(kāi)始時(shí)首先檢測(cè)起始幀,清接收緩存對(duì)應(yīng)的中斷標(biāo)志,進(jìn)入接收狀態(tài),數(shù)據(jù)進(jìn)入報(bào)文過(guò)濾和屏蔽處理。報(bào)文接收函數(shù):bit_modify_MCP251

12、5(CANINTF,0x01,0x00);/接收緩沖器0滿中斷標(biāo)志位清零read_MCP2515(RXB0SIDH);/接收到的標(biāo)準(zhǔn)標(biāo)識(shí)符高字節(jié)read_MCP2515(RXB0SIDL);/接收到的標(biāo)準(zhǔn)標(biāo)識(shí)符低字節(jié)read_MCP2515(RXB0EID8);/接收到的擴(kuò)展標(biāo)識(shí)符高字節(jié)(看RXB0EXID而定)read_MCP2515(RXB0EID0);/接收到的擴(kuò)展標(biāo)識(shí)符低字節(jié)(看RXB0EXID而定)read_MCP2515(RXB0DLC);/接收到的數(shù)據(jù)長(zhǎng)度read_MCP2515(RXB0D0);/接收到的數(shù)據(jù)。數(shù)據(jù)處理。5、對(duì)于can總線設(shè)計(jì)到的抗干擾問(wèn)題主要從軟件和硬件兩個(gè)方

13、面考慮。硬件結(jié)構(gòu)上考慮CAN控制器和物理層總線之間的接口隔離設(shè)計(jì);從軟件方面,為防止物理總線上傳來(lái)的干擾,軟件中應(yīng)作必要的抗干擾處理和設(shè)計(jì),一般,首先采取重復(fù)設(shè)定不影響當(dāng)前工作的特殊寄存器值,避免偶然脈沖干擾改變CPU內(nèi)部寄存器數(shù)據(jù);其次,對(duì)關(guān)鍵數(shù)據(jù)進(jìn)行備份,采用主副本數(shù)據(jù)校驗(yàn)和或分組BCH校驗(yàn)來(lái)保證數(shù)據(jù)的準(zhǔn)確性。四、結(jié)束語(yǔ)這里主要論述了基于MCP2515的SPI接口CAN總線控制器的軟件設(shè)計(jì)要點(diǎn),作為現(xiàn)場(chǎng)總線,CAN具體應(yīng)用非常廣泛,所涉及到其它的數(shù)據(jù)類(lèi)傳輸,如AD、DA、傳感器以及控制模塊也越來(lái)越多。此文章所涉及到的內(nèi)容也在工業(yè)的生產(chǎn)實(shí)踐中得到了應(yīng)用。/*=    &#

14、160;   C file about MCP2515   V1.00=Chip:      MCP2515Function:    The controller of CAN-BUSWriter:     Fenghui ZhuData:      2009.3.31Reference:   "mcp2515.c" of Fabian Greif=*/* /* 頭 文 件 配 置 區(qū) * /*#include "mcp2515.h&q

15、uot;/* /*   函 數(shù) 聲 明 區(qū)   * /*void mcp2515_init(void);void mcp2515_write_register(u08 data, u08 adress);u08 mcp2515_read_register(u08 adress);void mcp2515_bit_modify(u08 data, u08 mask, u08 adress);void mcp2515_write_register_p( u08 adress, u08 *data, u08 length );/* /*   函 數(shù) 定 義 區(qū) 

16、0; * /*/*/ /   函數(shù)說(shuō)明:MCP2515初始化程序                            / /   輸入:    無(wú)                                   / /   輸出: &

17、#160;  無(wú)                                          / /   調(diào)用函數(shù):                                  /*/vo

18、id mcp2515_init(void) /初始化MCU的SPI總線 /SPI_MasterInit();  / MCP2515 啟動(dòng)前進(jìn)行軟件復(fù)位 SPI_PORT &= (1<<SPI_CS);  /MCP2515的CS有效 SPI_MasterTransmit( SPI_RESET ); SPI_PORT |= (1<<SPI_CS);  /MCP2515的CS無(wú)效  /使用位修改指令將MCP2515設(shè)置為配置模式 /也就是將CANCT

19、RL寄存器的REQOP2:0設(shè)置為100 mcp2515_bit_modify( CANCTRL, 0xE0, (1<<REQOP2) );  /* /計(jì)算并設(shè)置MCP2515的位時(shí)間  / 時(shí)鐘頻率:Fosc  = 16MHz / 分頻控制器 CNF1.BRP5:0 = 7 / 最小時(shí)間份額 TQ = 2 * ( BRP + 1 ) / Fosc   = 2*(7+1)/16M = 1uS / 同步段 Sync Seg   = 1TQ / 傳播段 Pr

20、op Seg   = ( PRSEG + 1 ) * TQ  = 1 TQ / 相位緩沖段 Phase Seg1 = ( PHSEG1 + 1 ) * TQ = 3 TQ / 相位緩沖段 Phase Seg2 = ( PHSEG2 + 1 ) * TQ = 3 TQ / 同步跳轉(zhuǎn)長(zhǎng)度設(shè)置為 CNF1.SJW1:0 = 00, 即 1TQ / 總線波特率 NBR = Fbit =  1/(sync seg + Prop seg + PS1 + PS2 ) /         &

21、#160;             = 1/(8TQ) = 1/8uS = 125kHz  /設(shè)置分頻控制器CNF1.BRP5:0 = 7,同步跳轉(zhuǎn)長(zhǎng)度設(shè)置為 CNF1.SJW1:0 = 00 mcp2515_write_register( CNF1, (1<<BRP0)|(1<<BRP1)|(1<<BRP2) ); / 設(shè)置傳播段 Prop Seg 為00,即1TQ,相位緩沖段 Phase Seg1的長(zhǎng)度3TQ mcp2515_write_regi

22、ster( CNF2, (1<<BTLMODE)|(1<<PHSEG11) ); / 設(shè)置 相位緩沖段 Phase Seg2為 3TQ , 禁用喚醒濾波器 mcp2515_write_register( CNF3, (1<<PHSEG21) );  */  /設(shè)置為500kbps ,TQ = 1/8us /設(shè)置分頻控制器CNF1.BRP5:0 = 0,同步跳轉(zhuǎn)長(zhǎng)度設(shè)置為 CNF1.SJW1:0 = 01/ mcp2515_write_register( CNF1, (1<<BR

23、P0)|(1<<SJW0) );    / 500kbps mcp2515_write_register( CNF1, (1<<SJW0) );               /1Mbps  / 設(shè)置傳播段 Prop Seg 為00,即1TQ,相位緩沖段 Phase Seg1的長(zhǎng)度3TQ mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) ); / 設(shè)置 相位緩

24、沖段 Phase Seg2為 3TQ , 禁用喚醒濾波器 mcp2515_write_register( CNF3, (1<<PHSEG21) );   / 設(shè)置MCP2515中斷使能寄存器,禁用所有中斷/ mcp2515_write_register( CANINTE, /*(1<<RX1IE)|(1<<RX0IE)*/ 0 );  / 設(shè)置MCP2515中斷使能寄存器,使能接收緩沖器中斷 mcp2515_write_register( CANINTE, (1<<RX1IE)

25、|(1<<RX0IE) );  /設(shè)置數(shù)據(jù)接收相關(guān)寄存器   / 設(shè)置RXM1:0=11,關(guān)閉接收緩沖器0屏蔽/濾波功能,接收所有報(bào)文;禁止?jié)L存功能 mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) );  / 設(shè)置RXM1:0=11,關(guān)閉接收緩沖器1屏蔽/濾波功能,接收所有報(bào)文; mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) ); u08 tem

26、p4 = 0, 0, 0, 0 ;  /設(shè)置6個(gè)驗(yàn)收濾波寄存器為0, mcp2515_write_register_p( RXF0SIDH, temp, 4 ); mcp2515_write_register_p( RXF1SIDH, temp, 4 ); mcp2515_write_register_p( RXF2SIDH, temp, 4 ); mcp2515_write_register_p( RXF3SIDH, temp, 4 ); mcp2515_write_register_p( RXF4SIDH, temp,

27、4 ); mcp2515_write_register_p( RXF5SIDH, temp, 4 );  /設(shè)置2個(gè)驗(yàn)收濾波寄存器為0, mcp2515_write_register_p( RXM0SIDH, temp, 4 ); mcp2515_write_register_p( RXM1SIDH, temp, 4 );  /配置引腳 /設(shè)置接收相關(guān)引腳控制寄存器,配置它們禁用第二功能 mcp2515_write_register( BFPCTRL, 0 );  /調(diào)試使用,設(shè)置BF

28、PCTRL使RX0BF,RX1BF設(shè)置為數(shù)字輸出。 /mcp2515_bit_modify( BFPCTRL, (1<<B1BFE)|(1<<B0BFE)|(1<<B1BFM)|(1<<B0BFM), (1<<B1BFE)|(1<<B0BFE) );   /設(shè)置發(fā)送相關(guān)引腳控制寄存器,配置它們禁用第二功能 mcp2515_write_register( TXRTSCTRL, 0 );  /MCP2515進(jìn)入環(huán)回模式,進(jìn)行功能測(cè)試 /mcp251

29、5_bit_modify( CANCTRL, 0XE0, (1<<REQOP1) );  /MCP2515進(jìn)入正常模式 mcp2515_bit_modify( CANCTRL, 0xE0, 0);/*/ /   函數(shù)說(shuō)明:MCP2515寫(xiě)控制寄存器程序                      / /   輸入:    寄存器地址,寫(xiě)入數(shù)據(jù)         

30、0;               / /   輸出:    無(wú)                                          / /   調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit         &#

31、160;      /*/void mcp2515_write_register( u08 adress, u08 data ) / CS low ,MCP2515 enable SPI_PORT &= (1<<SPI_CS);  SPI_MasterTransmit(SPI_WRITE); / 發(fā)送SPI寫(xiě)寄存器控制字   SPI_MasterTransmit(adress);  /發(fā)送寄存器地址  SPI_MasterTransmit(data); &

32、#160; /發(fā)送寄存器數(shù)據(jù)  /CS high ,MCP2515 disable SPI_PORT |= (1<<SPI_CS);/*/ /   函數(shù)說(shuō)明:MCP2515讀控制寄存器程序                      / /   輸入:    寄存器地址,                    

33、;         / /   輸出:    寄存器數(shù)據(jù)                                  / /   調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit                /*/u08 mcp2515_read_r

34、egister(u08 adress) u08 data;  / CS low ,MCP2515 enable SPI_PORT &= (1<<SPI_CS);  SPI_MasterTransmit(SPI_READ); / 發(fā)送SPI寫(xiě)寄存器控制字  SPI_MasterTransmit(adress); /發(fā)送寄存器地址  data = SPI_MasterTransmit(0xff); /回讀寄存器數(shù)據(jù)  /CS high ,MCP2515 dis

35、able SPI_PORT |= (1<<SPI_CS);  return data;/*/ /   函數(shù)說(shuō)明:讀MCP2515接收緩沖器程序                      / /   輸入:    緩沖器地址,                          

36、  / /   輸出:    緩沖器數(shù)據(jù)                                  / /   調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit                /*/u08 mcp2515_read_rx_buffer(u08 adress)

37、60;u08 data;  / 判斷adress是否有效,除了1,2位,其余都應(yīng)為0 if (adress & 0xF9)  return 0;  / CS low ,MCP2515 enable SPI_PORT &= (1<<SPI_CS);  SPI_MasterTransmit(SPI_READ_RX | adress); /發(fā)送讀取控制字  data = SPI_MasterTransmit(0xff); /讀回?cái)?shù)據(jù) /CS high ,

38、MCP2515 disable SPI_PORT |= (1<<SPI_CS);  return data;/*/ /   函數(shù)說(shuō)明:MCP2515控制寄存器位修改程序                / /   輸入:    寄存器地址,修改位,修改數(shù)據(jù)                / /   輸出:    無(wú)  

39、                                    / /   調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit                /*/void mcp2515_bit_modify(u08 adress, u08 mask, u08 data) / CS low ,MCP

40、2515 enable SPI_PORT &= (1<<SPI_CS);  SPI_MasterTransmit(SPI_BIT_MODIFY); /SPI位修改指令  SPI_MasterTransmit(adress);    /發(fā)送寄存器地址  SPI_MasterTransmit(mask);     /發(fā)送屏蔽字節(jié),                  /屏蔽字節(jié)中“1

41、”表示允許對(duì)相應(yīng)位修改,“0”表示禁止修改 SPI_MasterTransmit(data);     /發(fā)送數(shù)據(jù)字節(jié) /CS high ,MCP2515 disable SPI_PORT |= (1<<SPI_CS);/*/ /   函數(shù)說(shuō)明:對(duì)MCP2515連續(xù)寄存器進(jìn)行連續(xù)寫(xiě)操作            / /   輸入:    連續(xù)寄存器起始地址,數(shù)據(jù)指針,數(shù)據(jù)長(zhǎng)度      / /  

42、輸出:    無(wú)                                      / /   調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit                /*/void mcp2515_write_register_p( u08 adress, u08 *d

43、ata, u08 length ) u08 i;  / CS low ,MCP2515 enable SPI_PORT &= (1<<SPI_CS);  SPI_MasterTransmit(SPI_WRITE);  /發(fā)送SPI寫(xiě)指令  SPI_MasterTransmit(adress);    /發(fā)送起始寄存器地址  for (i=0; i<length ;i+ )  SPI_MasterTransmit(*data+);

44、 /發(fā)送數(shù)據(jù)  /CS high ,MCP2515 disable SPI_PORT |= (1<<SPI_CS);/*/ /   函數(shù)說(shuō)明:對(duì)MCP2515連續(xù)寄存器進(jìn)行連續(xù)讀操作            / /   輸入:    連續(xù)寄存器起始地址,數(shù)據(jù)指針,數(shù)據(jù)長(zhǎng)度      / /   輸出:    無(wú)           

45、60;                          / /   調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit                /*/void mcp2515_read_register_p( u08 adress, u08 *data, u08 length ) u08 i;  / CS low ,MCP2515

46、 enable SPI_PORT &= (1<<SPI_CS);  SPI_MasterTransmit(SPI_READ);  /發(fā)送SPI讀指令  SPI_MasterTransmit(adress);   /發(fā)送起始寄存器地址  for (i=0; i<length ;i+ )  *data+ = SPI_MasterTransmit(0xff);  /數(shù)據(jù)保存  /CS high ,MCP2515 disable SPI_

47、PORT |= (1<<SPI_CS);頭文件:/*=        Headfile about MCP2515   V1.00=Chip:      MCP2515Function:    The controller of CAN-BUSWriter:     Fenghui ZhuData:      2009-3-31Reference:   "mcp2515.h" of Fabian Grei

48、f=*/#ifndef _MCP2515_H_#define _MCP2515_H_/* /* 用戶類(lèi)型定義區(qū)    * /*/* /* 頭 文 件 配 置 區(qū) * /*#include "Habit_Frank.h"#include "SPI_Ctrl.h"/* /*  系 統(tǒng) 宏 定 義  * /* / 定義寄存器地址#define RXF0SIDH 0x00#define RXF0SIDL 0x01#define RXF0EID8 0x02#define RXF0EID0 0x03#define RXF1SI

49、DH 0x04#define RXF1SIDL 0x05#define RXF1EID8 0x06#define RXF1EID0 0x07#define RXF2SIDH 0x08#define RXF2SIDL 0x09#define RXF2EID8 0x0A#define RXF2EID0 0x0B#define BFPCTRL  0x0C#define TXRTSCTRL 0x0D#define CANSTAT  0x0E#define CANCTRL  0x0F#define RXF3SIDH 0x10#define RXF3SIDL 0x11#def

50、ine 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 0x1A#define RXF5EID0 0x1B#define TEC    0x1C#define REC       0x1D#define RXM0SIDH 0x20#define

51、 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 CANINTE  0x2B#define CANINTF  0x2C#define EFLG   0x2D#define TXB0

52、CTRL 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#define TXB0D6  0x3C#defin

53、e TXB0D7  0x3D#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

54、#define TXB1D6  0x4C#define TXB1D7  0x4D#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 

55、0;0x5A#define TXB2D5  0x5B#define TXB2D6  0x5C#define TXB2D7  0x5D#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 RXB0D

56、3  0x69#define RXB0D4  0x6A#define RXB0D5  0x6B#define RXB0D6  0x6C#define RXB0D7  0x6D#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

57、 RXB1D2  0x78#define RXB1D3  0x79#define RXB1D4  0x7A#define RXB1D5  0x7B#define RXB1D6  0x7C#define RXB1D7  0x7D/定義寄存器BFPCTRL位信息#define B1BFS  5#define B0BFS  4#define B1BFE  3#define B0BFE  2#define B1BFM  1#define B0BFM  0/定義寄存器TXRTSCTRL

58、位信息#define B2RTS  5#define B1RTS  4#define B0RTS  3#define B2RTSM  2#define B1RTSM  1#define B0RTSM  0/定義寄存器CANSTAT位信息#define OPMOD2  7#define OPMOD1  6#define OPMOD0  5#define ICOD2  3#define ICOD1  2#define ICOD0  1/定義寄存器CANCTRL位信息#define

59、 REQOP2  7#define REQOP1  6#define REQOP0  5#define ABAT  4#define CLKEN  2#define CLKPRE1  1#define CLKPRE0  0 /定義寄存器CNF3位信息#define WAKFIL  6#define PHSEG22  2#define PHSEG21  1#define PHSEG20  0 /定義寄存器CNF2位信息#define BTLMODE  7#d

60、efine SAM   6#define PHSEG12  5#define PHSEG11  4#define PHSEG10  3#define PHSEG2  2#define PHSEG1  1#define PHSEG0  0 /定義寄存器CNF1位信息#define SJW1  7#define SJW0  6#define BRP5  5#define BRP4  4#define BRP3  3#define BRP2  2#define

61、BRP1  1#define BRP0  0 /定義寄存器CANINTE位信息#define MERRE  7#define WAKIE  6#define ERRIE  5#define TX2IE  4#define TX1IE  3#define TX0IE  2#define RX1IE  1#define RX0IE  0 /定義寄存器CANINTF位信息#define MERRF  7#define WAKIF  6#define ERRIF

62、 5#define TX2IF  4#define TX1IF  3#define TX0IF  2#define RX1IF  1#define RX0IF  0 /定義寄存器EFLG位信息#define RX1OVR  7#define RX0OVR  6#define TXB0  5#define TXEP  4#define RXEP  3#define TXWAR  2#define RXWAR  1#define EWARN  0&#

63、160;/定義寄存器TXBnCTRL ( n = 0, 1, 2 )位信息#define ABTF  6#define MLOA  5#define TXERR  4#define TXREQ  3#define TXP1  1#define TXP0  0 /定義寄存器RXB0CTRL位信息#define RXM1  6#define RXM0  5#define RXRTR  3#define BUKT  2#define BUKT1  1#define FILHIT0

64、 0/定義發(fā)送緩沖寄存器 TXBnSIDL ( n = 0, 1 )的位信息#define EXIDE  3/定義接受緩沖器1控制寄存器的位信息#define FILHIT2  2#define FILHIT1  1/* * 定義接收緩沖器n標(biāo)準(zhǔn)標(biāo)示符低位 RXBnSIDL ( n = 0, 1 )的位信息 */#define SRR   4#define IDE   3/ 定義接收緩沖器n數(shù)據(jù)長(zhǎng)度碼 RXBnDLC ( n = 0, 1 )的位信息#define RTR   6#define DLC3

65、 3#define DLC2  2#define DLC1  1#define DLC0  0 /定義SPI控制命令字#define SPI_RESET    0xC0#define SPI_READ    0x03#define SPI_READ_RX   0x90#define SPI_WRITE    0x02#define SPI_WRITE_TX  0x40#define SPI_RTS     0x80#define SPI_READ_STATUS 0xA0#define SPI_RX_STATUS  0xB0#define SPI_BIT_MODIFY 0x05/* /*   常 數(shù) 宏 定 義  * /*/* /*   動(dòng) 作 宏 定 義   * /*/* /*   全局變量聲明區(qū)   * /*/* /*   函 數(shù) 聲 明 區(qū)   * /* /*/ /   函數(shù)說(shuō)明:MCP2515初始化程序               &#

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論