📄 can.c
字号:
#include "can.h"
#include "reg52.h"
void SJAInit(tByte const Reg_acr)
{
MODE = 0x09; //模式寄存器,单验收滤波器,进入复位模式
CDR = 0x88; //时钟分频R,选择增强CAN模式,关闭CLKOUT输出
IER = 0x0d; //中断使能寄存器,开溢出、错误、接收中断
BTR0 = 0x03; //总线定时寄存器
BTR1 = 0xff; //总线定时寄存器二,6MHz晶振,波特率30Kbps
OCR = 0xaa; //输出控制寄存器
ACR0 = Reg_acr; //验收代码ACR0
ACR1 = 0xff; //验收代码ACR1,以下无关
ACR2 = 0xff; //验收代码ACR2
ACR3 = 0xff; //验收代码ACR3
AMR0 = 0x00; //验收屏蔽寄存器AMR0=00H
AMR1 = 0xff; //验收屏蔽寄存器AMR1,以下无关
AMR2 = 0xff; //验收屏蔽寄存器AMR2
AMR3 = 0xff; //验收屏蔽寄存器AMR3
RBSA = 0x00; //接收缓冲器FIFO起始地址为0
TXER = 0x00; //清除发送错误计数器
ECC = 0x00; //清除错误代码捕捉寄存器
MODE = 0x08; //单滤波方式,返回工作方式
}
tByte SJASendData(tByte *Tdata,tByte const DatLen,tByte const TarID,SaID,TxRx)
{
static tByte TempData;
static tByte TempValue;
TempData = SR; //读状态寄存器
P1 = SR;
do //判断是否正在接收正在接收则等待
{
TempData = SR; //TempValue = 1则等待
}while(TempData & Bit(4));
do //判断上次发送是否完成未完成则等待发送完成
{ //TempValue = 0则等待
TempData = SR;
}while(!(TempData & Bit(3)));
do //判断发送缓冲区是否锁定锁定则等待
{ //TempValue = 0则等待
TempData = SR;
}while(!(TempData & Bit(2)));
FIN(0) = TxRx;
ID1 = TarID;
ID2 = SaID;
//开始发送数据,一共8个字节,全部为有效数据
for(TempValue = 0;TempValue<DatLen;TempValue++)
{
DAT1(TempValue) = Tdata[TempValue];
}
CMR = 0x01; //启动SJA1000 发送
return 0;
}
tByte SJARecvData(tByte *Rdata,tByte const DatLen)
{
static tByte TempData;
static tByte TempValue;
TempData = SR; //读状态寄存器
TempValue = (TempData & 0xc3);
if(!TempValue ) //读取总线脱离、错误状态、接收溢出、有数据等位
{
return 1; //总线接收失败推出
}
if(TempData & Bit(7))
{
TempData = IR; //IR中断寄存器,出现总线脱离,读中断寄存器,清除中断位
MODE = 0x08; //推出复位模式,进入工作模式
return 2; //总线接收失败
}
TempData = IR;
if(TempData & Bit(3))
{
CMR = 0x0c; //数据溢出处理,清除数据溢出位,释放接收缓冲区
return 3; //总线接收失败
}
if(!(TempData & Bit(0)))
{
TempValue = ALC; //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
TempValue = ECC;
return 4; //总线接受失败
}
//TempData = FIN; //远程帧处理
if(TempData & Bit(2))
{
CMR = 0x04;
TempValue = ALC; //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
TempValue = ECC;
return 5;
}
for(TempValue = 0;TempValue<DatLen;TempValue++)
{
Rdata[TempValue]= FIN(TempValue);
}
CMR = 0x04;
TempValue = ALC; //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
TempValue = ECC;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -