📄 sja_pelifunc.c
字号:
if(ReadSJAReg(REG_CAN_ACR1) != acr1)continue;
if(ReadSJAReg(REG_CAN_ACR2) != acr2)continue;
if(ReadSJAReg(REG_CAN_ACR3) != acr3)continue;
ErrorFlag=0;
break;
}
if(ErrorFlag){
status =SJA_SETACR_ERR;
}
return status;
}
}
/*
************************************************************************************************************************
**函数原型: char SJASetAccMask(unsigned char amr0,unsigned char amr1,
** unsigned char amr2,unsigned char amr3
** )
**参数说明: amr0 验收屏蔽寄存器0的设定值
** amr1 验收屏蔽寄存器1的设定值
** amr2 验收屏蔽寄存器2的设定值
** amr3 验收屏蔽寄存器3的设定值
**返回值:
** 0 ; 设置验收屏蔽寄存器成功
** SJA_SETAMR_ERR ; 设置验收屏蔽寄存器错
** SJA_NOTRSTMODE ; sja1000不在复位模式
**
**说明: 该函数用于设定报文滤波的验收屏蔽寄存器
************************************************************************************************************************
*/
char SJASetAccMask(unsigned char amr0,unsigned char amr1,
unsigned char amr2,unsigned char amr3
)
{
char status=0;
bit ErrorFlag=1;
unsigned char ErrorCount =0x20; //32次,报错
if(SJATestRstMode()){ //处于工作模式
status = SJA_NOTRSTMODE;
}
else{
while(--ErrorCount){
WriteSJAReg(REG_CAN_AMR0,amr0);
WriteSJAReg(REG_CAN_AMR1,amr1);
WriteSJAReg(REG_CAN_AMR2,amr2);
WriteSJAReg(REG_CAN_AMR3,amr3);
if(ReadSJAReg(REG_CAN_AMR0) != amr0)continue;
if(ReadSJAReg(REG_CAN_AMR1) != amr1)continue;
if(ReadSJAReg(REG_CAN_AMR2) != amr2)continue;
if(ReadSJAReg(REG_CAN_AMR3) != amr3)continue;
ErrorFlag=0;
break;
}
if(ErrorFlag){
status =SJA_SETAMR_ERR;
}
return status;
}
}
/*
************************************************************************************************************************
**函数原型: char SJASetBandRateStandard(unsigned char BandRateSize)
**参数说明: BandRateSize 标准常用波特率(Kbps)
** 0 5
** 1 10
** 2 20
** 3 40
** 4 50
** 5 80
** 6 100
** 7 125
** 8 200
** 9 250
** 10 400
** 11 500
** 12 666
** 13 800
** 14 1000
**返回值:
** 0 ; 设置总线定时器成功
** SJA_SETBTR_ERR ; 设置总线定时器错
** SJA_NOBTRSIZE ;波特率不能设为此值
**
**说明: 该函数用于设定在系统晶体为16MHZ时,常用的标准波特率的值。
** 参数BandRateSize只能为0~12,其它的值会返回SJA_NOBTRSIZE错误
** 本函数只能用于复位模式
************************************************************************************************************************
*/
unsigned char code SJA_BTR_CODETAB[]={
0xbf,0xff, //;5KBPS的预设值
0x67,0x2f, //;10KBPS的预设值
0x53,0x2F, //;20KBPS的预设值
0x87,0xFF, //;40KBPS的预设值
0x47,0x2F, //;50KBPS的预设值
0x83,0xFF, //;80KBPS的预设值
0x43,0x2f, //;100KBPS的预设值
0x03,0x1c, //;125KBPS的预设值
//0x3f,0xff,
0x81,0xfa, //;200KBPS的预设值
0x01,0x1c, //;250KBPS的预设值
0x80,0xfa, //;400KBPS的预设值
0x00,0x1c, //;500KBPS的预设值
0x80,0xb6, //;666KBPS的预设值
0x00,0x16, //;800KBPS的预设值
0x00,0x14 //;1000KBPS的预设值
};
char SJASetBandRateStandard(unsigned char BandRateSize)
{
char status=0;
bit ErrorFlag =1;
unsigned char ErrorCount = 0x20; //32次报错
if(BandRateSize>14){
status = SJA_NOBTRSIZE;
}
else{
while(--ErrorCount){
WriteSJAReg(REG_CAN_BTR0,SJA_BTR_CODETAB[BandRateSize*2]);
WriteSJAReg(REG_CAN_BTR1,SJA_BTR_CODETAB[BandRateSize*2+1]);
if(ReadSJAReg(REG_CAN_BTR0) != SJA_BTR_CODETAB[BandRateSize*2])continue;
if(ReadSJAReg(REG_CAN_BTR1) != SJA_BTR_CODETAB[BandRateSize*2+1])continue;
ErrorFlag=0;
break;
}//while结束
if(ErrorFlag){
status =SJA_SETBTR_ERR;
}
}
return status;
}
/*
************************************************************************************************************************
**函数原型: char SJASystemPrgCMD(unsigned char cmd)
**参数说明: cmd SJA1000 的PeliCAN 工作方式命令字
**返回值:
** 0 ; 表示命令执行成功
** SJA_IMPCMD_ERR ; 表示命令执行出错
** SJA_NOTHISCMD ; 没有此命令
**
**说明: 该函数用于执行sja1000的命令
************************************************************************************************************************
*/
char SJASystemPrgCMD(unsigned char cmd)
{
char status=0;
switch(cmd){
case 0x01:
case 0x03:
WriteSJAReg(REG_CAN_CMR,cmd);
break;
case 0x02:
if((ReadSJAReg(REG_CAN_SR)&TBS_BIT) == 0){
status = SJA_IMPCMD_ERR;
}
break;
case 0x04:
WriteSJAReg(REG_CAN_CMR,cmd);
break;
case 0x08:
WriteSJAReg(REG_CAN_CMR,cmd);
break;
case 0x10:
case 0x12:
WriteSJAReg(REG_CAN_CMR,cmd);
break;
default:
status = SJA_NOTHISCMD;
break;
}
return status;
}
/*
************************************************************************************************************************
**函数原型: char SJASendData(unsigned char *databuf,
** unsigned char cmd
** )
**参数说明: databuf 存放要发送到总线的特定帧格式的数据的缓冲区首地址
** cmd sj1000发送命令
**返回值:
** 0 ; 表示将数据成功的发送到can总线
** SJA_TXBUFLOCK ; sja1000发送缓冲区锁定
** SJA_WTXBUF_ERR ; 表示写发送缓冲区失败
** SJA_IMPCMD_ERR ; 表示命令执行出错
**
**说明: 本函数用于向can总线发送数据
************************************************************************************************************************
*/
char SJASendData(unsigned char *databuf,
unsigned char cmd
)
{
char status=0;
unsigned char len;
unsigned char temp = (*databuf&0x0f);
if(temp>8)temp=8;
if( (ReadSJAReg(REG_CAN_SR)&TCS_BIT) ==0){//sja1000发送缓冲区锁定
status = SJA_TXBUFLOCK;
}
else if( (ReadSJAReg(REG_CAN_SR)&RS_BIT) !=0){//正在接收
status = SJA_WTXBUF_ERR;
}
else{
switch(*databuf&0xC0) {
case 0x00://标准帧、数据帧
len=STD_FRAMEID_LENTH+temp+1;
WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
status=SJASystemPrgCMD(cmd);
break;
case 0x40://标准帧、远程帧
len=STD_FRAMEID_LENTH+1;
WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
status=SJASystemPrgCMD(cmd);
break;
case 0x80://扩展帧、数据帧
len=EXT_FRAMEID_LENTH+temp+1;
WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
status=SJASystemPrgCMD(cmd);
break;
case 0xC0://扩展帧、远程帧
len=EXT_FRAMEID_LENTH+1;
WriteSJARegBlock(REG_CAN_TXFMINFO,databuf,len);
status=SJASystemPrgCMD(cmd);
break;
default:status = SJA_WTXBUF_ERR;
break;
}
}
return status;
}
/*
************************************************************************************************************************
**函数原型: char SJARcvData(unsigned char *databuf)
**参数说明: databuf 存放要接收数据缓冲区首地址
**
**返回值:
** 0 ; 表示将读取数据成功
** SJA_RXBUFEMPTY ; sja1000接收缓冲区为空
** SJA_RRXVUF_ERR ; sja1000接收数据错
**
**说明: 本函数用于接收can总线数据
************************************************************************************************************************
*/
char SJARcvData(unsigned char *databuf)
{
char status=0;
unsigned char len;
unsigned char temp;
*databuf= ReadSJAReg(REG_CAN_RXFMINFO);
temp = (*databuf&0x0f);
if(temp>8)temp=8;
if( (ReadSJAReg(REG_CAN_SR)&RBS_BIT ) ==0){//sja1000接收缓冲区为空
status = SJA_RXBUFEMPTY ;
}
else{
switch(*databuf&0xC0) {
case 0x00://标准帧、数据帧
len=STD_FRAMEID_LENTH+temp;
ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,len);
status= SJASystemPrgCMD(RELEASE_RX_BUF);
break;
case 0x40://标准帧、远程帧
ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,STD_FRAMEID_LENTH);
status= SJASystemPrgCMD(RELEASE_RX_BUF);
break;
case 0x80://扩展帧、数据帧
len=EXT_FRAMEID_LENTH+temp;
ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,len);
status=SJASystemPrgCMD(RELEASE_RX_BUF);
break;
case 0xC0://扩展帧、远程帧
ReadSJARegBlock(REG_CAN_RXBUF1,databuf+1,EXT_FRAMEID_LENTH);
status= SJASystemPrgCMD(RELEASE_RX_BUF);
break;
default:status = SJA_RRXVUF_ERR;
break;
}
}
return status;
}
/*
************************************************************************************************************************
**函数原型: unsigned char ReadALCReg(void)
**参数说明: 无
**返回值: 错误仲裁寄存器(alc)的内容
**
**说明: 该函数用于读取错误仲裁寄存器(alc)的内容
************************************************************************************************************************
*/
unsigned char ReadALCReg(void)
{
return(ReadSJAReg(REG_CAN_ALC));
}
/*
************************************************************************************************************************
**函数原型: unsigned char ReadECCReg(void)
**参数说明: 无
**返回值: 错误捕捉寄存器(ecc)的内容
**
**说明: 该函数用于读取错误捕捉寄存器(ecc)的内容
************************************************************************************************************************
*/
unsigned char ReadECCReg(void)
{
return(ReadSJAReg(REG_CAN_ECC));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -