📄 ping.c
字号:
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 + -