MCP2515头文件和源代码_第1页
MCP2515头文件和源代码_第2页
MCP2515头文件和源代码_第3页
MCP2515头文件和源代码_第4页
MCP2515头文件和源代码_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

CfileaboutMCP2515

V1.00

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

Chip:

MCP2515

Function:

ThecontrollerofCAN-BUS

Writer:

FenghuiZhu

Data:

2009.3.31

Reference:

"mcp2515.c"ofFabianGreif

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

//*头文件配置区*

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

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

//*

函数声明区

*

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

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);//**********************

//*

函数定义区

*

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

//

函数说明:MCP2515初始化程序

//

//

输入:

//

//

输出:

//

//

调用函数:

//

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

voidmcp2515_init(void)

{

//初始化MCU的SPI总线

//SPI_MasterInit();

//MCP2515启动前进行软件复位

SPI_PORT&=~(1<<SPI_CS);

//MCP2515的CS有效

SPI_MasterTransmit(SPI_RESET);

SPI_PORT|=(1<<SPI_CS);

//MCP2515的CS无效

//使用位修改指令将MCP2515设置为配置模式

//也就是将CANCTRL寄存器的REQOP[2:0]设置为100

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

/*

//计算并设置MCP2515的位时间

//时钟频率:Fosc

=16MHz

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

//最小时间份额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

//同步跳转长度设置为CNF1.SJW[1:0]=00,即1TQ

//总线波特率NBR=Fbit=

1/(syncseg+Propseg+PS1+PS2)

//

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

//设置分频控制器CNF1.BRP[5:0]=7,同步跳转长度设置为CNF1.SJW[1:0]=00

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

//设置传播段PropSeg为00,即1TQ,相位缓冲段PhaseSeg1的长度3TQ

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

//设置相位缓冲段PhaseSeg2为3TQ,禁用唤醒滤波器

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

*/

//设置为500kbps,TQ=1/8us

//设置分频控制器CNF1.BRP[5:0]=0,同步跳转长度设置为CNF1.SJW[1:0]=01

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

//500kbps

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

//1Mbps

//设置传播段PropSeg为00,即1TQ,相位缓冲段PhaseSeg1的长度3TQ

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

//设置相位缓冲段PhaseSeg2为3TQ,禁用唤醒滤波器

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

//设置MCP2515中断使能寄存器,禁用所有中断

//mcp2515_write_register(CANINTE,/*(1<<RX1IE)|(1<<RX0IE)*/0);

//设置MCP2515中断使能寄存器,使能接收缓冲器中断

mcp2515_write_register(CANINTE,(1<<RX1IE)|(1<<RX0IE));

//设置数据接收相关寄存器

//设置RXM[1:0]=11,关闭接收缓冲器0屏蔽/滤波功能,接收所有报文;禁止滚存功能

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

//设置RXM[1:0]=11,关闭接收缓冲器1屏蔽/滤波功能,接收所有报文;

mcp2515_write_register(RXB1CTRL,(1<<RXM1)|(1<<RXM0));u08temp[4]={0,0,0,0};

//设置6个验收滤波寄存器为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);

//设置2个验收滤波寄存器为0,

mcp2515_write_register_p(RXM0SIDH,temp,4);

mcp2515_write_register_p(RXM1SIDH,temp,4);

//配置引脚

//设置接收相关引脚控制寄存器,配置它们禁用第二功能

mcp2515_write_register(BFPCTRL,0);

//调试使用,设置BFPCTRL使RX0BF,RX1BF设置为数字输出。

//mcp2515_bit_modify(BFPCTRL,(1<<B1BFE)|(1<<B0BFE)|(1<<B1BFM)|(1<<B0BFM),(1<<B1BFE)|(1<<B0BFE));

//设置发送相关引脚控制寄存器,配置它们禁用第二功能

mcp2515_write_register(TXRTSCTRL,0);

//MCP2515进入环回模式,进行功能测试

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

//MCP2515进入正常模式

mcp2515_bit_modify(CANCTRL,0xE0,0);

}

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

//

函数说明:MCP2515写控制寄存器程序

//

//

输入:

寄存器地址,写入数据

//

