⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 protocol.c

📁 dsp2407,采集卡
💻 C
字号:
//***************************************************//
#define		__PROTOCOL_INC_
#include 	".\DAT\DEF.H"

//***************************************************//
void RX_ISR(void)          			//接收服务程序
{
	UINT ch;

	n_TxTimeUp=TXRESETTIME;
	EnableRx();
	DisableTx();

	ch=*SCIRXBUF;					// 读可以清除中断标志
	if(FlagRxOver)
	{
		EnableINT();				//开总中断,因为一进入中断服务程序总中断就自动关闭了
		return;
	}
	if(FlagRxStart==0)
	{
		ClrRxStart();
		ClrRxOver();

		if(ch==C_SYNC)
		{
			SetRxStart();

			rxtx_ptr=0;
			rxtx_size=0XFFFF;
		}
		else
		{
			EnableINT();			//开总中断,因为一进入中断服务程序总中断就自动关闭了
			return;
		}
	}
	else
	{
		if(rxtx_ptr==7)
		{
			if(ch!=C_SYNC)
			{
				ClrRxStart();
				ClrRxOver();

				EnableINT();		//开总中断,因为一进入中断服务程序总中断就自动关闭了
				return;
			}
		}
		else
		if(rxtx_ptr==9)
		{
			rxtx_size =ch;
			rxtx_size+=12;
			if(rxtx_size>256)
				rxtx_size=256;
		}
	}

	RxTxBuffer[rxtx_ptr]=ch;
	rxtx_ptr++;
	if(rxtx_ptr>=rxtx_size)
	{
		ClrRxStart();
		ClrRxOver();

		if(ch==C_ENDC)
		{
			SetRxOver();

			DisableRx();
			n_TxTimeUp=0XFF;
		}
	}

	EnableINT();					//开总中断,因为一进入中断服务程序总中断就自动关闭了
}

//***************************************************//
void TX_ISR(void)          			//发送服务程序
{
	UINT ch;

	n_TxTimeUp=TXRESETTIME;
	DisableRx();
	ClrRxStart();
	ClrRxOver();

	if(FlagTxStart && (FlagTxOver==0))
	{
		EnableTx();

		if(rxtx_ptr<rxtx_size) 		// 数据是否发送完毕
		{
			ch=RxTxBuffer[rxtx_ptr];
			*SCITXBUF=ch;			// 发送当前字节
			rxtx_ptr++; 			// 增加数据索引
		}
		else
		{
			ClrTxStart();
			SetTxOver();

			DisableTx();
			EnableRx();
		}
	}
	else
	{
		ClrTxStart();
		SetTxOver();

		DisableTx();
		EnableRx();
	}

	EnableINT();						//开总中断,因为一进入中断服务程序总中断就自动关闭了
}

//***************************************************//
void Cmd_Explain(void)
{
	UINT	command_fun;
	UINT	std_fun;
	UINT	ext_fun;
	UINT	rtn_CRC;

	ClrTxStart();
	SetTxOver();
	rtn_CRC=CalCRC16(&RxTxBuffer[0],(rxtx_size-2));
	#if(test)
		if(1)
	#else
		if(RxTxBuffer[rxtx_size-2]==rtn_CRC)
	#endif
	{
		OthLed_ON();

		#if(!test)
			SUB33(&RxTxBuffer[10],RxTxBuffer[9]);
		#endif
		command_fun=RxTxBuffer[8];
		if(RxTxBuffer[1]==0XFF)
		{
			if((command_fun==0x8)&&(rxtx_size==12+1))//采样计数器
			{
				OthLed_OFF();
				TX_ReceiveCnt();
			}
			else
			if((command_fun==0x9)&&(rxtx_size==12+3))//广播采样
			{
				TX_StartAD();
			}
			else
			if((command_fun==0xa)&&(rxtx_size==12+2))//写设备地址
			{
				if(KEYIn()==0)
					TX_WriteAddress();
			}
			else
			if((command_fun==0xb)&&(rxtx_size==12+0))//读设备地址
			{
				if(KEYIn()==0)
					TX_ReadAddress();
			}
		}
		else
		if(RxTxBuffer[1]==DeviceNo)
		{
			SetTxLogon();
			if((FlagTxLogon)&&(command_fun>=1)&&(command_fun<=4))
			{
				std_fun=RxTxBuffer[10];
				ext_fun=RxTxBuffer[11];
				if(std_fun==0XA0)
				{
					switch(ext_fun)
					{
						case	0x80://查询状态
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+0)
										TX_ReadState();
									break;
							}
							break;
						case	0x90://主时钟电压和频率
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+0)
										TX_ReadVF();
									break;
							}
							break;
						case	0xA0://A相数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+2)
										TX_ReadData(1);
									break;
							}
							break;
						case	0xB0://B相数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+2)
										TX_ReadData(2);
									break;
							}
							break;
						case	0xC0://C相数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+2)
										TX_ReadData(3);
									break;
							}
							break;
						case	0xD1://原始波形数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+0)
										TX_ReadFile(1);
									break;
							}
							break;
						case	0xD2://原始波形数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+0)
										TX_ReadFile(2);
									break;
							}
							break;
						case	0xD3://原始波形数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+0)
										TX_ReadFile(3);
									break;
							}
							break;
						case	0xD4://原始波形数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+0)
										TX_ReadFile(4);
									break;
							}
							break;
						case	0xD5://原始波形数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+0)
										TX_ReadFile(5);
									break;
							}
							break;
						case	0xD6://原始波形数据
							switch(command_fun)
							{
								case	1://读数据
									if(rxtx_size==12+2+0)
										TX_ReadFile(6);
									break;
							}
							break;
						default:
							break;
					}//扩展码
				}//基本码
			}//读和写
		}//设备号
		else
			OthLed_OFF();

		if((FlagTxStart)&&(RxTxBuffer[1]==DeviceNo))
		{
			RxTxBuffer[0] =C_SYNC;
			RxTxBuffer[1]=DeviceNo;
			RxTxBuffer[7] =C_SYNC;
			RxTxBuffer[8]|=0x80;

			TX_HandSend();
			return;
		}
	}//校验和
	ClrRxStart();
	ClrRxOver();
	EnableRx();
	DisableTx();
}

//***************************************************//
void TX_SendCnt(UINT cnt)
{
	Aphase[cnt].Ok=0;
	Bphase[cnt].Ok=0;
	Cphase[cnt].Ok=0;
	Aphase[cnt].No=cnt;
	Bphase[cnt].No=cnt;
	Cphase[cnt].No=cnt;

	SetAdClock();
	ReceiveSendCntDo();

	SetRxOver();
	SetTxOver();
	ClrRxStart();
	ClrTxStart();

	RxTxBuffer[ 0]=C_SYNC;
	RxTxBuffer[ 1]=0XFF;
	RxTxBuffer[ 7]=C_SYNC;
	RxTxBuffer[ 8]=0x08;
	RxTxBuffer[10]=cnt;

	RxTxBuffer[ 9]=1+0;
	rxtx_size=12+1+0;
	TX_HandSend();
}

//***************************************************//
void TX_ReceiveCnt(void)
{
	n_AdCnt=RxTxBuffer[10];
	Aphase[n_AdCnt].Ok=0;
	Bphase[n_AdCnt].Ok=0;
	Cphase[n_AdCnt].Ok=0;
	Aphase[n_AdCnt].No=n_AdCnt;
	Bphase[n_AdCnt].No=n_AdCnt;
	Cphase[n_AdCnt].No=n_AdCnt;

	ClrAdClock();
	n_AdDelay=0;
	ReceiveSendCntDo();
}

//***************************************************//
void TX_StartAD(void)
{
	AdStartInit();
	if(RxTxBuffer[11]==1)
	{
		SetSingleAd();
		SetSingleAdV();
		ClrSingleAdF();
	}

	if(FlagSingleAd)
	{
		if(RxTxBuffer[12]==0)
		{
			ClrAdExtClk();
		}
		AdTotalCnt=1;
	}
	else
	{
		AdTotalCnt=RxTxBuffer[12];
		if(AdTotalCnt>MAXADTOTALCNT)
		{
			AdTotalCnt=MAXADTOTALCNT;
		}
	}

	if(RxTxBuffer[10]==DeviceNo)
	{
		if(AdTotalCnt>0)
		{
			n_AdDelay=FIRSTTIME;
			SetAdClock();
		}

		RxTxBuffer[ 1]=DeviceNo;
		RxTxBuffer[10]=0;

		RxTxBuffer[ 9]=1;
		rxtx_size=12+1;
		SetTxStart();
	}
}

//***************************************************//
void TX_EndAD(void)
{
	SetRxOver();
	SetTxOver();
	ClrRxStart();
	ClrTxStart();

	RxTxBuffer[ 0]=C_SYNC;
	RxTxBuffer[ 1]=DeviceNo;
	RxTxBuffer[ 7]=C_SYNC;
	RxTxBuffer[ 8]=0x89;
	RxTxBuffer[10]=0x01;

	RxTxBuffer[ 9]=1+0;
	rxtx_size=12+1+0;
	TX_HandSend();
}

//***************************************************//
void TX_WriteAddress(void)
{
	DeviceNo=RxTxBuffer[10];
	DeviceClass=RxTxBuffer[11];

	SpiWriteStatus(0x0);
	SpiWrite(&DeviceNo,EEDeviceNo,1);
	SpiWrite(&DeviceClass,EEDeviceClass,1);
	SpiWriteStatus(0xC);
	RxTxBuffer[ 1]=DeviceNo;

	RxTxBuffer[ 9]=0;
	rxtx_size=12+0;
	SetTxStart();
}

//***************************************************//
void TX_ReadAddress(void)
{
	SpiRead(&DeviceNo,EEDeviceNo,1);
	SpiRead(&DeviceClass,EEDeviceClass,1);

	RxTxBuffer[ 1]=DeviceNo;
	RxTxBuffer[10]=DeviceNo;
	RxTxBuffer[11]=DeviceClass;

	RxTxBuffer[ 9] =2+0;
	rxtx_size=12+2+0;
	SetTxStart();
}

//***************************************************//
//***************************************************//
void TX_ReadVF(void)
{
	UINT ch;
	T_AdRecord1 *pAdRecord;

	if(FlagAdHaveDone)
	{
		pAdRecord=(T_AdRecord1 *)&VoltFrequency;

		ch=pAdRecord->VoltDC_R.uint2.UINTDataH;
		RxTxBuffer[12]=HIGH8(ch);
		RxTxBuffer[13]= LOW8(ch);
		ch=pAdRecord->VoltDC_R.uint2.UINTDataL;
		RxTxBuffer[14]=HIGH8(ch);
		RxTxBuffer[15]= LOW8(ch);

		ch=pAdRecord->VoltAC_R1.uint2.UINTDataH;
		RxTxBuffer[16]=HIGH8(ch);
		RxTxBuffer[17]= LOW8(ch);
		ch=pAdRecord->VoltAC_R1.uint2.UINTDataL;
		RxTxBuffer[18]=HIGH8(ch);
		RxTxBuffer[19]= LOW8(ch);

		ch=pAdRecord->VoltAC_I1.uint2.UINTDataH;
		RxTxBuffer[20]=HIGH8(ch);
		RxTxBuffer[21]= LOW8(ch);
		ch=pAdRecord->VoltAC_I1.uint2.UINTDataL;
		RxTxBuffer[22]=HIGH8(ch);
		RxTxBuffer[23]= LOW8(ch);

		ch=pAdRecord->Frequency.uint2.UINTDataH;
		RxTxBuffer[24]=HIGH8(ch);
		RxTxBuffer[25]= LOW8(ch);
		ch=pAdRecord->Frequency.uint2.UINTDataL;
		RxTxBuffer[26]=HIGH8(ch);
		RxTxBuffer[27]= LOW8(ch);
	}
	else
	{
		for(ch=0;ch<16;ch++)
		{
			RxTxBuffer[12+ch]=0;
		}
	}

	RxTxBuffer[ 9] =16+2;
	rxtx_size=12+16+2;
	SetTxStart();
}

//***************************************************//
void TX_ReadState(void)
{
	RxTxBuffer[12]=1;

	RxTxBuffer[ 9] =1+2;
	rxtx_size=12+1+2;
	SetTxStart();
}

//***************************************************//
void TX_ReadData(UINT abc)
{
	UINT ch,i;
	UINT n_ReadAdCnt; 				// AD读记录号
	UINT n_XieBoCnt; 				// 谐波次数
	UINT *pAdRecord;

	n_ReadAdCnt=RxTxBuffer[12];
	if(n_ReadAdCnt>MAXADTOTALCNT)
		n_ReadAdCnt=MAXADTOTALCNT;
	n_XieBoCnt=RxTxBuffer[13];
	if(n_XieBoCnt>9)
		n_XieBoCnt=9;

	n_XieBoCnt=n_XieBoCnt*8;
	RxTxBuffer[ 9] =n_XieBoCnt+6+2;
	rxtx_size=12+n_XieBoCnt+6+2;

	switch(abc)
	{
		case 1:
			pAdRecord=(UINT *)&Aphase[n_ReadAdCnt];
			break;
		case 2:
			pAdRecord=(UINT *)&Bphase[n_ReadAdCnt];
			break;
		case 3:
			pAdRecord=(UINT *)&Cphase[n_ReadAdCnt];
			break;
		default:
			pAdRecord=(UINT *)&Aphase[n_ReadAdCnt];
	}

	if(FlagAdHaveDone)
	{
		RxTxBuffer[12]=*pAdRecord++;// 序号
		RxTxBuffer[13]=*pAdRecord++;// 有效性

		ch=*pAdRecord++; 			// 直流
		RxTxBuffer[16]=HIGH8(ch);
		RxTxBuffer[17]= LOW8(ch);
		ch=*pAdRecord++;
		RxTxBuffer[14]=HIGH8(ch);
		RxTxBuffer[15]= LOW8(ch);

		pAdRecord++;
		pAdRecord++;
		for(i=0;i<n_XieBoCnt;i+=4)
		{
			ch=*pAdRecord++;
			RxTxBuffer[20+i]=HIGH8(ch);
			RxTxBuffer[21+i]= LOW8(ch);
			ch=*pAdRecord++;
			RxTxBuffer[18+i]=HIGH8(ch);
			RxTxBuffer[19+i]= LOW8(ch);
		}
	}
	else
	{
		n_XieBoCnt+=6;
		for(i=0;i<n_XieBoCnt;i++)
		{
			RxTxBuffer[12+i]=0;
		}
	}

	SetTxStart();
}

//***************************************************//
void TX_ReadFile(UINT abc)
{
	UINT ch,i;
	UINT *pAdRecord;

	switch(abc)
	{
		case 1:
			pAdRecord=(UINT *)&AD_Adata;
			break;
		case 2:
			pAdRecord=(UINT *)&AD_Adata+64;
			break;
		case 3:
			pAdRecord=(UINT *)&AD_Bdata;
			break;
		case 4:
			pAdRecord=(UINT *)&AD_Bdata+64;
			break;
		case 5:
			pAdRecord=(UINT *)&AD_Cdata;
			break;
		case 6:
			pAdRecord=(UINT *)&AD_Cdata+64;
			break;
		default:
			pAdRecord=(UINT *)&AD_Adata;
	}

	if(FlagAdHaveDone)
	{
		for(i=0;i<MAXADTOTALDOT;i+=2)
		{
			ch=*pAdRecord++;
			RxTxBuffer[12+i]=HIGH8(ch);
			RxTxBuffer[13+i]= LOW8(ch);
		}
	}
	else
	{
		for(i=0;i<MAXADTOTALDOT;i++)
		{
			RxTxBuffer[12+i]=0;
		}
	}

	RxTxBuffer[ 9] =MAXADTOTALDOT+2;
	rxtx_size=12+MAXADTOTALDOT+2;
	SetTxStart();
}

//***************************************************//
void TX_ACK(void)
{
	RxTxBuffer[9]=0+2;
	rxtx_size=12+ 0+2;
}

//***************************************************//
void TX_HandSend(void)
{
	UINT	rtn_CRC;

	#if(!test)
		ADD33(&RxTxBuffer[10],RxTxBuffer[9]);
	#endif
	rtn_CRC=CalCRC16(&RxTxBuffer[0],(rxtx_size-2));
	RxTxBuffer[rxtx_size-2]=rtn_CRC;
	RxTxBuffer[rxtx_size-1]=C_ENDC;

	rxtx_ptr=0;
	rxtx_size++;

	SetTxStart();
	ClrTxOver();

	DisableRx();
	EnableTx();
	*SCITXBUF=0xFF;
}

//***************************************************//
UINT CalCRC16(UINT* ptr, UINT count)
{
	UINT	CRC16;

	CRC16 = 0;
	do
	{
		CRC16+=*ptr++;
	}
	while(--count > 0);
	return CRC16&0xff;
}

//***************************************************//
void ADD33(UINT* ptr, UINT count)
{
	if(count==0)
		return;
	do
	{
		*ptr+=0X33;
		*ptr&=0xff;
		ptr++;
	}
	while(--count > 0);
}

//***************************************************//
void SUB33(UINT* ptr, UINT count)
{
	if(count==0)
		return;
	do
	{
		*ptr-=0X33;
		*ptr&=0xff;
		ptr++;
	}
	while(--count > 0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -