📄 mcp2515.c
字号:
#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 + -