版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*============================================================
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《两岸财经动态》课件
- 2.4.1 使用电子邮件和即时通信软件(课件)-【中职专用】高一信息技术同步课堂(高教版2021基础模块上册)
- 浙江省杭州市余杭区2024-2025学年八年级上学期期中语文试卷(含解析)
- 工商行政管理论文
- 2024年度旅游景点开发与投资合同
- 2024年度打管桩分包劳务合同模板
- 2024年度槽探工程质量保修合同
- 2024年度版权许可使用合同标的及许可范围具体说明
- 2024年度光纤网络升级改造合同
- 2024年度新能源技术转让合同
- 《药物化学》期末复习试题
- 园林景观工程关键施工技术、措施
- 盾构机行业电缆分析
- 职业道德与焊工职业守则
- 设备安装与维修培训课件
- 铁道车辆制动装置及制动新技术全套教学课件
- “天眼”智慧风险预警系统
- 电力企业合规培训课件模板
- 2023-2024学年四川省成都市高一上英语期末考试题(含答案和音频)
- 肝内胆管结石的护理查房课件
- 大学生当兵职业规划书
评论
0/150
提交评论