MCP2515头文件和源代码Word格式.docx
《MCP2515头文件和源代码Word格式.docx》由会员分享,可在线阅读,更多相关《MCP2515头文件和源代码Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
函数声明区
*
//**********************
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<
//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
0]=0,同步跳转长度设置为CNF1.SJW[1:
0]=01
//mcp2515_write_register(CNF1,(1<
SJW0));
//500kbps
//1Mbps
//设置传播段PropSeg为00,即1TQ,相位缓冲段PhaseSeg1的长度3TQ
//设置MCP2515中断使能寄存器,禁用所有中断
//mcp2515_write_register(CANINTE,/*(1<
RX1IE)|(1<
RX0IE)*/0);
//设置MCP2515中断使能寄存器,使能接收缓冲器中断
mcp2515_write_register(CANINTE,(1<
RX0IE));
//设置数据接收相关寄存器
//设置RXM[1:
0]=11,关闭接收缓冲器0屏蔽/滤波功能,接收所有报文;
禁止滚存功能
mcp2515_write_register(RXB0CTRL,(1<
RXM1)|(1<
RXM0));
0]=11,关闭接收缓冲器1屏蔽/滤波功能,接收所有报文;
mcp2515_write_register(RXB1CTRL,(1<
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<
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_MasterTransmit(SPI_WRITE);
//发送SPI写寄存器控制字
SPI_MasterTransmit(adress);
//发送寄存器地址
SPI_MasterTransmit(data);
//发送寄存器数据
//CShigh,MCP2515disable
MCP2515读控制寄存器程序
寄存器地址,
寄存器数据
u08mcp2515_read_register(u08adress)
u08data;
SPI_MasterTransmit(SPI_READ);
//发送SPI写寄存器控制字
//发送寄存器地址
data=SPI_MasterTransmit(0xff);
//回读寄存器数据
returndata;
读MCP2515接收缓冲器程序
缓冲器地址,
缓冲器数据
u08mcp2515_read_rx_buffer(u08adress)
//判断adress是否有效,除了1,2位,其余都应为0
if(adress&
0xF9)
return0;
SPI_MasterTransmit(SPI_READ_RX|adress);
//发送读取控制字
//读回数据
MCP2515控制寄存器位修改程序
寄存器地址,修改位,修改数据
voidmcp2515_bit_modify(u08adress,u08mask,u08data)
SPI_MasterTransmit(SPI_BIT_MODIFY);
//SPI位修改指令
SPI_MasterTransmit(mask);
//发送屏蔽字节,
//屏蔽字节中“1”表示允许对相应位修改,“0”表示禁止修改
//发送数据字节
对MCP2515连续寄存器进行连续写操作
连续寄存器起始地址,数据指针,数据长度
voidmcp2515_write_register_p(u08adress,u08*data,u08length)
u08i;
//发送SPI写指令
//发送起始寄存器地址
for(i=0;
i<
length;
i++)
SPI_MasterTransmit(*data++);
//发送数据
对MCP2515连续寄存器进行连续读操作
voidmcp2515_read_register_p(u08adress,u08*data,u08length)
//发送SPI读指令
//发送起始寄存器地址
*data++=SPI_MasterTransmit(0xff);
//数据保存
头文件:
HeadfileaboutMCP2515
2009-3-31
#ifndef_MCP2515_H_
#define_MCP2515_H_
//*用户类型定义区
*
Habit_Frank.h"
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
#defineCA