📄 sja1000_peli.c
字号:
SJA_ADDR = REG_AMR3;
SJA_DATA = PCAN_AMR[3]; //写入参数
SJA_ADDR = REG_AMR3;
ucTempData = SJA_DATA;
if(ucTempData != PCAN_AMR[3]) //校验写入值
{
return 0;
}
return 1;
}
/************************************************************************
;*函数原型: int sja_set_outclock (unsigned char Out_Control, *
unsigned char Clock_Out); *
;*参数说明: *
* Out_Control:存放输出控制寄存器 (OC) 的参数设置 *
* Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置 *
* *
;*返回值: *
;* 1 ;设置成功 *
;* 0 ;设置失败 *
;* *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
;************************************************************************/
int sja_set_outclock (unsigned char Out_Control,
unsigned char Clock_Out)
{
unsigned char ucTempData;
SJA_ADDR = REG_OCR;
SJA_DATA = Out_Control; //写入参数
SJA_ADDR = REG_OCR;
ucTempData = SJA_DATA;
if(ucTempData != Out_Control) //校验写入值
{
return 0;
}
SJA_ADDR = REG_CDR;
SJA_DATA = Clock_Out; //写入参数
SJA_ADDR = REG_CDR;
ucTempData = SJA_DATA;
if(ucTempData != Clock_Out) //校验写入值
{
return 0;
}
return 1;
}
/************************************************************************
*函数原型: int sja_write_data(unsigned char *SendDataBuf) *
*参数说明: 特定帧格式的数据 *
*返回值: *
* 1 ; 表示将数据成功的送至发送缓冲区 *
* 0 ; 表示上一次的数据正在发送, *
* ; 表示发送缓冲区被锁定,不能写入数据 *
* ; 表示写入数据错误 *
*说明: 将待发送特定帧格式的数据,送入SJA1000发送缓存区中,然后启动 *
* SJA1000发送。 *
* 特定帧格式为:第1个字节存放帧信息,然后是2个(扩展帧是4个)字节的 *
* 标识码,然后是8个字节的数据区 *
* *
*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 *
************************************************************************/
int sja_write_data(unsigned char *SendDataBuf)
{
int i;
unsigned char ucTempCount,ucTempData;
SJA_ADDR = REG_STATUS;
ucTempData = SJA_DATA;
if((ucTempData&0x08) == 0)//判断上次发送是否完成
{
return 0;
}
if((ucTempData&0x04) == 0)//判断发送缓冲区是否锁定
{
return 0;
}
//判断RTR,从而得出是数据帧还是远程帧
if((SendDataBuf[0]&0x40) == 0)//数据帧
{
if((SendDataBuf[0]&0x80) == 0)//标准帧
ucTempCount = (SendDataBuf[0]&0x0f)+3;
else//扩展帧
ucTempCount = (SendDataBuf[0]&0x0f)+5;
}
else//远程帧
{
if((SendDataBuf[0]&0x80) == 0)//标准帧
ucTempCount = 3;
else//扩展帧
ucTempCount = 5;
}
// memcpy(SJA_BCANAdr,SendDataBuf,ucTempCount);
// SJA_ADDR = REG_TxBuffer1;
// memcpy(TxBuffer1,SendDataBuf,ucTempCount);
for(i = 0 ; i < ucTempCount ; i++)
{
SJA_ADDR = REG_TxBuffer0 + i;
SJA_DATA = SendDataBuf[i];
}
return 1;
}
/************************************************************************
*函数原型: int sja_receive_data(unsigned char *RcvDataBuf); *
*参数说明: RcvDataBuf,存放微处理器保存数据缓冲区 *
*返回值: 1;接收成功 *
* 0;接收失败 *
*说明:CAN控制器接收数据,仅限于接收数据 *
************************************************************************/
int sja_receive_data(unsigned char *RcvDataBuf)
{
int i;
unsigned char ucTempCount,ucTempData;
SJA_ADDR = REG_STATUS;
ucTempData = SJA_DATA;
if((ucTempData&0x01) == 0) //判断报文是否有效
{
return 0;
}
SJA_ADDR = REG_RxBuffer0;
ucTempData = SJA_DATA;
if((ucTempData&0x40) == 0)//如果是数据帧
{
if((ucTempData&0x80) == 0)//标准帧
ucTempCount = (ucTempData & 0x0f)+3;
else//扩展帧
ucTempCount = (ucTempData & 0x0f)+5;
}
else
{
if((ucTempData&0x80) == 0)//标准帧
ucTempCount = 3;
else//扩展帧
ucTempCount = 5;
}
for (i=0;i<ucTempCount;i++)
{
SJA_ADDR = REG_RxBuffer0+i;
RcvDataBuf[i] = SJA_DATA;
}
return 1;
}
/************************************************************************
*函数原型: int sja_command_prg(unsigned char cmd) *
*参数说明: cmd:sja1000运行的命令字 *
* 01:发送请求 *
* 02:中止发送 *
* 04:释放接收缓冲区 *
* 08:清除超载状态 *
* 0x10:进入睡眠状态 *
* *
*返回值: *
* 1 ; 表示命令执行成功 *
* 0 ; 表示命令执行失败 *
* *
*说明: 执行sja1000命令 *
************************************************************************/
int sja_command_prg(unsigned char cmd)
{
unsigned char ucTempData;
SJA_ADDR = REG_COMMAND;
SJA_DATA = cmd; //启动命令字
switch(cmd)
{
case SRR_CMD: //自接收请求命令
return 1;
// break;
case TR_CMD: //发送请求命令
return 1;
// break;
case AT_CMD: //中止发送命令
SJA_ADDR = REG_STATUS;
ucTempData = SJA_DATA;
if((ucTempData & 0x20)==0) //判断是否正在发送
{
return 1;
}
else
{
return 0;
}
// break;
case RRB_CMD: //释放接收缓冲区
SJA_ADDR = REG_STATUS;
ucTempData = SJA_DATA;
if((ucTempData & 0x01)==1)
{
return 0;
}
else
{
return 1;
}
// break;
case COS_CMD: //清除超载状态
SJA_ADDR = REG_STATUS;
ucTempData = SJA_DATA;
if((ucTempData & 0x02)==0)
{
return 1;
}
else
{
return 0;
}
// break;
default:
return 0;
// break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -