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

📄 mcp2515.c

📁 一个在三星S3C44B0 ARM 上实现的带SPI接口的MCP2515 CAN总线控制芯片的 CAN 读写程序!
💻 C
📖 第 1 页 / 共 5 页
字号:

#include "44b.h"
#include "..\INC\MCP2515.h"
#include "..\INC\lcd.h"
#include "44blib.h"
#include "audio.h"

/********************** MCP2515 Pin *********************************/
#define MCP2515_CS				0x4		//EXIO2

/********************** MCP2515 指令 *********************************/
#define MCP2515INSTR_RESET		0xC0    //复位指令
#define MCP2515INSTR_READ		0x03    //读  指令
#define MCP2515INSTR_WRITE		0x02    //写  指令
#define MCP2515INSTR_RTS		0x80	//发送请求指令
#define MCP2515INSTR_RDSTAT	    0xA0	//读MCP2515状态指令
#define MCP2515INSTR_BITMDFY	0x05	//位修改

/*********************SIO管脚************************/
#define SPI_SIOCLK    	0x8000      //GPC15 
#define SPI_SIORxD		0x0800		//GPC11
#define SPI_SIOTxD		0x2000		//GPC13
#define SPI_SIOCLK_non	0x7FFF		//CLK置低
#define SPI_SIOTxD_non	0xF7FF		//TXD管脚置低


unsigned char err_f[50]     = {0};
unsigned char err_count[50] = {0};
int sos[50];

extern unsigned char n_RxBuffer;
unsigned short       RX_B[256]    = {0};
unsigned char        data_len[64] = {0};
extern	U8 				rxRTR; 
extern	U8 				isExt;
extern	unsigned short PLAY_BUF1[8];
extern	unsigned short PLAY_BUF2[8];

//延时>100ns
void Delayns(void)
{
  //	int j;	
  //	j=1;
}


/********************************************************************/
/*                            SIO 读写操作                         */
/********************************************************************/


/******************************************/
/*函数名称:Init_SIO                     */
/*函数功能: ARM SIO初始化                 */
/*          SIOTxD->GBF5                  */
/*          SIORDY->GBF6                  */
/*          SIORxd->GBF7                  */
/*          SIOCLK->GBF8                  */
/*入口参数: 无              */
/*返回值  : 无                            */
/******************************************/
void Init_SIO(void)
{
	rPCONF = (rPCONF & 0x3FF)|(3<<10)|(3<<13)|(3<<16)|(3<<19);
	                                    //011 011 011 011 00 00 00 00 00
	                                    //设置GPF0(IICSCL),GPF1(IICSDA),GPF2(),GPF3(),GPF4() 为输入模式
	                                    //设置GPF5(SIOTXD) 为SIOTxD ,GPF6(IISDO) 为SIORDY, GPF7(SIORXD) 为SIORxD, GPF8(SIOCLK) 为SIOCLK
	rPUPF  = (rPUPF & 0x1F)|(15<<5);    //0 1010 0000
	                                    //允许GPF8(SIOCLK),GPF6(IISDO),GPF4,GPF3,GPF2,GPF1,GPF0 接上拉
	
	rSIOCON = 0x21;                     //0010 0001
	                                    //内部时钟,MSB模式,发送\接收模式,时钟下降沿接收或者发送,移位操作为自动运行模式,使能SIO中断
	
    //	rINTMSK &= ~(BIT_GLOBAL|BIT_SIO);
	
	rSBRDR  = 15;             //波特率1Mbps   rSBRDR=31   rIVTCNT =15   //波特率分频器 波特率=MCLK/2/(预分频值+1)
	rIVTCNT = 7;              //波特率2Mbps   rSBRDR=15   rIVTCNT =7
}


/******************************************/
/*函数名称:SendSIOData                  */
/*函数功能: 向 SIOTxD 发送数据            */
/*入口参数: sio_data : 要发送的数据    */
/*返回值  : 无                            */
/******************************************/
void SendSIOData(unsigned char sio_data)
{
	rI_ISPC |= BIT_SIO;              //BIT_SIO = 0x01<<4 = 0x10; 清空挂起的 ISO 中断

	rSIODAT  = sio_data;
	rSIOCON |= 0x08;                 //选用外部时钟做为 SIO 移位时钟

	while(!(rINTPND & BIT_SIO));     //等待数据发送完成,查询方式
	rI_ISPC |= BIT_SIO;              //清空挂起的 ISO 中断
}



/******************************************/
/*函数名称:ReadSIOData                  */
/*函数功能: 从 SIORxD 读取数据            */
/*入口参数: 无                         */
/*返回值  : 从 SIO 读取的数据             */
/******************************************/
unsigned char ReadSIOData()
{
	 //while(rSIOCON&SIO_START);    //等待发送
	return rSIODAT;
}


/*****************************************/
/*                                       */
/*     sio管脚作为普通IO模拟SPI通信      */
/*                                       */
/*****************************************/

/******************************************/
/*函数名称:Init_SIO                     */
/*函数功能: SIO初始化                     */
/*入口参数: 无              */
/*返回值  : 无                            */
/******************************************/
/*
void Init_SIO(void)
{
	rPDATC = 0x8000;                                 //10000 0000 0000 0000
	                                                 //置位GPC15
	rPCONC = (rPCONC & 0x333FFFFF)|(1<<30)|(1<<26);  //设置GPC15,GPC13 为输出模式
	
	rPUPC &= 0x57FF;                                 //允许GPC15,GPC13,GPC12 上拉
}
*/


/******************************************/
/*函数名称:SendSIOData                  */
/*函数功能: 从SIO发送数据                 */
/*入口参数: sio_data : 要发送的数据    */
/*返回值  : 无                            */
/******************************************/
/*I/O模拟SPI
void SendSIOData(unsigned char sio_data)
{
	int i;	
//	int rPDATC_bak;
//	int rPDATC_bak_non;
	
	unsigned char SIOSEND_TEMP;
	SIOSEND_TEMP=sio_data;
		
	for (i=7;i>=0;i--)
	{
		rPDATC &= ~SPI_SIOCLK;              //SIOCLK->0  SPI_SIOCLK = 0x8000
		if (SIOSEND_TEMP&(1<<i))
		{
			rPDATC |= SPI_SIOTxD;           //SPI_SIOTxD = 0x2000  置 SIOTxD 为1;
		//	Delayns();
		}                                   //延时大于180ns
		else                                
		{
			rPDATC &= ~SPI_SIOTxD;          //置 SIOTxD 为0
		//	Delayns();
		}
			
		rPDATC |= SPI_SIOCLK;     //SIOCLK->1
		
	    //	Delayns();
	}	
    //	Delay60ns(1);	
}
*/

/******************************************/
/*函数名称:ReadSIOData                  */
/*函数功能: 从 SIO 读取数据               */
/*入口参数: 无                         */
/*返回值  : 从 SIO 读取的数据             */
/******************************************/
/*I/O模拟SPI
unsigned char ReadSIOData()
{	
	int j;
	unsigned char SPI_RxDATA;
	SPI_RxDATA = 0;	
	
	for (j=7;j>=0;j--)
	{
		rPDATC &= ~SPI_SIOCLK;    //SIOCLK->0		
	//	Delayns();
	
		if (rPDATC & SPI_SIORxD)
			SPI_RxDATA |= (1<<j);
			
		rPDATC |= SPI_SIOCLK;     //SIOCLK->1
		
	//	Delayns();
	
	}
	return SPI_RxDATA;
}
*/


/********************************************************************/
/*                   MCP2515 操作                                   */
/********************************************************************/

/******************************************/
/*函数名称:MCP2515_Enable                */
/*函数功能: 使能MCP2515,让其开始工作      */
/*          MCP2515_nCS->GPB5             */
/*入口参数: 无              */
/*返回值  : 无                            */
/******************************************/
void MCP2515_Enable(void)
{
	rPDATB = rPDATB & 0xFDF;         //1111 1101 1111  
	                                 //置GPB5 = nCS2510 = 0: 选中MCP2515
	Delayns();                       //延时>100ns
}


/******************************************/
/*函数名称:MCP2515_Disable               */
/*函数功能: 禁止MCP2515,让其停止工作      */
/*          MCP2515_nCS->GPB5             */
/*入口参数: 无              */
/*返回值  : 无                            */
/******************************************/
void MCP2515_Disable(void)
{
//	rPDATC &= ~SPI_SIOCLK;           //SIOCLK->0    遵循0,0模式时序
	rPDATB |= 0x20;                  //0010 0000    置GPB5 = nCS2510 = 1: 禁止MCP2515   
	Delayns();
//	rPDATC |= SPI_SIOCLK;            //SIOCLK->1
///	Delayns();			             //延时>100ns
//	rPDATC &= ~SPI_SIOCLK;           //SIOCLK->0    遵循0,0模式时序
	
}


/*************************************************/
/*函数名称:MCP2515_Reset                       */
/*函数功能: MCP2515复位                          */
/*入口参数: 无                                 */
/*返回值  : 无                                   */
/*************************************************/
void MCP2515_Reset()
{
	MCP2515_Enable();                  //MCP2515 Enable
	
	SendSIOData(MCP2515INSTR_RESET);   //发送复位指令

	MCP2515_Disable();                 //MCP2515 Disable
}


/****************************************************************/
/*函数名称:MCP2515_ReadStatus                                 */
/*函数功能: 读取MCP2515状态                                     */
/*入口参数: 无                                                  */
/*返回值  : 返回CANINTF 寄存器的值(包含各种中断源的中断标志位)  */
/*          即MCP2515 有关发送和接收功能的状态           */
/****************************************************************/
unsigned char MCP2515_ReadStatus(void)
{
	unsigned char result;

	MCP2515_Enable();                      //MCP2515 Enable

	SendSIOData(MCP2515INSTR_RDSTAT);      //发送读MCP2515状态指令

	SendSIOData(0);                        //
	result = ReadSIOData();                //返回CANINTF 寄存器的值

	MCP2515_Disable();                     //MCP2515 Disable

	return result;
}


/*******************************************************************/
/*函数名称:MCP2515_Write                                         */
/*函数功能: 发送数据到 MCP2515 的发送寄存器,等待发送               */
/*入口参数: 1.address : 发送寄存器地址                             */
/*          2.value   : 待发送的数据                             */
/*          MCP2515 有三个发送寄存器 地址分别是: 0x30,0x40,0x50    */
/*返回值  : 无                                                     */
/*******************************************************************/
void MCP2515_Write (unsigned char address, unsigned char value)
{
	MCP2515_Enable();                  //MCP2515 Enable

	SendSIOData(MCP2515INSTR_WRITE);   //发送写指令
	SendSIOData(address);              //写 发送寄存器地址
	SendSIOData(value);                //写 要装入寄存器中的数据

	MCP2515_Disable();                 //MCP2515 disenable
}


/***********************************************************/
/*函数名称:MCP2515_Read                                  */
/*函数功能: 读取MCP2515 接收寄存器的数据                   */
/*入口参数: address : 接收寄存器的地址                     */
/*          MCP2515 有两个接收寄存器 地址分别是:0x60,0x70  */
/*返回值  : 从MCP2515 接收寄存器中读取的数据               */
/***********************************************************/
unsigned char MCP2515_Read(unsigned char address)
{
	unsigned char result;

	MCP2515_Enable();                     //MCP2515 Enable

	SendSIOData(MCP2515INSTR_READ);       //发送读指令
	SendSIOData(address);                 //发送要读取的接收寄存器的地址

	SendSIOData(0);                       //移位时钟
	result = ReadSIOData();               //读取接收寄存器中的数据

	MCP2515_Disable();                    //MCP2515 Disable

	return result;
}



/**********************************************************************/
/*函数名称:MCP2515_READ_RXBUFF                                      */
/*函数功能: 读取RX缓冲区命令                                          */
/*入口参数:	:read_rxbuff  各位说明如下:                               */
/*           BIT0:buff0还是buff1; BIT1:是否读取标识符               */
/*返回值  : 无                                                        */
/**********************************************************************/
void MCP2515_READ_RXBUFF (unsigned char read_rxbuff)
{
	switch (read_rxbuff)
	{	
		case 0x00:
            // MCP2515_Enable();
			SendSIOData(0x92);
            // MCP2515_Disable();
			break;
			

⌨️ 快捷键说明

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