




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政會(huì)務(wù)接待禮儀培訓(xùn)
- 學(xué)生網(wǎng)絡(luò)安全教育活動(dòng)
- 2025年《小蝦》語(yǔ)文標(biāo)準(zhǔn)教案
- 紅色旅游產(chǎn)品要素
- 針灸治療皰疹的研究與探討
- AIGC商業(yè)應(yīng)用實(shí)戰(zhàn)教程 課件 4-3 商業(yè)演示模板的選擇與優(yōu)化
- 言行舉止培訓(xùn)
- 商業(yè)地產(chǎn)項(xiàng)目投資與開(kāi)發(fā)合作協(xié)議
- 腦內(nèi)出血新生兒的護(hù)理
- 紅外光學(xué)石英玻璃相關(guān)項(xiàng)目投資計(jì)劃書(shū)范本
- 兒童保健手冊(cè) (一)
- 2025年國(guó)家漢辦HSK漢語(yǔ)水平考試四級(jí)考試真題
- 2025年湖南食品藥品職業(yè)學(xué)院高職單招高職單招英語(yǔ)2016-2024年參考題庫(kù)含答案解析
- 保潔人員安全會(huì)議培訓(xùn)
- 寧德時(shí)代SHL測(cè)評(píng)答案
- 2025年徐州地鐵集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年《收納師》職業(yè)技能培訓(xùn)考試題庫(kù)
- 農(nóng)機(jī)檢修培訓(xùn)課件
- 2025車(chē)位租賃合同范本
- VR游戲設(shè)計(jì)與制作知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋四川長(zhǎng)江職業(yè)學(xué)院
- 平行線的判定與性質(zhì)證明題專(zhuān)訓(xùn)30題(人教版)(人教版) 帶解析
評(píng)論
0/150
提交評(píng)論