📄 sja1000.c
字号:
作者: 影舞者
功能说明: 执行sja1000命令
输入参数: cmd:sja1000运行的命令字
01:发送请求
02:中止发送
04:释放接收缓冲区
08:清除超载状态
0x10:进入睡眠状态
输出参数: 0 : 表示命令执行成功
>=1 : 表示命令执行失败
函数扇出清单:
函数扇入清单:
其它说明:
*****************************************************************************************/
unsigned char SJA1000_CMD_PRG(unsigned char cmd)
{
switch(cmd)
{
case TXD_ONE_CMD: // 产生一次报文发送,当错误时不再生发(单次发送)
SJA1000_WRITE(REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case TXD_CMD: // 发送请求命令,当错误时可重发
SJA1000_WRITE(REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case T_R_CMD: // 产生一次自接收性质的报文发送,发送错误时不会重发
SJA1000_WRITE(REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case AT_CMD: // 中止发送命令
SJA1000_WRITE(REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case RRB_CMD: // 释放接收缓冲区
SJA1000_WRITE(REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case COS_CMD: // 数据溢出清除命令
SJA1000_WRITE(REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
default:
return 1;
}
return 2;
}
/*****************************************************************************************
函数名称: unsigned char SJA1000_DATA_SEND(unsigned char *SendDataBuf)
版本号: 2.52
生成日期: 1900.1.1
作者: 影舞者
功能说明: 本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否
输入参数: unsigned char * SendDataBuf: 报文
unsigned int Message_Longth: 报文长度
unsigned char CH_RTR: 0-数据帧、1-远程帧
输出参数: 0 表示将数据成功的送至发送缓冲区
>=1 表示上一次的数据正在发送,
函数扇出清单:
函数扇入清单:
其它说明: unsigned char *SendDataBuf: 为一帧完整的报文
发送报文:
同步头 4字节 A5h,5Ah,A5h,5Ah
帧长度 2字节 N+9 + 8 (高位在前,低位在后)
目标IP 4字节 范围为 Device_IP_1.Device_IP_2.Device_IP_3.Device_IP_4
源IP 4字节 范围为 Device_IP_1.Device_IP_2.Device_IP_3.Device_IP_4
命令码 1字节 0--255
数据区 N字节
校验码 2字节 校验数据(高位在前,低位在后,从同步头到数据区的累加和)
*****************************************************************************************/
unsigned char SJA1000_DATA_SEND(unsigned char * SendDataBuf,unsigned int Message_Longth,unsigned char CH_RTR)
{
unsigned char TempData;
TempData = SJA1000_READ(REG_STATUS); //访问地址指向状态寄存器
if((TempData&0x10) == 1) //判断是否正在接收
return 1;
else if((TempData&0x08) == 0) //判断上次发送是否完成
return 2;
else if((TempData&0x04)==0) //判断发送缓冲区是否锁定
return 3;
// CAN发送的帧报文信息: 扩展数据帧,6个数据
SJA1000_WRITE(REG_TXD_FID,0x88);
// CAN发送的标识
SJA1000_WRITE(REG_TXD_ID1,SEND_ACR1_FID);
SJA1000_WRITE(REG_TXD_ID2,SEND_ACR2_FID);
SJA1000_WRITE(REG_TXD_ID3,SEND_ACR3_FID);
SJA1000_WRITE(REG_TXD_ID3,SEND_ACR4_FID);
// CAN发送的数据
SJA1000_WRITE(REG_TXBuffer1,SendDataBuf[0]);
SJA1000_WRITE(REG_TXBuffer2,SendDataBuf[1]);
SJA1000_WRITE(REG_TXBuffer3,SendDataBuf[2]);
SJA1000_WRITE(REG_TXBuffer4,SendDataBuf[3]);
SJA1000_WRITE(REG_TXBuffer5,SendDataBuf[4]);
SJA1000_WRITE(REG_TXBuffer6,SendDataBuf[5]);
SJA1000_WRITE(REG_TXBuffer5,SendDataBuf[6]);
SJA1000_WRITE(REG_TXBuffer6,SendDataBuf[7]);
TempData = SJA1000_CMD_PRG(T_R_CMD); // 产生一次自接收性质的报文发送,发送错误时不会重发
//TempData = SJA1000_CMD_PRG(TXD_ONE_CMD); // 产生一次报文发送,当错误时不再生发(单次发送)
//TempData = SJA1000_CMD_PRG(TXD_CMD);
if(TempData != 0x00)
return 10;
return 0;
}
/*****************************************************************************************
函数名称: void main()
版本号: 2.52
生成日期: 1900.1.1
作者: 影舞者
功能说明: 主程序入口
输入参数:
输出参数:
函数扇出清单:
函数扇入清单:
其它说明:
*****************************************************************************************/
void main()
{
unsigned char SendData[8],ReceiveData[13],TempData;
unsigned char sendflag = 0;
unsigned int delaycount;
SendData[0] = 0x10;
SendData[1] = 0x11;
SendData[2] = 0x12;
SendData[3] = 0x13;
SendData[4] = 0x14;
SendData[5] = 0x15;
SendData[6] = 0x16;
SendData[7] = 0x17;
Main_Init_Self(); // 单片机自身初始化
Init_SJA1000_HardWare(); // SJA1000硬件初始化系统
TempData = Init_SJA1000_Soft(); // SJA1000软件初始化系统
while(TempData != 0x00)
TempData = Init_SJA1000_Soft(); // SJA1000软件初始化系统
TempData = SJA1000_DATA_SEND(SendData,0,0);
while(TempData != 0x00) _nop_();
sendflag = 1; // 发送完毕标识
while(1)
{
if(sendflag == 0)
{
for(delaycount=0;delaycount<60000;delaycount++);
for(delaycount=0;delaycount<60000;delaycount++);
for(delaycount=0;delaycount<60000;delaycount++);
for(delaycount=0;delaycount<60000;delaycount++);
TempData = SJA1000_DATA_SEND(SendData,0,0);
while(TempData != 0x00) _nop_();
sendflag = 1; // 发送完标识
}
if(SJA1000_INT_PIN == 0) // 有中断产生
{
TempData = SJA1000_READ(REG_INTERRUPT); // 访问中断寄存器
if((TempData&0x80) == 0x80) // 总线错误中断
{
//SJA1000_CMD_PRG(AT_CMD);
Init_SJA1000_HardWare(); // SJA1000硬件初始化系统
TempData = Init_SJA1000_Soft(); // SJA1000软件初始化系统
while(TempData != 0x00)
TempData = Init_SJA1000_Soft(); // SJA1000软件初始化系统
sendflag = 0; // 可以发送标识
//TempData = SJA1000_DATA_SEND(SendData,0,0);
//while(TempData != 0x00)
// _nop_();
}
if((TempData&0x08) == 0x08) // 数据溢出中断
{
TempData = Init_SJA1000_Soft(); // SJA1000软件初始化系统
while(TempData != 0x00)
TempData = Init_SJA1000_Soft(); // SJA1000软件初始化系统
sendflag = 0; // 可以发送标识
}
if((TempData&0x04) == 0x04) // 出错报警中断
{
TempData = Init_SJA1000_Soft(); // SJA1000软件初始化系统
while(TempData != 0x00)
TempData = Init_SJA1000_Soft(); // SJA1000软件初始化系统
sendflag = 0; // 可以发送标识
}
if((TempData&0x02) == 0x02) // 发送完成中断
{
_nop_();
_nop_();
_nop_();
sendflag = 0; // 可以发送标识
}
if((TempData&0x01) == 0x01) // 接收有效中断
{
ReceiveData[0] = 0x00;
ReceiveData[1] = 0x00;
ReceiveData[2] = 0x00;
ReceiveData[3] = 0x00;
ReceiveData[4] = 0x00;
ReceiveData[5] = 0x00;
ReceiveData[6] = 0x00;
ReceiveData[7] = 0x00;
ReceiveData[8] = 0x00;
ReceiveData[9] = 0x00;
ReceiveData[10] = 0x00;
ReceiveData[11] = 0x00;
ReceiveData[12] = 0x00;
ReceiveData[0] = SJA1000_READ(REG_RXD_FID);
ReceiveData[1] = SJA1000_READ(REG_RXD_ID1);
ReceiveData[2] = SJA1000_READ(REG_RXD_ID2);
ReceiveData[3] = SJA1000_READ(REG_RXD_ID3);
ReceiveData[4] = SJA1000_READ(REG_RXD_ID4);
ReceiveData[5] = SJA1000_READ(REG_RXBuffer1);
ReceiveData[6] = SJA1000_READ(REG_RXBuffer2);
ReceiveData[7] = SJA1000_READ(REG_RXBuffer3);
ReceiveData[8] = SJA1000_READ(REG_RXBuffer4);
ReceiveData[9] = SJA1000_READ(REG_RXBuffer5);
ReceiveData[10] = SJA1000_READ(REG_RXBuffer6);
ReceiveData[11] = SJA1000_READ(REG_RXBuffer7);
ReceiveData[12] = SJA1000_READ(REG_RXBuffer8);
SJA1000_CMD_PRG(RRB_CMD);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -