mcp2515.c

来自「是在Visual dsp++下面进行CAN通信的源代码」· C语言 代码 · 共 188 行

C
188
字号
#include "bf5xx.h"
#include "types.h"

#define Out_Flag_A 0x00
#define Out_Flag_B 0x00
#define Out_Flag_C 0x00


/****************************************************************************
* 名称 : MCP2515_init
* 功能 : 初始化SPI控制器 选通CAN_SPISS
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void MCP2515_init(void)
{
	*pFIO_DIR = PF2;
 	*pFIO_FLAG_S = PF2;    //拉高SPISS
  	SPIinit();
 	SPIMenable();
 	SPIMODE_TX();
 	*pCtrIner_Flag_OE = (~SPI_OE) ; //SPI_switc 允许 
 	mdelay(500);
 	*pCtrOut_Flag_B = Out_Flag_B|SPI_A0;//0x01; // 选择CAN_SPISS
 	mdelay(500);
}
/****************************************************************************
* 名称 : MCP2515_RST
* 功能 : MCP2515 软件复位
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void MCP2515_RST(void)
{
    SPIsend(0xc0);
    udelay(0x7fff);    
    udelay(0x7fff);
}
/****************************************************************************
* 名称 : MCP2515_WRITE_REG
* 功能 : MCP2515 内部控制寄存器写函数
* 入口参数 :addr  内部寄存器地址 dat 写入该地址的数据
* 出口参数 :无
****************************************************************************/
void MCP2515_WRITE_REG(uint8_t addr,uint8_t dat)
{	
 	SPIMenable();           //允许SPI
 	SPIMODE_TX();           //发送模式
 	SPIsend(MCP2515_WRITE );//写命令
 	SPIsend(addr);          //写地址
 	SPIsend(dat);           //写数据
 	udelay(0x7fff);
 	SPIdisable();           //禁止SPI
 	udelay(0x7fff);
}
/****************************************************************************
* 名称 : MCP2515_READ_REG
* 功能 : MCP2515 内部控制寄存器读函数
* 入口参数 :无
* 出口参数 :addrr  要读的内部寄存器地址  *buf 读出的数据 len 为读出的字节数
****************************************************************************/
void MCP2515_READ_REG(uint8_t addrr,uint8_t *buf,uint8_t len)
{
	uint8_t i;
	
	SPIMenable();            //允许SPI
	SPIMODE_TX();            //发送模式 
	SPIsend(MCP2515_READ );  //读命令
	SPIsend(addrr );         //读地址
	SPIMODE_RX();            //接收模式
	
	if(*pSPI_STAT&RXS)    
	{
		buf[0] = *pSPI_RDBR;
	}
	for(i=0;i<len;i++)
	{
		buf[i] = SPIReadByte();
	}
	
	udelay(0x7fff);
	SPIdisable();           // 禁止SPI
	udelay(0x7fff);
}
/****************************************************************************
* 名称 : MCP2515_BitModify
* 功能 : MCP2515 内部控制寄位修改
* 入口参数 :addrr  要修改的内部寄存器地址 Rmask 修改屏蔽 Rdata 修改数据
* 出口参数 :无
****************************************************************************/
void MCP2515_BitModify(uint8_t addrr,uint8_t Rmask,uint8_t Rdata)
{
	SPIMenable();             //允许SPI
	SPIMODE_TX();             //发送模式
	SPIsend(MCP2515_BITMOD);  //发送位修改模式
	SPIsend(addrr);          //写修改寄存器地址
	SPIsend(Rdata);          //写修改数据
	SPIsend(Rmask);           //写修改屏蔽位
	udelay(0x7fff);
	SPIdisable();             //禁止SPI
	udelay(0x7fff);
}
/****************************************************************************
* 名称 : MCP2515_Init
* 功能 : MCP2515 工作初始化
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void MCP2515_Init(void)
{

  	MCP2515_WRITE_REG(CANCTRL,0x86); // 配置模式 1/2 FOSC 	
  	MCP2515_WRITE_REG(BFPCTRL,0x0f);  // 接受引脚控制 ,接收中断
  	MCP2515_WRITE_REG(TXRTSCTRL,0x00);//发送引脚控制 
  	MCP2515_WRITE_REG(CNF3,0x02);
  	MCP2515_WRITE_REG(CNF2,0x89);
  	MCP2515_WRITE_REG(CNF1,0x0b);
  	MCP2515_WRITE_REG(CANCTRL,0x06);// 配置工作模式 1/2 FOSC 0x46 为回环模式
  	//MCP2515_WRITE_REG(CANINTE,0x01);   //TX0 接收中断 允许  
}
/****************************************************************************
* 名称 : MCP2515_TX0
* 功能 : MCP2515_TX0 标识符设置和发送数据的载入
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void MCP2515_TX0(uint8_t *dat)
{	
 	unsigned char i,j = 0x36;

 	MCP2515_WRITE_REG(TXB0SIDH,0x00);// 标识符高8位
 	MCP2515_WRITE_REG(TXB0SIDL,0xa0);// 标识符为 0x01
 	MCP2515_WRITE_REG(TXB0DLC,0x0a);
 	for(i=0;i<8;i++)
 	{
  		MCP2515_WRITE_REG(j,dat[i]);    // 发送的8个数据
  		j++;
 	}
}
/****************************************************************************
* 名称 :MCP2515_RX0_Init
* 功能 :MCP2515_RX0_Init 关闭屏蔽滤波器 滚存禁止 接收所有报文
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void MCP2515_RX0_Init(void)
{
 	MCP2515_WRITE_REG(RXB0CTRL,0x60); //关闭屏蔽滤波器
}
/****************************************************************************
* 名称 :MCP2515_Send_Enable
* 功能 :允许发送缓冲器 1,2,3 发送
* 入口参数 :TXnum 允许发送缓冲器标号
* 出口参数 :无
****************************************************************************/
void MCP2515_Send_Enable(uint8_t TXnum)
{
 	if(TXnum==1)
 	{
  		MCP2515_WRITE_REG(TXB0CTRL,0x08); //缓冲器1 发送允许
 	}
 	if(TXnum==2)
 	{
 	}
 	if(TXnum==3)
 	{
 	}
}
/****************************************************************************
* 名称 :MCP2515_Send_Disable
* 功能 :禁止发送缓冲器 1,2,3 发送
* 入口参数 :TXnum 禁止发送缓冲器标号
* 出口参数 :无
****************************************************************************/
void MCP2515_Send_Disable(uint8_t TXnum)
{
 	if(TXnum==1)
 	{
  		MCP2515_WRITE_REG(TXB0CTRL,0x00); //缓冲器1 发送禁止
 	}
 	if(TXnum==2)
 	{ 
 	}
 	if(TXnum==3)
 	{ 
 	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?