📄 sja1000_peli.c
字号:
#include <AT89x51.h>
#include "SJA1000_PELI.h"
bit g_TiFlag=0;
bit g_RiFlag=0;
unsigned char xdata *SJA_BASE_ADDR = 0x0000;
//写数据
void SJARegWrite(unsigned char regAddr,unsigned char setData)
{
*(SJA_BASE_ADDR+regAddr) = setData;
}
//读数据
unsigned char SJARegRead(unsigned char regAddr)
{
unsigned char tempData;
tempData = *(SJA_BASE_ADDR+regAddr);
return tempData;
}
//寄存器自测试
bit SJARegSelfTest(void)
{
bit flag;
SJARegWrite(9,0xaa);
if (SJARegRead(9) == 0xaa)
{
flag = 0;
}
else
{
flag = 1;
}
if (!flag)
{
SJARegWrite(9,0x55);
if (SJARegRead(9) == 0x55)
{
flag = 0;
}
else
{
flag = 1;
}
}
return flag ;
}
//进入复位模式
bit SJAEnterRstMode(void)
{
bit flag;
unsigned char tempData;
tempData = SJARegRead(0);
tempData = tempData|0x01;
SJARegWrite(0,tempData);
if((SJARegRead(0)&0x01)==1)
{
flag = 0;
}
else
{
flag = 1;
}
return flag;
}
//退出复位模式
bit SJAEnterWorkMode(void)
{
bit flag;
unsigned char tempData;
tempData = SJARegRead(0);
tempData = tempData&0xfe;
SJARegWrite(0,tempData);
if((SJARegRead(0)&0x01)==0)
{
flag = 0;
}
else
{
flag = 1;
}
return flag;
}
//设置时钟分频,输出控制寄存器
bit SJAClkOut(unsigned char OCR,unsigned char CDR)
{
bit flag;
SJARegWrite(8,OCR);
SJARegWrite(31,CDR);
if((SJARegRead(8)==OCR)&(SJARegRead(31)==CDR))
{
flag = 0;
}
else
{
flag = 1;
}
return flag;
}
//中断使能设置
bit SJASetInterrupt(unsigned char ENA_INT)
{
bit flag;
SJARegWrite(4,ENA_INT);
if (SJARegRead(4) == ENA_INT)
{
flag = 0;
}
else
{
flag = 1;
}
return flag;
}
//波特率设置
bit SJASetBaudRate(unsigned char BTR0,unsigned char BTR1)
{
bit flag;
SJARegWrite(6,BTR0);
SJARegWrite(7,BTR1);
if((SJARegRead(6)==BTR0)&(SJARegRead(7)==BTR1))
{
flag = 0;
}
else
{
flag = 1;
}
return flag;
}
//验收代码寄存器设置
bit SJASetACR( unsigned char ACR0,
unsigned char ACR1,
unsigned char ACR2,
unsigned char ACR3 )
{
bit flag;
SJARegWrite(16,ACR0);
SJARegWrite(17,ACR1);
SJARegWrite(18,ACR2);
SJARegWrite(19,ACR3);
if ((SJARegRead(16) ==ACR0)&(SJARegRead(17) ==ACR1)
&(SJARegRead(18) ==ACR2)&(SJARegRead(19) ==ACR3))
{
flag = 0;
}
else
{
flag = 1;
}
return flag;
}
//屏蔽寄存器设置
bit SJASetAMR( unsigned char AMR0,
unsigned char AMR1,
unsigned char AMR2,
unsigned char AMR3 )
{
bit flag;
SJARegWrite(20,AMR0);
SJARegWrite(21,AMR1);
SJARegWrite(22,AMR2);
SJARegWrite(23,AMR3);
if ((SJARegRead(20) ==AMR0)&(SJARegRead(21) ==AMR1)
&(SJARegRead(22) ==AMR2)&(SJARegRead(23) ==AMR3))
{
flag = 0;
}
else
{
flag = 1;
}
return flag;
}
//SJA初始化
void SJAInit(void)
{
bit flag;
flag = SJARegSelfTest(); //SJA自测试
while(flag)
{
flag = SJARegSelfTest();
}
flag = SJAEnterRstMode(); //进行复位模式
while(flag)
{
flag = SJAEnterRstMode();
}
flag = SJAClkOut(SJA_OCR,SJA_CDR); //时钟分频、输出控制设置
while(flag)
{
flag = SJAClkOut(SJA_OCR,SJA_CDR);
}
/////////////////////////////////////////////////////
SJARegWrite(0,SJARegRead(0)|0x0c); //设置为单滤波器,并使用自测试模式
flag = SJASetACR(SJA_ACR0,SJA_ACR1,SJA_ACR2,SJA_ACR3); //设置验收代码寄存器
while(flag)
{
flag = SJASetACR(SJA_ACR0,SJA_ACR1,SJA_ACR2,SJA_ACR3);
}
flag = SJASetAMR(SJA_AMR0,SJA_AMR1,SJA_AMR2,SJA_AMR3); //设置屏蔽寄存器
while(flag)
{
flag = SJASetAMR(SJA_AMR0,SJA_AMR1,SJA_AMR2,SJA_AMR3);
}
/////////////////////////////////////////////////////
flag = SJASetBaudRate(SJA_BTR0,SJA_BTR1); //波特率设置
while(flag)
{
flag = SJASetBaudRate(SJA_BTR0,SJA_BTR1);
}
flag = SJAEnterWorkMode(); //进入工作模式
while(flag)
{
flag = SJAEnterWorkMode();
}
flag = SJASetInterrupt(SJA_INT); //中断使能
while(flag)
{
flag = SJASetInterrupt(SJA_INT);
}
}
//发送函数
bit SJASendData(unsigned char *SendDataBuf)
{
bit flag = 1;
unsigned char len,i;
if ((SJARegRead(2)&0x10) ==0) //是否为接收状态?不是则下一步
{
if ((SJARegRead(2)&0x04)!=0) //发送队列是否为空?是则下一步
{
if ((SendDataBuf[0]&0x80 )==0) //为0,标准帧
{
if ((SendDataBuf[0]&0x40)==0) //为0,数据帧
{
len = SendDataBuf[0]&0x0f;
if (len>=8)
{
len = 8;
}
len+=3;
}
else
{
len = 3;
}
for (i=0; i<len; i++)
{
SJARegWrite(16+i,SendDataBuf[i]);
}
flag = 0;
}
if ((SendDataBuf[0]&0x80)!=0) //为1,扩展帧
{
if ((SendDataBuf[0]&0x40)==0) //为0,数据帧
{
len = SendDataBuf[0]&0x0f;
if (len>=8)
{
len = 8;
}
len+=5;
}
else
{
len = 5;
}
for (i=0; i<len; i++)
{
SJARegWrite(16+i,SendDataBuf[i]);
}
flag = 0;
}
}
}
return flag;
}
//接收函数
bit SJAReceData(unsigned char *ReceDataBuf)
{
bit flag=1;
unsigned char len,i;
if ((SJARegRead(2)&0x01)!=0) //接收有可用信息
{
if ((ReceDataBuf[0]&0x80)==0) //为0,标准帧
{
if((ReceDataBuf[0]&0x40)==0) //为0,数据帧
{
len = ReceDataBuf[0]&0x0f;
if (len>=8)
{
len = 8;
}
len+=3;
}
else
{
len = 3;
}
for (i=0; i<len; i++)
{
ReceDataBuf[i] = SJARegRead(16+i);
}
flag = 0;
}
if ((ReceDataBuf[0]&0x80)!=0) //为1,扩展帧
{
if((ReceDataBuf[0]&0x40)==0) //为0,数据帧
{
len = ReceDataBuf[0]&0x0f;
if (len>=8)
{
len = 8;
}
len+=5;
}
else
{
len = 5;
}
for (i=0; i<len; i++)
{
ReceDataBuf[i] = SJARegRead(16+i);
}
flag = 0;
}
}
return flag;
}
//中断服务程序
void SJAInterruput(void) interrupt 0 using 1
{
unsigned char tempData;
tempData = SJARegRead(3);
if ((tempData&0x02)!=0)
{
g_TiFlag = 1;
}
if ((tempData&0x01)!=0)
{
g_RiFlag = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -