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 + -
显示快捷键?