📄 sja1000t.c
字号:
// if(TempData != BTR1_Rate_125k) return 6;
// 中断控制: 总线错误中断、发送中断、接收中断
SJA1000_WRITE(Device, REG_INTENABLE,REG_INTENABLE_DATA); // 访问中断使能控制
// TempData = SJA1000_READ(Device, REG_INTENABLE);
// if(TempData != REG_INTENABLE_DATA) return 7;
// 设置滤波器,地址为本地的IP前29位,全匹配
SJA1000_WRITE(Device, REG_ACR1,REG_ACR1_FID); // 验收代码寄存器(ACR1)--IP地址最低位
// TempData = SJA1000_READ(Device, REG_ACR1);
// if(TempData != REG_ACR1_FID) return 8;
SJA1000_WRITE(Device, REG_ACR2,REG_ACR2_FID); // 验收代码寄存器(ACR2)
// TempData = SJA1000_READ(Device, REG_ACR2);
// if(TempData != REG_ACR2_FID) return 9;
SJA1000_WRITE(Device, REG_ACR3,REG_ACR3_FID); // 验收代码寄存器(ACR3)
// TempData = SJA1000_READ(Device, REG_ACR3);
// if(TempData != REG_ACR3_FID) return 10;
SJA1000_WRITE(Device, REG_ACR4,REG_ACR4_FID); // 验收代码寄存器(ACR4)--IP地址最高位
// TempData = SJA1000_READ(Device, REG_ACR4);
// if(TempData != REG_ACR4_FID) return 11;
SJA1000_WRITE(Device, REG_AMR1,REG_AMR1_FID); // 验收屏蔽寄存器(1屏,0有效)
// TempData = SJA1000_READ(Device, REG_AMR1);
// if(TempData != REG_AMR1_FID) return 12;
SJA1000_WRITE(Device, REG_AMR2,REG_AMR2_FID); // 验收屏蔽寄存器(1屏,0有效)
// TempData = SJA1000_READ(Device, REG_AMR2);
// if(TempData != REG_AMR2_FID) return 13;
SJA1000_WRITE(Device, REG_AMR3,REG_AMR3_FID); // 验收屏蔽寄存器(1屏,0有效)
// TempData = SJA1000_READ(Device, REG_AMR3);
// if(TempData != REG_AMR3_FID) return 14;
SJA1000_WRITE(Device, REG_AMR4,REG_AMR4_FID); // 验收屏蔽寄存器(1屏,0有效)--最低二位不匹配
// TempData = SJA1000_READ(Device, REG_AMR4);
// if(TempData != REG_AMR4_FID) return 15;
// SJA1000控制
SJA1000_WRITE(Device, REG_MODE,REG_MODE_DATA);
// TempData = SJA1000_READ(Device, REG_MODE);
// if(TempData != REG_MODE_DATA) return 16;
for(RSTCOUNT=0;RSTCOUNT<50;RSTCOUNT++); // 复位延时
return 0;
}
/******************************************************************************
函数名称: unsigned char SJA1000_CMD_PRG(unsigned char cmd)
功能说明: 执行sja1000命令
输入参数: cmd:sja1000运行的命令字
01:发送请求
02:中止发送
04:释放接收缓冲区
08:清除超载状态
0x10:进入睡眠状态
输出参数: 0 : 表示命令执行成功
>=1 : 表示命令执行失败
******************************************************************************/
unsigned char SJA1000_CMD_PRG(unsigned char Device, unsigned char cmd)
{
switch(cmd)
{
case TXD_ONE_CMD: // 产生一次报文发送,当错误时不再生发(单次发送)
SJA1000_WRITE(Device, REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case TXD_CMD: // 发送请求命令,当错误时可重发
SJA1000_WRITE(Device, REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case T_R_CMD: // 产生一次自接收性质的报文发送,发送错误时不会重发
SJA1000_WRITE(Device, REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case AT_CMD: // 中止发送命令
SJA1000_WRITE(Device, REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case RRB_CMD: // 释放接收缓冲区
SJA1000_WRITE(Device, REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
case COS_CMD: // 数据溢出清除命令
SJA1000_WRITE(Device, REG_COMMAND,cmd); //访问地址指向命令寄存器
return 0;
default:
return 1;
}
}
/******************************************************************************
函数名称: unsigned char SJA1000_DATA_SEND(unsigned char *SendDataBuf)
功能说明: 本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否
输入参数: unsigned char * SendDataBuf: 报文
unsigned int Message_Longth: 报文长度
输出参数: 0 表示将数据成功的送至发送缓冲区
>=1 表示上一次的数据正在发送,
函数扇出清单:
函数扇入清单:
其它说明: unsigned char *SendDataBuf: 为一帧完整的报文
******************************************************************************/
unsigned char SJA1000_DATA_SEND(unsigned char Device, Uint32 *SendDataBuf, Uint32 Message_Longth)
{
unsigned char TempData;
Uint16 i = 0,j,buffer;
Uint32 msgid = SEND_MSG_ID;
Uint32 sendcounter = 0;
if((Message_Longth % 2) != 0)
Message_Longth = Message_Longth-1;
if(sendcounter < Message_Longth)
{
status1: i++;
FEED_WATCHDOG;
if(i>0xFF)
{
error();
}
TempData = SJA1000_READ(Device, REG_STATUS); //访问地址指向状态寄存器
if((TempData & 0x10) == 0x10) //判断是否正在接收
goto status1;
else
if((TempData & 0x08) != 0x08) //判断上次发送是否完成
// SJA1000_CMD_PRG(Device, AT_CMD);
goto status1;
else
if((TempData & 0x04) != 0x04) //判断发送缓冲区是否锁定
goto status1;
msgid = msgid+1;
msgid = msgid<<3;
// CAN发送的帧报文信息: 扩展数据帧,8个数据
SJA1000_WRITE(Device, REG_TXD_FID,0x88);
// CAN发送的标识
SJA1000_WRITE(Device, REG_TXD_ID1,(unsigned char)((msgid & 0xFF000000)>>24));
SJA1000_WRITE(Device, REG_TXD_ID2,(unsigned char)((msgid & 0x00FF0000)>>16));
SJA1000_WRITE(Device, REG_TXD_ID3,(unsigned char)((msgid & 0x0000FF00)>>8));
SJA1000_WRITE(Device, REG_TXD_ID4,(unsigned char)(msgid & 0x000000FF));
msgid = msgid>>3;
// CAN发送的数据
buffer = REG_TXBuffer;
for(i=0;i<2;i++)
{
sendcounter++;
TempData = (unsigned char)(*SendDataBuf & 0x000000FF);
for(j=0;j<4;j++)
{
SJA1000_WRITE(Device, buffer++,TempData);
TempData = (unsigned char)((*SendDataBuf>>8) & 0x000000FF);
}
SendDataBuf++;
}
TempData = SJA1000_CMD_PRG(Device, TXD_CMD); // 产生一次自接收性质的报文发送,发送错误时不会重发
if(TempData != 0x00)
return 1;
}
return 0;
}
/******************************************************************************
函数名称: unsigned char SJA1000_DATA_RECEIVE(unsigned char Device, unsigned char *ReceiveDataBuf, unsigned char Message_Longth)
功能说明: 读接收缓冲区数据
输入参数: unsigned char * SendDataBuf: 报文
unsigned int Message_Longth: 报文长度
其它说明: unsigned char *SendDataBuf: 为一帧完整的报文
******************************************************************************/
unsigned char SJA1000_DATA_RECEIVE(unsigned char Device, unsigned char *ReceiveDataBuf, unsigned char Message_Longth)
{
unsigned char TempData;
unsigned char i = 0, buffer = 0;
status2: i++;
FEED_WATCHDOG;
if(i>0xFF)
{
error();
}
TempData = SJA1000_READ(Device, REG_STATUS); //访问地址指向状态寄存器
if((TempData & 0x20) == 0x20) //判断是否正在发送
goto status2;
else
if((TempData & 0x02) == 0x02)
{
SJA1000_CMD_PRG(Device, COS_CMD);
SJA1000_CMD_PRG(Device, RRB_CMD);
goto status2;
}
else
if((TempData & 0x01) != 0x01) //判断缓冲区是否满
{
SJA1000_CMD_PRG(Device, RRB_CMD);
return 1;
}
buffer = REG_RXD_FID;
for(i=0;i< Message_Longth;i++)
{
*ReceiveDataBuf++ = SJA1000_READ(Device, buffer++);
}
SJA1000_CMD_PRG(Device, RRB_CMD);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -