📄 mcp2515.c
字号:
//////////////////////////////////////////////////////////////////////////
// 头文件定义 //
//说明:根据安装文件位置不同,路径有所不同,请注意。 //
//////////////////////////////////////////////////////////////////////////
#include "pic18.h"
#include "pic18f4580.h"
#include "MCP2515.h"
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数定义 //
//////////////////////////////////////////////////////////////////////////
void Init_MCP2515(void);
void reset_MCP2515(void);
void write_MCP2515 (unsigned char adress, unsigned char value);
unsigned char read_MCP2515(unsigned char adress);
void bit_modify_MCP2515(unsigned char adress,unsigned char mask, unsigned char value);
void send_TXB0(void);
void send_SPI(unsigned char data);
unsigned char receive_SPI(void);
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):Init_MCP2515 //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 对MCP2515进行初始化 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void Init_MCP2515(void)
{
reset_MCP2515(); //复位MCP2515
bit_modify_MCP2515(CANCTRL,0b11100000,0b10000000); //配置模式
//设置CAN波特率125kbps,在Fosc=20MHz时,Tbit=8us,假设BRP=09h
//则Tq=[2*(1+BRP)]/Fosc=2*(1+9)/(20MHz)=1us
//normal bit rate=8Tq,SJW=00,Sync_Seg=1Tq,Prog_Seg=1Tq
//Phase_Seg1=3Tq,Phase_Seg2=3Tq
write_MCP2515(CNF1,0b00001001);
write_MCP2515(CNF2,0b10010000);
write_MCP2515(CNF3,0b01000010);
write_MCP2515(RXB0CTRL,0b01100000);
write_MCP2515(RXB0CTRL,0b01100000);
bit_modify_MCP2515(CANCTRL,0b11100000,0b00000000); //正常模式
write_MCP2515(CANINTF,0b00000000);//接收缓冲器0满中断标志位清零
write_MCP2515(CANINTE,0b00000001);//接收缓冲器0满中断使能
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):reset_MCP2515 //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 复位MCP2515 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void reset_MCP2515(void)
{
open_2515; //打开SPI片选
send_SPI(RESET_MCP); //向SPI接口发送写复位指令
close_2515; //关闭SPI片选
}
//************************************************************************
/*********************************************************
Function name(函数名称):send_data_MCP2515
Create date(创建日期):2006.6.2
created by(创建人):夏红峰
Function(函数功能):通过2515向CAN总线发送数据
Modify date(修改日期):2006.6.2
Input(输入参数类型):无
Output(输出参考类型):无
Return(返回信息):
Others(说明):
**********************************************************/
/*
void send_data_MCP2515(void)
{
open_2515; //打开SPI片选
send_SPI(WRITE_MCP); //向SPI接口发送写指令
send_SPI(TXB0D0); //向SPI接口发送从某地址开始写数据
send_SPI(0x00);
send_SPI(0x11);
send_SPI(0x22);
send_SPI(0x33);
send_SPI(0x44);
send_SPI(0x55);
send_SPI(0x66);
send_SPI(0x77);
close_2515; //关闭SPI片选
send_TXB0(); //进行数据发送
}
*/
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):write_MCP2515 //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 向MCP2515指定的地址写数据 //
//Input(输入参数类型):adress为地址,value为向该地址写入的字节 //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void write_MCP2515(unsigned char adress,unsigned char value)
{
open_2515; //打开SPI片选
send_SPI(WRITE_MCP); //向SPI接口发送写指令
send_SPI(adress); //向SPI接口发送写指令的地址
send_SPI(value); //通过SPI接口发送向指定地址写入的数据
close_2515; //关闭SPI片选
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):read_MCP2515 //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 向MCP2515指定的地址读数据 //
//Input(输入参数类型):adress为所读的地址 //
//Output(输出参考类型):输出指定地址上的字节 //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
unsigned char read_MCP2515(unsigned char adress)
{
unsigned char SPIdata;
open_2515; //打开SPI片选
send_SPI(READ_MCP); //向SPI接口发送读指令
send_SPI(adress); //向SPI接口发送读指令的地址
SPIdata = receive_SPI();
close_2515; //关闭SPI片选
return(SPIdata);
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):bit_modify_MCP2515 //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 向MCP2515指定的地址,指定的位修改位进行位修改 //
//Input(输入参数类型):adress为要进行位修改的地址 //
// mask为要进行位修改的指定位 //
// value为要进行位修改的值 //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void bit_modify_MCP2515(unsigned char adress,unsigned char mask, unsigned char value)
{
open_2515; //打开SPI片选
send_SPI(BIT_MODIFY); //向SPI接口发送位修改指令
send_SPI(adress); //向SPI接口发送位修改的地址
send_SPI(mask); //向SPI接口发送需要位修改的地址的某些位
send_SPI(value); //向SPI接口发送要进行位修改的值
close_2515; //关闭SPI片选
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):send_TXB0 //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能):通过TXB0向CAN总线发送数据 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void send_TXB0(void)
{
open_2515; //打开SPI片选
send_SPI(RTS_TXB0);
close_2515; //关闭SPI片选
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):send_SPI //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 向SPI接口写数据 //
//Input(输入参数类型):unsigned char data //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void send_SPI(unsigned char data1)
{
SSPBUF = data1; //启动发送
while(SSPIF == 0);//等待发送完毕
SSPIF = 0; //清除SSPIF标志
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):receive_SPI //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 向SPI接口读数据 //
//Input(输入参数类型):unsigned char data //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
unsigned char receive_SPI(void)
{
unsigned char data2;
SSPBUF = 0; //清楚BF
while(SSPIF == 0);//查询数据接收完毕否
SSPIF = 0;
data2 = SSPBUF;
return(data2);
}
//************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -