SJA1000+C51
//-------------------------------------define variable------------------------------------
unsigned char receive_counter = 0;
unsigned char alc = 1;
unsigned char ecc = 1;
/************************************************************************
*函数原型: bit CAN_CREATE_COMMUNATION(void)
*参数说明: 无
*返回值:*
* 0 ; 表示SJA1000接口正常
* 1 ; 表示SJA1000与处理器接口不正常
*
*说明:该函数用于检测CAN控制器的接口是否正常
************************************************************************/
bit CAN_CREATE_COMMUNATION(void)
{
unsigned char temp_data;
bit Flag;
REG_TEST = 0xAA; //写入测试值
temp_data = REG_TEST;
if(temp_data == 0xaa)
{
Flag=0; //读测试正确
}
else
{
Flag=1;
}
if(!Flag)
{
REG_TEST = 0x55; //写入测试值
temp_data = REG_TEST;
if(temp_data == 0x55)
{
Flag=0; //读测试正确
REG_TEST = 0x00;
}
else
{
Flag=1;
}
}
return (Flag);
}
/************************************************************************
*函数原型: bit CAN_ENTRY_RETMODEL(void) *
*参数说明: 无 *
*返回值: *
* 0 ; 表示成功进入复位工作模式 *
* 1 ; 表示不能进入复位工作模式 *
* *
*说明: CAN控制器进入复位工作模式 *
************************************************************************/
bit CAN_ENTRY_RETMODEL(void)
{
bit flag;
unsigned char ErrorCount=20;
unsigned char temp_data = REG_MODE;
while(ErrorCount --)
{
REG_MODE = temp_data|RM_MODE;
temp_data = REG_MODE;
if( (temp_data & RM_MODE) != 0)
{
flag=0;
break;
}
else
{
flag=1;
}
}
return(flag);
}
/************************************************************************
*函数原型: bitCAN_QUIT_RETMODEL(void)
*参数说明: 无
*返回值:
* 0 ; 表示成功退出复位工作模式
* 1 ; 表示不能退出复位工作模式
*说明: CAN控制器退出复位工作模式
***********************************************************************/
bit CAN_QUIT_RETMODEL(void)
{
bit flag;
unsigned char ErrorCount=20;
unsigned char temp_data = REG_MODE;
while(ErrorCount --)
{
REG_MODE = temp_data&0xfe;
temp_data = REG_MODE;
if((temp_data&0x01) == 0)
{
flag=0;
break;
}
else
{
flag=1;
}
}
return(flag);
}
/*********************************************************************************
**函数原型: 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~14,其它的值会返回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的预设值
0x81,0xfa, //;200KBPS的预设值
0x01,0x1c, //;250KBPS的预设值
0x80,0xfa, //;400KBPS的预设值
0x00,0x1c, //;500KBPS的预设值
0x80,0xb6, //;666KBPS的预设值
0x00,0x16, //;800KBPS的预设值
0x00,0x14//;1000KBPS的预设值
};
bit CAN_SET_BANDRATE(unsigned char CAN_ByteRate)
{
bit ErrorFlag =1;
unsigned char temp_data;
unsigned char ErrorCount = 0x20; //32次报错
if(CAN_ByteRate>14)
{
ErrorFlag =1;
}
else{
while(--ErrorCount)
{
REG_BTR0 = SJA_BTR_CODETAB[CAN_ByteRate*2];
REG_BTR1 = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
temp_data = REG_BTR0;
if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2])
{
continue;
}
temp_data = REG_BTR1;
if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2+1])
{
continue;
}
ErrorFlag=0;
break;
}//while结束
}
return ErrorFlag ;
}
/********************
SJA1000C5 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)