📄 sja_basiccan.c
字号:
;************************************************************************/
bit BCan_Set_Object(unsigned char BCAN_ACR, unsigned char BCAN_AMR)
{
Sja_BasicCan = REG_ACR; //访问地址指向验收代码寄存器(ACR)
*Sja_BasicCan = BCAN_ACR; //写入参数
if ( *Sja_BasicCan != BCAN_ACR ) //校验写入值
{
return 1;
}
Sja_BasicCan = REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
*Sja_BasicCan = BCAN_AMR; //写入参数
if ( *Sja_BasicCan != BCAN_AMR ) //校验写入值
{
return 1;
}
return 0;
}
/************************************************************************
;*函数原型: bit BCan_Set_Outclk (unsigned char BCAN_OCR, *
unsigned char BCAN_CDR); *
;*参数说明: *
* BCAN_OCR: 存放输出控制寄存器 (OC) 的参数设置 *
* BCAN_CDR: 存放时钟分频寄存器 (CDR) 的参数设置 *
* *
;*返回值: *
;* 0 ;设置成功 *
;* 1 ;设置失败 *
;* *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
;************************************************************************/
bit BCan_Set_Outclk (unsigned char BCAN_OCR,
unsigned char BCAN_CDR)
{
Sja_BasicCan = REG_OCR ; //访问地址指向输出控制寄存器
*Sja_BasicCan = BCAN_OCR; //写入参数
if ( *Sja_BasicCan != BCAN_OCR ) //校验写入值
{
return 1;
}
Sja_BasicCan = REG_CDR; //访问地址指向输出控制寄存器
*Sja_BasicCan = BCAN_CDR; //写入参数
return 0;
}
/************************************************************************
*函数原型: bit BCan_Data_Send(unsigned char *SendDataBuf) *
*参数说明: 特定帧各式的数据 *
*返回值: *
* 0 ; 表示将数据成功的送至发送缓冲区 *
* 1 ; 表示上一次的数据正在发送, *
* ; 表示发送缓冲区被锁定,不能写入数据 *
* ; 表示写入数据错误 *
*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
* SJA1000发送。 *
* 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
* 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
* *
*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 *
************************************************************************/
bit BCan_Data_Send(unsigned char *SendDataBuf)
{
unsigned char TempCount;
Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
if ( (*Sja_BasicCan&0x08) == 0 ) //判断上次发送是否完成
{
return 1;
}
if( (*Sja_BasicCan&0x04) == 0 ) //判断发送缓冲区是否锁定
{
return 1;
}
Sja_BasicCan = REG_TxBuffer1; //访问地址指向发送缓冲区1
if ( (SendDataBuf[1]&0x10) == 0 ) //判断RTR,从而得出是数据帧还是远程帧
{
//输入数据帧
TempCount = ( ((SendDataBuf[1]&0x0f) > 8) ? 8 : TempCount ) + 2;
}
else
{
TempCount = 2; //远程帧
}
memcpy(Sja_BasicCan, SendDataBuf, TempCount);
return 0;
}
/************************************************************************
*函数原型: bit BCan_Data_Recv (unsigned char *RcvDataBuf, *
* unsigned char *ucBufLen) *
*参数说明: RcvDataBuf, 存放微处理器保存数据缓冲区 *
*返回值: 0; 接收成功 *
* 1; 接收失败 *
*说明: CAN控制器接收数据,仅限于接收数据 *
************************************************************************/
bit BCan_Data_Recv(unsigned char *RcvDataBuf, unsigned char *ucBufLen)
{
Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
if ( (*Sja_BasicCan&0x01) == 0 ) //判断报文是否有效
{
*ucBufLen = 0;
return 1;
}
Sja_BasicCan = REG_RxBuffer2; //访问地址指向接收缓冲区2
if ( (*Sja_BasicCan&0x10) == 0 ) //如果是数据帧
{
*ucBufLen = (*Sja_BasicCan&0x0f) + 2; //计算报文中数据的个数
}
else
{
*ucBufLen = 2;
}
Sja_BasicCan = REG_RxBuffer1; //访问地址指向接收缓冲区1
memcpy(RcvDataBuf, Sja_BasicCan, *ucBufLen ); //读取接收缓冲区的报文
return 0;
}
/************************************************************************
*函数原型: bit BCan_Cmd_Prg(unsigned char cmd) *
*参数说明: unsigned char cmd: sja1000运行的命令字 *
* 0x01: 发送请求 *
* 0x02: 中止发送 *
* 0x04: 释放接收缓冲区 *
* 0x08: 清除超载状态 *
* 0x10: 进入睡眠状态 *
* *
*返回值: *
* 0 ; 表示命令执行成功 *
* 1 ; 表示命令执行失败 *
* *
*说明: 执行sja1000命令 *
************************************************************************/
bit BCan_Cmd_Prg(unsigned char cmd)
{
Sja_BasicCan = REG_COMMAND; //访问地址指向命令寄存器
*Sja_BasicCan = cmd; //启动命令字
switch ( cmd )
{
case CMD_SEND: //发送请求命令
return 0;
break;
case CMD_ABORT_SEND: //夭折发送命令
Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
if ( (*Sja_BasicCan & 0x20) ==0 )//判断是否正在发送
{
return 0;
}
else
{
return 1;
}
break;
case CMD_RELEASE_RXBUFF: //释放接收缓冲区
Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
if ( (*Sja_BasicCan & 0x01) == 1 )//判断是否释放成功
{
return 1;
}
else
{
return 0;
}
break;
case CMD_CLEAR_OVER_STAT: //清除超载状态
Sja_BasicCan = REG_STATUS; //访问地址指向状态寄存器
if((*Sja_BasicCan & 0x02) == 0 ) //判断清除超载是否成功
{
return 0;
}
else
{
return 1;
}
break;
case CMD_GOTO_SLEEP: //进入睡眠状态命令
return 0;
break;
default:
return 1;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -