⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcp2515.c

📁 采用PIC18F4580和MCP2512实现can通信。
💻 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 + -