微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SJA1000+C51

SJA1000+C51

时间:11-13 来源:互联网 点击:

*****************************************************
*函数原型:CAN_SET_OBJECT
*参数说明:
* CAN_ACR0-3:存放验收代码寄存器(ACR)的参数设置
* CAN_AMR0-3:存放接收屏蔽寄存器(AMR)的参数设置
*返回值:
* 0 ;通信对象设置成功
* 1 ;通信对象设置失败
*说明:设置CAN节点的通讯对象,允许接收的报文ID号
* 允许接收的报文,是由AMR和ACR共同决定的.
* 满足以下条件的ID号的报文才可以被接收
*[(ID.29-ID.0)≡(AC.29-AC.0)]||(AM.29-AM.0)≡11111111
* 该子程序只能用于复位模式 *
*************************************************************************/
bit CAN_SET_OBJECT(unsigned char CAN_ACR0,unsigned char CAN_ACR1,
unsigned char CAN_ACR2,unsigned char CAN_ACR3,
unsigned char CAN_AMR0,unsigned char CAN_AMR1,
unsigned char CAN_AMR2,unsigned char CAN_AMR3)
{
bit ErrorFlag =1;
unsigned char temp_data;
unsigned char ErrorCount = 0x20; //32次报错
while(ErrorCount--)
{
REG_ACR0 = CAN_ACR0;
REG_ACR1 = CAN_ACR1;
REG_ACR2 = CAN_ACR2;
REG_ACR3 = CAN_ACR3;
REG_AMR0 = CAN_AMR0;
REG_AMR1 = CAN_AMR1;
REG_AMR2 = CAN_AMR2;
REG_AMR3 = CAN_AMR3;

temp_data = REG_ACR0;
if(temp_data!= CAN_ACR0) //校验写入值
{
continue;
}
temp_data = REG_ACR1;
if(temp_data!= CAN_ACR1) //校验写入值
{
continue;
}
temp_data = REG_ACR2;
if(temp_data != CAN_ACR2) //校验写入值
{
continue;
}
temp_data = REG_ACR3;
if(temp_data != CAN_ACR3) //校验写入值
{
continue;
}
temp_data = REG_AMR0;
if(temp_data != CAN_AMR0) //校验写入值
{
continue;
}
temp_data = REG_AMR1;
if(temp_data != CAN_AMR1) //校验写入值
{
continue;
}
temp_data = REG_AMR2;
if(temp_data != CAN_AMR2) //校验写入值
{
continue;
}
temp_data = REG_AMR3;
if(temp_data != CAN_AMR3) //校验写入值
{
continue;
}
ErrorFlag =0;
break;
}
return ErrorFlag;
}
/************************************************************************
*函数原型: bit CAN_SET_OUTCLK(unsigned char Out_Control,unsigned char Clock_Out);
*参数说明:
* Out_Control:存放输出控制寄存器 (OCR)的参数设置
* Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置
*
*返回值:
* 0 ;设置成功
* 1 ;设置失败
*
*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
************************************************************************/
bit CAN_SET_OUTCLK (unsigned char Out_Control,unsigned char Clock_Out)
{
bit ErrorFlag =1;
unsigned char temp_data;
unsigned char ErrorCount = 0x20; //32次报错
while(ErrorCount--)
{
REG_OCR = Out_Control;
REG_CDR = Clock_Out;
temp_data = REG_OCR;
if(temp_data != Out_Control) //校验写入值
{
continue;
}
temp_data = REG_CDR;
if(temp_data != Clock_Out) //校验写入值
{
continue;
}
ErrorFlag =0;
break;
}
return ErrorFlag;
}
/************************************************************************
*函数原型: bitSJA_Init(void)
*参数说明: 无
*返回值:
* 0 ; 表示初始化CAN成功
* 1 ; 表示不能初始化CAN
* 不同的要求需要修改
*说明: 初始化CAN控制器波特率 分频和输出方式 ACK AMR等
***********************************************************************/
void SJA_Init(void)
{
unsigned char temp_data;
bit flag;
delay(125);
SJARst = 0;
delay(125);
SJARst = 1;
delay(125);

//write 0xaa 0x55 to REG_TEST
flag = CAN_CREATE_COMMUNATION();
if(flag)
{
ERR_flag = hard_ERR;
goto EXIT;
}

flag = CAN_ENTRY_RETMODEL();
if(flag) //复位模式中
{
ERR_flag = Init_ERR;
goto EXIT;
}

flag = CAN_SET_BANDRATE(ByteRate_500k);
if(flag)
{
ERR_flag = Init_ERR;
goto EXIT;
}
flag = CAN_SET_OUTCLK(0x1a,0xc8);
if(flag) //输出正常模式 推免方式 TX0
{ //CDR.7=1 pelican模式 CDR.6=1只有RX0被激活 关clockout
ERR_flag = Init_ERR;
goto EXIT;
}

REG_RBSA = 0x00;

//ACR and AMR
flag = CAN_SET_OBJECT(0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00);
if(flag)
{
ERR_flag = Init_ERR;
goto EXIT;
}

REG_IR_ABLE = 0x89; //中断使能

//REG_MODE = 0x0c; //mod.2=1进入自接收模式 mod.3选择单个验收滤波器(32bit)
REG_MODE = AFM_MODE;
REG_MODE = AFM_MODE; //mod.2=0正常模式 mod.3选择单个验收滤波器(32bit)
flag = CAN_QUIT_RETMODEL();
if(flag)
{
ERR_flag = Init_ERR;
goto EXIT;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top