//

输出:

//

//

调用函数:SPI发送程序SPI_MasterTransmit

//

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

{

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_WRITE);//发送SPI写寄存器控制字

SPI_MasterTransmit(adress);

//发送寄存器地址

SPI_MasterTransmit(data);

//发送寄存器数据

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

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

//

函数说明:MCP2515读控制寄存器程序

//

//

输入:

寄存器地址,

//

//

输出:

寄存器数据

//

//

调用函数:SPI发送程序SPI_MasterTransmit

//

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

{

u08data;

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_READ);//发送SPI写寄存器控制字

SPI_MasterTransmit(adress);//发送寄存器地址

data=SPI_MasterTransmit(0xff);//回读寄存器数据

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

returndata;

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

//

函数说明:读MCP2515接收缓冲器程序

//

//

输入:

缓冲器地址,

//

//

输出:

缓冲器数据

//

//

调用函数:SPI发送程序SPI_MasterTransmit

//

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

{

u08data;

//判断adress是否有效,除了1,2位,其余都应为0

if(adress&0xF9)

return0;

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_READ_RX|adress);//发送读取控制字

data=SPI_MasterTransmit(0xff);//读回数据

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

returndata;

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

//

函数说明:MCP2515控制寄存器位修改程序

//

//

输入:

寄存器地址,修改位,修改数据

//

//

输出:

//

//

调用函数:SPI发送程序SPI_MasterTransmit

//

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

{

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

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

SPI_MasterTransmit(adress);

//发送寄存器地址

SPI_MasterTransmit(mask);

//发送屏蔽字节,

//屏蔽字节中“1”表示允许对相应位修改,“0”表示禁止修改

SPI_MasterTransmit(data);

//发送数据字节

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

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

//

函数说明:对MCP2515连续寄存器进行连续写操作

//

//

输入:

连续寄存器起始地址,数据指针,数据长度

//

//

输出:

//

//

调用函数:SPI发送程序SPI_MasterTransmit

//

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

voidmcp2515_write_register_p(u08adress,u08*data,u08length)

{

u08i;

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_WRITE);

//发送SPI写指令

SPI_MasterTransmit(adress);

//发送起始寄存器地址

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

SPI_MasterTransmit(*data++);

//发送数据

//CShigh,MCP2515disable

SPI_PORT|=(1<<SPI_CS);

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

//

函数说明:对MCP2515连续寄存器进行连续读操作

//

//

输入:

连续寄存器起始地址,数据指针,数据长度

//

//

输出:

//

//

调用函数:SPI发送程序SPI_MasterTransmit

//

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

voidmcp2515_read_register_p(u08adress,u08*data,u08length)

{

u08i;

//CSlow,MCP2515enable

SPI_PORT&=~(1<<SPI_CS);

SPI_MasterTransmit(SPI_READ);

//发送SPI读指令

SPI_MasterTransmit(adress);

//发送起始寄存器地址

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

*data++=SPI_MasterTransmit(0xff);

//数据保存

//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_//*********************

//*用户类型定义区

*

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

//*头文件配置区*

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

#include"Habit_Frank.h"

#include"SPI_Ctrl.h"

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

//*

系统宏定义

*

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

#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//定义发送缓冲寄存器TXBnSIDL(n=0,1)的位信息#defineEXIDE

3//定义接受缓冲器1控制寄存器的位信息

#defineFILHIT2

2

#defineFILHIT1

1/**

*定义接收缓冲器n标准标示符低位RXBnSIDL(n=0,1)的位信息

*/

#defineSRR

4

#defineIDE

3

//定义接收缓冲器n数据长度码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

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

//*

常数宏定义

*

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

//*

动作宏定义

*

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

//*

全局变量声明区

*

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

//*

函数声明区

*

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

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

//

函数说明:MCP2515初始化程序

//

//

输入:

//

//

输出:

//

//

调用函数:

//

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

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

//

函数说明:MCP2515写控制寄存器程序

//

//

输入:

寄存器地址,写入数据

//

//

输出:

//

//

调用函数:SPI发送程序SPI_MasterTransmit

//

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

externvoidmcp2515_write_register(u08adress,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论