MCP2515頭文件和源代碼_第1頁
MCP2515頭文件和源代碼_第2頁
MCP2515頭文件和源代碼_第3頁
MCP2515頭文件和源代碼_第4頁
MCP2515頭文件和源代碼_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

/*============================================================

CfileaboutMCP2515

V1.00

==============================================================

Chip:

MCP2515

Function:

ThecontrollerofCAN-BUS

Writer:

FenghuiZhu

Data:

2009.3.31

Reference:

"mcp2515.c"ofFabianGreif

=============================================================*///*********************

//*頭文件配置區(qū)*

//*********************

#include"mcp2515.h"http://**********************

//*

函數(shù)聲明區(qū)

*

//**********************

voidmcp2515_init(void);voidmcp2515_write_register(u08data,u08adress);u08mcp2515_read_register(u08adress);voidmcp2515_bit_modify(u08data,u08mask,u08adress);voidmcp2515_write_register_p(u08adress,u08*data,u08length);//**********************

//*

函數(shù)定義區(qū)

*

//**********************//**********************************************************//

//

函數(shù)說明:MCP2515初始化程序

//

//

輸入:

//

//

輸出:

//

//

調(diào)用函數(shù):

//

//**********************************************************//

voidmcp2515_init(void)

{

//初始化MCU的SPI總線

//SPI_MasterInit();

//MCP2515啟動前進(jìn)行軟件復(fù)位

SPI_PORT&=~(1<<SPI_CS);

//MCP2515的CS有效

SPI_MasterTransmit(SPI_RESET);

SPI_PORT|=(1<<SPI_CS);

//MCP2515的CS無效

//使用位修改指令將MCP2515設(shè)置為配置模式

//也就是將CANCTRL寄存器的REQOP[2:0]設(shè)置為100

mcp2515_bit_modify(CANCTRL,0xE0,(1<<REQOP2));

/*

//計(jì)算并設(shè)置MCP2515的位時(shí)間

//時(shí)鐘頻率:Fosc

=16MHz

//分頻控制器CNF1.BRP[5:0]=7

//最小時(shí)間份額TQ=2*(BRP+1)/Fosc

=2*(7+1)/16M=1uS

//同步段SyncSeg

=1TQ

//傳播段PropSeg

=(PRSEG+1)*TQ

=1TQ

//相位緩沖段PhaseSeg1=(PHSEG1+1)*TQ=3TQ

//相位緩沖段PhaseSeg2=(PHSEG2+1)*TQ=3TQ

//同步跳轉(zhuǎn)長度設(shè)置為CNF1.SJW[1:0]=00,即1TQ

//總線波特率NBR=Fbit=

1/(syncseg+Propseg+PS1+PS2)

//

=1/(8TQ)=1/8uS=125kHz

//設(shè)置分頻控制器CNF1.BRP[5:0]=7,同步跳轉(zhuǎn)長度設(shè)置為CNF1.SJW[1:0]=00

mcp2515_write_register(CNF1,(1<<BRP0)|(1<<BRP1)|(1<<BRP2));

//設(shè)置傳播段PropSeg為00,即1TQ,相位緩沖段PhaseSeg1的長度3TQ

mcp2515_write_register(CNF2,(1<<BTLMODE)|(1<<PHSEG11));

//設(shè)置相位緩沖段PhaseSeg2為3TQ,禁用喚醒濾波器

mcp2515_write_register(CNF3,(1<<PHSEG21));

*/

//設(shè)置為500kbps,TQ=1/8us

//設(shè)置分頻控制器CNF1.BRP[5:0]=0,同步跳轉(zhuǎn)長度設(shè)置為CNF1.SJW[1:0]=01

//mcp2515_write_register(CNF1,(1<<BRP0)|(1<<SJW0));

//500kbps

mcp2515_write_register(CNF1,(1<<SJW0));

//1Mbps

//設(shè)置傳播段PropSeg為00,即1TQ,相位緩沖段PhaseSeg1的長度3TQ

mcp2515_write_register(CNF2,(1<<BTLMODE)|(1<<PHSEG11));

//設(shè)置相位緩沖段PhaseSeg2為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)|(1<<RX0IE));

//設(shè)置數(shù)據(jù)接收相關(guān)寄存器

//設(shè)置RXM[1:0]=11,關(guān)閉接收緩沖器0屏蔽/濾波功能,接收所有報(bào)文;禁止?jié)L存功能

mcp2515_write_register(RXB0CTRL,(1<<RXM1)|(1<<RXM0));

//設(shè)置RXM[1:0]=11,關(guān)閉接收緩沖器1屏蔽/濾波功能,接收所有報(bào)文;

mcp2515_write_register(RXB1CTRL,(1<<RXM1)|(1<<RXM0));u08temp[4]={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,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è)置BFPCTRL使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)行功能測試

//mcp2515_bit_modify(CANCTRL,0XE0,(1<<REQOP1));

//MCP2515進(jìn)入正常模式

mcp2515_bit_modify(CANCTRL,0xE0,0);

}

//**********************************************************//

//

函數(shù)說明:MCP2515寫控制寄存器程序

//

//

輸入:

寄存器地址,寫入數(shù)據(jù)

//

//

輸出:

//

//

調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit

//

//**********************************************************//voidmcp2515_write_register(u08adress,u08data)

{

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_WRITE);//發(fā)送SPI寫寄存器控制字

SPI_MasterTransmit(adress);

//發(fā)送寄存器地址

SPI_MasterTransmit(data);

//發(fā)送寄存器數(shù)據(jù)

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

}//**********************************************************//

//

函數(shù)說明:MCP2515讀控制寄存器程序

//

//

輸入:

寄存器地址,

//

//

輸出:

寄存器數(shù)據(jù)

//

//

調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit

//

//**********************************************************//u08mcp2515_read_register(u08adress)

{

u08data;

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_READ);//發(fā)送SPI寫寄存器控制字

SPI_MasterTransmit(adress);//發(fā)送寄存器地址

data=SPI_MasterTransmit(0xff);//回讀寄存器數(shù)據(jù)

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

returndata;

}//**********************************************************//

//

函數(shù)說明:讀MCP2515接收緩沖器程序

//

//

輸入:

緩沖器地址,

//

//

輸出:

緩沖器數(shù)據(jù)

//

//

調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit

//

//**********************************************************//u08mcp2515_read_rx_buffer(u08adress)

{

u08data;

//判斷adress是否有效,除了1,2位,其余都應(yīng)為0

if(adress&0xF9)

return0;

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_READ_RX|adress);//發(fā)送讀取控制字

data=SPI_MasterTransmit(0xff);//讀回?cái)?shù)據(jù)

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

returndata;

}//**********************************************************//

//

函數(shù)說明:MCP2515控制寄存器位修改程序

//

//

輸入:

寄存器地址,修改位,修改數(shù)據(jù)

//

//

輸出:

//

//

調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit

//

//**********************************************************//voidmcp2515_bit_modify(u08adress,u08mask,u08data)

{

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_BIT_MODIFY);//SPI位修改指令

SPI_MasterTransmit(adress);

//發(fā)送寄存器地址

SPI_MasterTransmit(mask);

//發(fā)送屏蔽字節(jié),

//屏蔽字節(jié)中“1”表示允許對相應(yīng)位修改,“0”表示禁止修改

SPI_MasterTransmit(data);

//發(fā)送數(shù)據(jù)字節(jié)

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

}//**********************************************************//

//

函數(shù)說明:對MCP2515連續(xù)寄存器進(jìn)行連續(xù)寫操作

//

//

輸入:

連續(xù)寄存器起始地址,數(shù)據(jù)指針,數(shù)據(jù)長度

//

//

輸出:

//

//

調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit

//

//**********************************************************//

voidmcp2515_write_register_p(u08adress,u08*data,u08length)

{

u08i;

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_WRITE);

//發(fā)送SPI寫指令

SPI_MasterTransmit(adress);

//發(fā)送起始寄存器地址

for(i=0;i<length;i++)

SPI_MasterTransmit(*data++);

//發(fā)送數(shù)據(jù)

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

}//**********************************************************//

//

函數(shù)說明:對MCP2515連續(xù)寄存器進(jìn)行連續(xù)讀操作

//

//

輸入:

連續(xù)寄存器起始地址,數(shù)據(jù)指針,數(shù)據(jù)長度

//

//

輸出:

//

//

調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit

//

//**********************************************************//

voidmcp2515_read_register_p(u08adress,u08*data,u08length)

{

u08i;

//CSlow,MCP2515enable

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ù)保存

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

}頭文件:/*============================================================

HeadfileaboutMCP2515

V1.00

==============================================================

Chip:

MCP2515

Function:

ThecontrollerofCAN-BUS

Writer:

FenghuiZhu

Data:

2009-3-31

Reference:

"mcp2515.h"ofFabianGreif

=============================================================*/#ifndef_MCP2515_H_

#define_MCP2515_H_//*********************

//*用戶類型定義區(qū)

*

//*********************//*********************

//*頭文件配置區(qū)*

//*********************

#include"Habit_Frank.h"

#include"SPI_Ctrl.h"

//********************

//*

系統(tǒng)宏定義

*

//********************//定義寄存器地址

#defineRXF0SIDH0x00

#defineRXF0SIDL0x01

#defineRXF0EID80x02

#defineRXF0EID00x03

#defineRXF1SIDH0x04

#defineRXF1SIDL0x05

#defineRXF1EID80x06

#defineRXF1EID00x07

#defineRXF2SIDH0x08

#defineRXF2SIDL0x09

#defineRXF2EID80x0A

#defineRXF2EID00x0B

#defineBFPCTRL

0x0C

#defineTXRTSCTRL0x0D

#defineCANSTAT

0x0E

#defineCANCTRL

0x0F#defineRXF3SIDH0x10

#defineRXF3SIDL0x11

#defineRXF3EID80x12

#defineRXF3EID00x13

#defineRXF4SIDH0x14

#defineRXF4SIDL0x15

#defineRXF4EID80x16

#defineRXF4EID00x17

#defineRXF5SIDH0x18

#defineRXF5SIDL0x19

#defineRXF5EID80x1A

#defineRXF5EID00x1B

#defineTEC

0x1C

#defineREC

0x1D#defineRXM0SIDH0x20

#defineRXM0SIDL0x21

#defineRXM0EID80x22

#defineRXM0EID00x23

#defineRXM1SIDH0x24

#defineRXM1SIDL0x25

#defineRXM1EID80x26

#defineRXM1EID00x27

#defineCNF3

0x28

#defineCNF2

0x29

#defineCNF1

0x2A

#defineCANINTE

0x2B

#defineCANINTF

0x2C

#defineEFLG

0x2D#defineTXB0CTRL0x30

#defineTXB0SIDH0x31

#defineTXB0SIDL0x32

#defineTXB0EID80x33

#defineTXB0EID00x34

#defineTXB0DLC

0x35

#defineTXB0D0

0x36

#defineTXB0D1

0x37

#defineTXB0D2

0x38

#defineTXB0D3

0x39

#defineTXB0D4

0x3A

#defineTXB0D5

0x3B

#defineTXB0D6

0x3C

#defineTXB0D7

0x3D#defineTXB1CTRL0x40

#defineTXB1SIDH0x41

#defineTXB1SIDL0x42

#defineTXB1EID80x43

#defineTXB1EID00x44

#defineTXB1DLC

0x45

#defineTXB1D0

0x46

#defineTXB1D1

0x47

#defineTXB1D2

0x48

#defineTXB1D3

0x49

#defineTXB1D4

0x4A

#defineTXB1D5

0x4B

#defineTXB1D6

0x4C

#defineTXB1D7

0x4D#defineTXB2CTRL0x50

#defineTXB2SIDH0x51

#defineTXB2SIDL0x52

#defineTXB2EID80x53

#defineTXB2EID00x54

#defineTXB2DLC

0x55

#defineTXB2D0

0x56

#defineTXB2D1

0x57

#defineTXB2D2

0x58

#defineTXB2D3

0x59

#defineTXB2D4

0x5A

#defineTXB2D5

0x5B

#defineTXB2D6

0x5C

#defineTXB2D7

0x5D#defineRXB0CTRL0x60

#defineRXB0SIDH0x61

#defineRXB0SIDL0x62

#defineRXB0EID80x63

#defineRXB0EID00x64

#defineRXB0DLC

0x65

#defineRXB0D0

0x66

#defineRXB0D1

0x67

#defineRXB0D2

0x68

#defineRXB0D3

0x69

#defineRXB0D4

0x6A

#defineRXB0D5

0x6B

#defineRXB0D6

0x6C

#defineRXB0D7

0x6D#defineRXB1CTRL0x70

#defineRXB1SIDH0x71

#defineRXB1SIDL0x72

#defineRXB1EID80x73

#defineRXB1EID00x74

#defineRXB1DLC

0x75

#defineRXB1D0

0x76

#defineRXB1D1

0x77

#defineRXB1D2

0x78

#defineRXB1D3

0x79

#defineRXB1D4

0x7A

#defineRXB1D5

0x7B

#defineRXB1D6

0x7C

#defineRXB1D7

0x7D//定義寄存器BFPCTRL位信息

#defineB1BFS

5

#defineB0BFS

4

#defineB1BFE

3

#defineB0BFE

2

#defineB1BFM

1

#defineB0BFM

0//定義寄存器TXRTSCTRL位信息

#defineB2RTS

5

#defineB1RTS

4

#defineB0RTS

3

#defineB2RTSM

2

#defineB1RTSM

1

#defineB0RTSM

0//定義寄存器CANSTAT位信息

#defineOPMOD2

7

#defineOPMOD1

6

#defineOPMOD0

5

#defineICOD2

3

#defineICOD1

2

#defineICOD0

1

//定義寄存器CANCTRL位信息

#defineREQOP2

7

#defineREQOP1

6

#defineREQOP0

5

#defineABAT

4

#defineCLKEN

2

#defineCLKPRE1

1

#defineCLKPRE0

0

//定義寄存器CNF3位信息

#defineWAKFIL

6

#definePHSEG22

2

#definePHSEG21

1

#definePHSEG20

0

//定義寄存器CNF2位信息

#defineBTLMODE

7

#defineSAM

6

#definePHSEG12

5

#definePHSEG11

4

#definePHSEG10

3

#definePHSEG2

2

#definePHSEG1

1

#definePHSEG0

0

//定義寄存器CNF1位信息

#defineSJW1

7

#defineSJW0

6

#defineBRP5

5

#defineBRP4

4

#defineBRP3

3

#defineBRP2

2

#defineBRP1

1

#defineBRP0

0

//定義寄存器CANINTE位信息

#defineMERRE

7

#defineWAKIE

6

#defineERRIE

5

#defineTX2IE

4

#defineTX1IE

3

#defineTX0IE

2

#defineRX1IE

1

#defineRX0IE

0

//定義寄存器CANINTF位信息

#defineMERRF

7

#defineWAKIF

6

#defineERRIF

5

#defineTX2IF

4

#defineTX1IF

3

#defineTX0IF

2

#defineRX1IF

1

#defineRX0IF

0

//定義寄存器EFLG位信息

#defineRX1OVR

7

#defineRX0OVR

6

#defineTXB0

5

#defineTXEP

4

#defineRXEP

3

#defineTXWAR

2

#defineRXWAR

1

#defineEWARN

0

//定義寄存器TXBnCTRL(n=0,1,2)位信息

#defineABTF

6

#defineMLOA

5

#defineTXERR

4

#defineTXREQ

3

#defineTXP1

1

#defineTXP0

0

//定義寄存器RXB0CTRL位信息

#defineRXM1

6

#defineRXM0

5

#defineRXRTR

3

#defineBUKT

2

#defineBUKT1

1

#defineFILHIT0

0//定義發(fā)送緩沖寄存器TXBnSIDL(n=0,1)的位信息#defineEXIDE

3//定義接受緩沖器1控制寄存器的位信息

#defineFILHIT2

2

#defineFILHIT1

1/**

*定義接收緩沖器n標(biāo)準(zhǔn)標(biāo)示符低位RXBnSIDL(n=0,1)的位信息

*/

#defineSRR

4

#defineIDE

3

//定義接收緩沖器n數(shù)據(jù)長度碼RXBnDLC(n=0,1)的位信息#defineRTR

6

#defineDLC3

3

#defineDLC2

2

#defineDLC1

1

#defineDLC0

0//定義SPI控制命令字

#defineSPI_RESET

0xC0

#defineSPI_READ

0x03

#defineSPI_READ_RX

0x90

#defineSPI_WRITE

0x02

#defineSPI_WRITE_TX

0x40

#defineSPI_RTS

0x80

#defineSPI_READ_STATUS0xA0

#defineSPI_RX_STATUS

0xB0

#defineSPI_BIT_MODIFY0x05

//*********************

//*

常數(shù)宏定義

*

//*********************//**********************

//*

動作宏定義

*

//**********************//**********************

//*

全局變量聲明區(qū)

*

//**********************//**********************

//*

函數(shù)聲明區(qū)

*

//**********************

//**********************************************************//

//

函數(shù)說明:MCP2515初始化程序

//

//

輸入:

//

//

輸出:

//

//

調(diào)用函數(shù):

//

//**********************************************************//

externvoidmcp2515_init(void);//**********************************************************//

//

函數(shù)說明:MCP2515寫控制寄存器程序

//

//

輸入:

寄存器地址,寫入數(shù)據(jù)

//

//

輸出:

//

//

調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit

//

//**********************************************************//

externvoidmcp2515_write_register(u08adress,

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論