main.c
来自「can sja1000 主节点程序 已经通过调试」· C语言 代码 · 共 171 行
C
171 行
#include "reg52.h"
#include "can.h"
#define MainID (0xaa) //主节点
#define SID1 (0xbb) //从节点1
#define SID2 (0xcc) //从节点2
#define SID3 (0xdd) //从节点3
#define SID4 (0xee) //从节点4
//数据 发送缓存区
tByte SendData[8] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
tByte RecvData[11]; //数据接收
void T0_Iint(void);
void Task_Init(void);
void Clear_All_Task(void);
tByte Get_Slave_Ack(tByte const Slave_ID);
//主节点发送时钟节拍给从节点
tByte Send_Tick_To_Slave(void);
static tByte CanBusCnt;
static bit CanSendSid1Task;
static bit CanSendSid2Task;
static bit CanSendSid3Task;
static bit CanSendSid4Task;
static bit CanRecvTask;
void main(void)
{
SJAInit(MainID); //SJA初始化
T0_Iint(); //T0定时器初始化
Task_Init(); //任务初始化
while(1)
{
// while(!(Send_Tick_To_Slave()))
// {
// CanBusCnt = 0; //任何一个节点时钟同步不成功,网络重新同步
// }
Send_Tick_To_Slave();
if(CanRecvTask)
{
//接收报头三个数据,即数据首地址,MainID和SID1
SJARecvData(RecvData,11);
}
}
}
void Task_Init(void) //任务初始化
{
CanSendSid1Task = 1;
CanSendSid2Task = 0;
CanSendSid3Task = 0;
CanSendSid4Task = 0;
CanRecvTask = 0;
}
void Clear_All_Task(void) //清除所有任务
{
CanSendSid1Task = 0;
CanSendSid2Task = 0;
CanSendSid3Task = 0;
CanSendSid4Task = 0;
CanRecvTask = 0;
}
void T0_Iint(void)
{
TMOD |= 0x01;
TH0 = (65535-10000)/256; //12M晶振10ms
TL0 = (65535-10000)%256;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void T0_ISR(void) interrupt 1 using 1
{
TH0 = (65535-10000)/256;
TL0 = (65535-10000)%256;
Clear_All_Task(); //清除所有任务
CanBusCnt++; //发送与接收每10ms轮流一次
if(CanBusCnt==5)
{
CanBusCnt = 0;
}
switch(CanBusCnt)
{
case 0: CanSendSid1Task = 1;break;
case 1: CanSendSid2Task = 1;break;
case 2: CanSendSid3Task = 1;break;
case 3: CanSendSid4Task = 1;break;
case 4: CanRecvTask = 1;break;
default:break;
}
}
//主节点发送时钟节拍给从节点
tByte Send_Tick_To_Slave(void)
{
if(CanSendSid1Task)
{
//发送接收帧为0x08,发送目的地址为SID1
while(SJASendData(SendData,8,SID1,0xff,0x08));
if(Get_Slave_Ack(SID1))
{
return 1; //握手不成功返回错误代号1
}
CanSendSid1Task = 0; //发送完成清除任务
}
if(CanSendSid2Task)
{
//发送接收帧为0x08,发送目的地址为SID2
while(SJASendData(SendData,8,SID2,0xff,0x08));
if(Get_Slave_Ack(SID2))
{
return 2; //握手不成功返回错误代号2
}
CanSendSid2Task = 0; //发送完成清除任务
}
if(CanSendSid3Task)
{
//发送接收帧为0x08,发送目的地址为SID3
while(SJASendData(SendData,8,SID3,0xff,0x08));
if(Get_Slave_Ack(SID3))
{
return 3; //握手不成功返回错误代号3
}
CanSendSid3Task = 0; //发送完成清除任务
}
if(CanSendSid4Task)
{
//发送接收帧为0x08,发送目的地址为SID4
while(SJASendData(SendData,8,SID4,0xff,0x08));
if(Get_Slave_Ack(SID4))
{
return 4; //握手不成功返回错误代号4
}
CanSendSid4Task = 0; //发送完成清除任务
}
return 0; //时钟同步成功
}
//获取从节点握手信号
tByte Get_Slave_Ack(tByte const Slave_ID)
{
SJARecvData(RecvData,4);
if(Slave_ID == RecvData[3]) //握手信号为从机ID
{
return 0; //握手成功
}
else
{
return 1; //握手失败
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?