📄 sja_pelican.c
字号:
}
Sja_PeliCan = REG_AcceptCode3; //访问地址指向验收代码寄存器(ACR4)
*Sja_PeliCan = PCan_ACR3; //写入参数
if ( *Sja_PeliCan != PCan_ACR3 ) //校验写入值
{
return 1;
}
Sja_PeliCan = REG_AcceptMask0; //访问地址指向验收屏蔽寄存器(AMR)
*Sja_PeliCan = PCan_AMR0; //写入参数
if ( *Sja_PeliCan != PCan_AMR0 ) //校验写入值
{
return 1;
}
Sja_PeliCan = REG_AcceptMask1; //访问地址指向验收屏蔽寄存器(AMR)
*Sja_PeliCan = PCan_AMR1; //写入参数
if ( *Sja_PeliCan != PCan_AMR1 ) //校验写入值
{
return 1;
}
Sja_PeliCan = REG_AcceptMask2; //访问地址指向验收屏蔽寄存器(AMR)
*Sja_PeliCan = PCan_AMR2; //写入参数
if ( *Sja_PeliCan != PCan_AMR2 ) //校验写入值
{
return 1;
}
Sja_PeliCan = REG_AcceptMask3; //访问地址指向验收屏蔽寄存器(AMR)
*Sja_PeliCan = PCan_AMR3; //写入参数
if ( *Sja_PeliCan != PCan_AMR3 ) //校验写入值
{
return 1;
}
return 0;
}
/************************************************************************
;*函数原型: bit PCan_Set_Outclk (unsigned char PCan_OCR, *
unsigned char PCan_CDR); *
;*参数说明: *
* PCan_OCR: 存放输出控制寄存器 (OC) 的参数设置 *
* PCan_CDR: 存放时钟分频寄存器 (CDR) 的参数设置 *
* *
;*返回值: *
;* 0 ;设置成功 *
;* 1 ;设置失败 *
;* *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 *
;************************************************************************/
bit PCan_Set_OCR (unsigned char PCan_OCR)
{
Sja_PeliCan = REG_OCR; //访问地址指向输出控制寄存器
*Sja_PeliCan = PCan_OCR; //写入参数
if ( *Sja_PeliCan != PCan_OCR ) //校验写入值
{
return 1;
}
return 0;
}
/************************************************************************
*函数原型: bit PCan_Data_Send(unsigned char *SendDataBuf) *
*参数说明: 特定帧各式的数据 *
*返回值: *
* 0 ; 表示将数据成功的送至发送缓冲区 *
* 1 ; 表示上一次的数据正在发送, *
* ; 表示发送缓冲区被锁定,不能写入数据 *
* ; 表示写入数据错误 *
*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
* SJA1000发送。 *
* 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
* 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
* *
*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 *
************************************************************************/
bit PCan_Data_Send(unsigned char *SendDataBuf)
{
unsigned char TempCount;
Sja_PeliCan = REG_STATUS; //访问地址指向状态寄存器
if ( (*Sja_PeliCan&0x08) == 0 ) //判断上次发送是否完成
{
return 1;
}
if( (*Sja_PeliCan&0x04) == 0 ) //判断发送缓冲区是否锁定
{
return 1;
}
Sja_PeliCan = REG_TxBuffer1; //访问地址指向发送缓冲区1
if ( (SendDataBuf[1]&0x10) == 0 ) //判断RTR,从而得出是数据帧还是远程帧
{
//输入数据帧
TempCount = ( ((SendDataBuf[1]&0x0f) > 8) ? 8 : TempCount ) + 2;
}
else
{
TempCount = 2; //远程帧
}
memcpy(Sja_PeliCan, SendDataBuf, TempCount);
return 0;
}
/************************************************************************
*函数原型: bit PCan_Data_Recv (unsigned char *RcvDataBuf, *
* unsigned char *ucBufLen) *
*参数说明: RcvDataBuf, 存放微处理器保存数据缓冲区 *
*返回值: 0; 接收成功 *
* 1; 接收失败 *
*说明: CAN控制器接收数据,仅限于接收数据 *
************************************************************************/
bit PCan_Data_Recv(unsigned char *RcvDataBuf, unsigned char *ucBufLen)
{
Sja_PeliCan = REG_STATUS; //访问地址指向状态寄存器
if ( (*Sja_PeliCan&0x01) == 0 ) //判断报文是否有效
{
*ucBufLen = 0;
return 1;
}
Sja_PeliCan = REG_RxFramInfo;
RcvDataBuf[0] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer1;
RcvDataBuf[1] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer2;
RcvDataBuf[2] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer3;
RcvDataBuf[3] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer4;
RcvDataBuf[4] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer5;
RcvDataBuf[5] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer6;
RcvDataBuf[6] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer7;
RcvDataBuf[7] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer8;
RcvDataBuf[8] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer9;
RcvDataBuf[9] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer10;
RcvDataBuf[10] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer11;
RcvDataBuf[11] = *Sja_PeliCan;
Sja_PeliCan = REG_RxBuffer12;
RcvDataBuf[12] = *Sja_PeliCan;
*ucBufLen = 13;
//if ( (*Sja_PeliCan&0x10) == 0 ) //如果是数据帧
//{
//*ucBufLen = (*Sja_PeliCan&0x0f) + 2; //计算报文中数据的个数
//}
//else
//{
//*ucBufLen = 2;
// }
//Sja_PeliCan = REG_RxBuffer1; //访问地址指向接收缓冲区1
//memcpy(RcvDataBuf, Sja_PeliCan, *ucBufLen ); //读取接收缓冲区的报文
return 0;
}
/************************************************************************
*函数原型: bit PCan_Cmd_Prg(unsigned char cmd) *
*参数说明: unsigned char cmd: sja1000运行的命令字 *
* 0x01: 发送请求 *
* 0x02: 中止发送 *
* 0x04: 释放接收缓冲区 *
* 0x08: 清除超载状态 *
* 0x10: 进入睡眠状态 *
* *
*返回值: *
* 0 ; 表示命令执行成功 *
* 1 ; 表示命令执行失败 *
* *
*说明: 执行sja1000命令 *
************************************************************************/
bit PCan_Cmd_Prg(unsigned char cmd)
{
Sja_PeliCan = REG_COMMAND; //访问地址指向命令寄存器
*Sja_PeliCan = cmd; //启动命令字
switch ( cmd )
{
case CMD_SEND: //发送请求命令
return 0;
break;
case CMD_ABORT_SEND: //夭折发送命令
Sja_PeliCan = REG_STATUS; //访问地址指向状态寄存器
if ( (*Sja_PeliCan & 0x20) ==0 )//判断是否正在发送
{
return 0;
}
else
{
return 1;
}
break;
case CMD_RELEASE_RXBUFF: //释放接收缓冲区
Sja_PeliCan = REG_STATUS; //访问地址指向状态寄存器
if ( (*Sja_PeliCan & 0x01) == 1 )//判断是否释放成功
{
return 1;
}
else
{
return 0;
}
break;
case CMD_CLEAR_OVER_STAT: //清除超载状态
Sja_PeliCan = REG_STATUS; //访问地址指向状态寄存器
if((*Sja_PeliCan & 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 + -