📄 sja_bcanfunc.c
字号:
/************************************************************************
*函数原型: bit BCAN_HW_INIT(unsigned char BCAN_ACR, *
* unsigned char BCAN_AMR, *
* unsigned char Bus_Timing0, *
* unsigned char Bus_Timing1, *
* unsigned char Out_Control, *
* unsigned char Clock_Out *
* ) *
*参数说明: *
* BCAN_ACR:存放验收代码寄存器(ACR)的参数设置 *
* BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置 *
* Bus_Timing0:存放总线定时0寄存器(BTR0)的参数设置 *
* Bus_Timing1:存放总线定时1寄存器(BTR1)的参数设置 *
* Out_Control:存放输出控制寄存器 (OC) 的参数设置 *
* Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置 *
* *
*返回值: *
* 0 ; 表示初始化成功 *
* 1 ; 表示初始化失败 *
* *
*说明:CAN控制器的初始化只能在复位模式下才能完成。初始化操作之前请先进入*
* 到复位操作模式,并将要初始化的各参数的值按数据手册中的计算方法,正 *
* 确的按实际需要计算好参数后,将参数写入对应的寄存器 。 *
*注: 为了CAN控制器的正确运行,请务必仔细的阅读SJA1000的数据手册 *
* *
*示例:设应用系统中晶体频率16MHZ,节点只接收ID(标志符)高八位为 *
* '10101010'的消息,系统波特率为50Kbit/s,关闭CLKOUT输出。 *
* 则根据数据手册中的计算方法的各参数如下: *
* ACR==0AAH,AMR==00H,BTR0==0C9H,BTR1==0C9H,OC==0FFH,CDR=48H *
* 则调用本函数为: *
* BCAN_HW_INIT(0xaa,0x00,0xc9,0xc9,0xff,0x48) *
************************************************************************
bit BCAN_HW_INIT(unsigned char BCAN_ACR,
unsigned char BCAN_AMR,
unsigned char Bus_Timing0,
unsigned char Bus_Timing1,
unsigned char Out_Control,
unsigned char Clock_Out
)
{
SJA_BCANAdr=REG_ACR; //访问地址指向验收代码寄存器(ACR)
*SJA_BCANAdr=BCAN_ACR; //写入参数
if(*SJA_BCANAdr != BCAN_ACR) //校验写入值
{
return 1;
}
SJA_BCANAdr=REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
*SJA_BCANAdr=BCAN_AMR; //写入参数
if(*SJA_BCANAdr != BCAN_AMR) //校验写入值
{
return 1;
}
SJA_BCANAdr=REG_BTR0; //访问地址指向总线定时寄存器0
*SJA_BCANAdr=Bus_Timing0; //写入参数
if(*SJA_BCANAdr != Bus_Timing0)//校验写入值
{
return 1;
}
SJA_BCANAdr=REG_BTR1; //访问地址指向总线定时寄存器0
*SJA_BCANAdr=Bus_Timing1; //写入参数
if(*SJA_BCANAdr != Bus_Timing1)//校验写入值
{
return 1;
}
SJA_BCANAdr=REG_OCR ; //访问地址指向输出控制寄存器
*SJA_BCANAdr=Out_Control; //写入参数
if(*SJA_BCANAdr != Out_Control)//校验写入值
{
return 1;
}
SJA_BCANAdr=REG_CDR; //访问地址指向输出控制寄存器
*SJA_BCANAdr=Clock_Out; //写入参数
return 0;
}
/************************************************************************
*函数原型: bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
*参数说明: 特定帧各式的数据? *
*返回值: *
* 0 ; 表示将数据成功的送至发送缓冲区 *
* 1 ; 表示上一次的数据正在发送, *
* ; 表示发送缓冲区被锁定,不能写入数据 *
* ; 表示写入数据错误 *
*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
* SJA1000发送。 *
* 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
* 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
* *
*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 *
************************************************************************/
bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr&0x08) == 0) //判断上次发送是否完成
{
return 1;
}
if((*SJA_BCANAdr&0x04)==0) //判断发送缓冲区是否锁定
{
return 1;
}
SJA_BCANAdr = REG_TxBuffer1; //访问地址指向发送缓冲区1
if((SendDataBuf[1]&0x10)==0) //判断RTR,从而得出是数据帧还是远程帧
{
TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
}
else
{
TempCount =2; //远程帧
}
memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
return 0;
}
/************************************************************************
*函数原型: bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf); *
*参数说明: RcvDataBuf,存放微处理器保存数据缓冲区 *
*返回值: 0;接收成功 *
* 1;接收失败 *
*说明:CAN控制器接收数据,仅限于接收数据 *
************************************************************************/
bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr&0x01)==0) //判断报文是否有效
{
return 1;
}
SJA_BCANAdr = REG_RxBuffer2; //访问地址指向接收缓冲区2
if((*SJA_BCANAdr&0x10)==0) //如果是数据帧
{
TempCount=(*SJA_BCANAdr&0x0f)+2; //计算报文中数据的个数
}
else
{
TempCount=2;
}
SJA_BCANAdr = REG_RxBuffer1; //访问地址指向接收缓冲区1
memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文
return 0;
}
/************************************************************************
*函数原型: bit BCAN_CMD_PRG(unsigned char cmd) *
*参数说明: cmd:sja1000运行的命令字 *
* 01:发送请求 *
* 02:中止发送 *
* 04:释放接收缓冲区 *
* 08:清除超载状态 *
* 0x10:进入睡眠状态 *
* *
*返回值: *
* 0 ; 表示命令执行成功 *
* 1 ; 表示命令执行失败 *
* *
*说明: 执行sja1000命令 *
************************************************************************/
bit BCAN_CMD_PRG(unsigned char cmd)
{
SJA_BCANAdr=REG_COMMAND; //访问地址指向命令寄存器
*SJA_BCANAdr=cmd; //启动命令字
switch(cmd)
{
case TR_CMD: //发送请求命令
return 0;
break;
case AT_CMD: //夭折发送命令
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送
{
return 0;
}
else
{
return 1;
}
break;
case RRB_CMD: //释放接收缓冲区
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x01)==1)//判断是否释放成功
{
return 1;
}
else
{
return 0;
}
break;
case COS_CMD: //清除超载状态
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功
{
return 0;
}
else
{
return 1;
}
break;
case GTS_CMD: //进入睡眠状态命令
return 0;
break;
default:
return 1;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -