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

📄 ping.c

📁 ST7540 Demo 下位机C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
				  DI;
				  Create_frame();
				  SPI_xor_Buffer(7);
				  EI;
				  Tx_Data(1,22,SPI_Buffer);
				  PING_Status = PS_START;
				  CDMA_flags=1;
				}	
				break;
			default:
				PING_Status = PS_STOP;
		}
	}
	
}

/**********************************************************************************
* PING_GetStatistics function: put Slave information on RS-232 buffer
**********************************************************************************/ 
void PING_GetStatistics(BYTE *Buffer)
{
	DI;
	*(Buffer) =    msg_num.field[1];
	*(Buffer+1) =  msg_num.field[2];
	*(Buffer+2) =  msg_num.field[3];		// Current message sequential number

	*(Buffer+3)  = ok_msg.field[1];
	*(Buffer+4) =  ok_msg.field[2];		
	*(Buffer+5) =  ok_msg.field[3];		// Total message OK

	*(Buffer+6) =  wrong_msg.field[1];		
	*(Buffer+7) =  wrong_msg.field[2];
	*(Buffer+8) =  wrong_msg.field[3];	// Total message FCS wrong 

	*(Buffer+9) =  corr_msg.field[1];
	*(Buffer+10) = corr_msg.field[2];
	*(Buffer+11) = corr_msg.field[3];	// number of messege corrected through FEC

	*(Buffer+12) =  more_msg.field[1];
	*(Buffer+13) =  more_msg.field[2];
	*(Buffer+14) =  more_msg.field[3];  	// message received more than once
	EI;
}				

void PING_Reset(void)
{
	msg_num.whole = 0;
	old_msg_num.whole   = 0;
	ok_msg.whole 		= 0;
	more_msg.whole		= 0;
	wrong_msg.whole		= 0;
	corr_msg.whole		= 0;
	rep_count = 0;
	CDMA_flags=1;
	Master_Stat[0]=0;
	Master_Stat[1]=0;
	Master_Stat[2]=0;
	Master_Stat[3]=0;
	Master_Stat[4]=0;
	Master_Stat[5]=0;
}

void HandleSlaveFrame(void)
{
  DI;
	Slave_Num = SPI_Buffer[0];
	Mast_Add  = SPI_Buffer[2];
	msg_num.field[1] = SPI_Buffer[4];
	msg_num.field[2] = SPI_Buffer[6];
	msg_num.field[3] = SPI_Buffer[8];
	repetition = SPI_Buffer[10];
	EI;
}

void Create_frame(void)                                        
{

	union {	
		unsigned char crc_char[2];
		unsigned int crc_int;  
	}	uni;

	SPI_Buffer[0] = 0xAA;								// preamble AAAAh
	SPI_Buffer[1] = 0xAA;								//
	SPI_Buffer[2] = 0xAA;								// preamble AAAAh
	SPI_Buffer[3] = 0xAA;								//

	if (PING_Flags & PF_MASTER) {
	//	MASTER
		SPI_Buffer[4] = 0x9b;							// header
		SPI_Buffer[5] = 0x58;          					//
		SPI_Buffer[6] = Slave_Add;						// slave addres 
		SPI_Buffer[7] = CRC(SPI_Buffer[6],0,8);			// FEC    
		SPI_Buffer[8] = Mast_Add;						// master addres
		SPI_Buffer[9] = CRC(SPI_Buffer[8],0,8);			// FEC             
	}
	else {
	//	SLAVE
		SPI_Buffer[4] = 0xE9;							// header
		SPI_Buffer[5] = 0x58;          					//
		SPI_Buffer[6] = Mast_Add ;	// master addres 
		SPI_Buffer[7] = CRC(SPI_Buffer[6],0,8);			// FEC    
		SPI_Buffer[8] = Slave_Add;						// slave addres
		SPI_Buffer[9] = CRC(SPI_Buffer[8],0,8);			// FEC             
	}


	SPI_Buffer[10] = msg_num.field[1];					// Message number 1
	SPI_Buffer[11] = CRC(SPI_Buffer[10],0,8);			// FEC
	SPI_Buffer[12] = msg_num.field[2];          		// Message number 2
	SPI_Buffer[13] = CRC(SPI_Buffer[12],0,8);			// FEC            
	SPI_Buffer[14] = msg_num.field[3];         			// Message number 3
	SPI_Buffer[15] = CRC(SPI_Buffer[14],0,8);			// FEC                    
	SPI_Buffer[16] = rep_count;
	
//	if ( !(PING_flags & CRC_OK) && !(PING_flags2 & FCS_wr) )
//		SPI_Buffer[16] |=  4;	 						// Auxiliary Byte 

	SPI_Buffer[17] = CRC(SPI_Buffer[16],0,8);			// FEC

	uni.crc_int = dll_CalcCRC(&SPI_Buffer[6],12);
	SPI_Buffer[18] = uni.crc_char[0];					// FCS first byte  
	SPI_Buffer[20] = uni.crc_char[1];        			// FCS second byte 
	SPI_Buffer[19] = CRC(SPI_Buffer[18],0,8); 			// FEC 
	SPI_Buffer[21] = CRC(SPI_Buffer[20],0,8); 			// FEC     

	
}                                                            


char Check_Ping_frame(void)                                         
{	
	unsigned char syndrom, index; 
	union 
	{	unsigned char crc_char[2];
	  	unsigned int crc_int;  
	} uni; 
	
	uni.crc_char[0] = SPI_Buffer[12];
	uni.crc_char[1] = SPI_Buffer[14];
	if ( (dll_CalcCRC(&SPI_Buffer[0],12)!= uni.crc_int) && (SPI_Buffer[0]!= 0xAA)) {
		// FCS doesn't match
		for (index=0;index<8;index++) {
			if (syndrom = CRC(SPI_Buffer[index*2+0],SPI_Buffer[index*2+1],8)) {
				uni.crc_int = CorectTab[syndrom];
				SPI_Buffer[index*2+0] ^= uni.crc_char[0];
				SPI_Buffer[index*2+1] ^= uni.crc_char[1];
				PING_Flags |= PF_FEC;
			}
		}
		uni.crc_char[0] = SPI_Buffer[12];
		uni.crc_char[1] = SPI_Buffer[14];                 

		if ( dll_CalcCRC(&SPI_Buffer[0],12) == uni.crc_int ) {
			// succesfull correction
		 	return (TRUE);
		}
		else {
			// unsuccesfull correction
		 	return (FALSE);
		}
	 } 
	 else  {
		// No correction needed
	 	return (TRUE);
	 }
}

void SetRS232Frame(unsigned char status)
{
	
  DI;
	Master_Stat[0] = Slave_Add;
	Master_Stat[1] = msg_num.field[1];
	Master_Stat[2] = msg_num.field[2];
	Master_Stat[3] = msg_num.field[3];
	Master_Stat[4] = status;
	Master_Stat[5] = rep_count;
	EI;	
}

void SPI_xor_Buffer(BYTE index)
{	unsigned char i;

	for (i=0;i<8;i++)
		SPI_Buffer[(i*2)+index] ^= 0xAA;

}


unsigned char bus_free(void)
{	
 switch (CDMA_Mode)
 {	 
	 case PD_: 									// CD_PD is forced LOW when preamble is detect
		 return (PADR & 0x80);
		 break;
	 case BU_: 									// BU line is forced HIGH when a signal is detect 
		 return (!(PBDR & 0x02));
		 break;
	 default: return (FALSE);
 }
}

//*********************************************************************************************
// Function that realize CDMA MODE
//*********************************************************************************************
unsigned char CDMA_acces(void)   
{	

  unsigned char i,  mask;
	unsigned char Random_slot;

 if (CDMA_Mode)									// if any medium access is choosen 
 {	

	if ( CDMA_flags == 1 )							// step 1  
	{	TIMEOUT_Refresh(timIntA);           			// refresh timer for Max Time Elapsed 
		CDMA_flags++;								// go to step 2
	}
//------------	
 	if ( (!(bus_free())) && (CDMA_flags == 2) )		// if step 2 and medium is not free	
	{	if ( TIMEOUT_Expired(timIntA) ) 	// check if max wait time elapsed
			return (TRUE);
 		else 
 		{	refresh_4mS_Delay();					// if no wait for 4ms
 		 	while(!(_4mS_Delay_Elapsed()))
 		 	    {
	        USB_Polling();
		      if (vUSB_Configuration)
				        VSP_Action();

 		 	    WatchDogRefresh();
 		 	    }
 		 	return (FALSE);
 		}
 	} 	
	else
		CDMA_flags++;								// go to step 3
//------------	

 	if ( CDMA_flags == 3 )							// 		
 	{
 	//  if (bus_free())                   //if bus is free, transmit data
 	//      return(TRUE);
 		mask = 0xff;
	 	Random_slot = (unsigned char)rand();        // get random number 

		while ( Random_slot > max_slots )		// restrict random number in area <0, MaxWaitSlot>
		{	Random_slot &= mask;
			mask = mask >> 1;
		}                   
		for (i=0;i<Random_slot;i++)					// wait Random_Slot x 4ms
		{	refresh_4mS_Delay(); 	
			while (!(_4mS_Delay_Elapsed()))
			  {
 		 	    USB_Polling();
		      if (vUSB_Configuration)
				        VSP_Action();
 		 	    WatchDogRefresh();
 		 	  }		
		}
		CDMA_flags++;		
	}
//------------
 	if ( CDMA_flags == 4 )							// refresh timer for Max Time Elapsed 
 	{	TIMEOUT_Refresh(timIntA);           
		CDMA_flags++;
	}
//------------	  

 	if (!bus_free() && (CDMA_flags == 5))            // if medium is not free 
	{	if ( TIMEOUT_Expired(timIntA) ) // check if Max Time elapsed
		{
			return (TRUE);
		}
 		else           
 		{	mask = 0xff;                            // get random number
			Random_slot = (unsigned char)rand();
			while (max_slots < Random_slot)     // restrict random number in area <0, MaxWaitSlot>
			{
				Random_slot &= mask;
				mask = mask >> 1;
			}                   
	 		for (i=0;i<Random_slot;i++)				// wait Random_Slot x 4ms 
 			{
 				refresh_4mS_Delay();
	 			while (!(_4mS_Delay_Elapsed()))
	 			  {
 		 	     USB_Polling();
		      if (vUSB_Configuration)
				        VSP_Action();
 		 	    WatchDogRefresh();
 		 	    }
	 		}
	 		return (FALSE);
	 	}
 	} 
 	else 
 	{	return (TRUE);
 	}        
//------------

 }
 else 
 	return (TRUE);
}

⌨️ 快捷键说明

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