1280 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1280 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "XTDriver.h"
 | 
						||
#include "hardware/adc_cfg.h"
 | 
						||
#include "hardware/timer_cfg.h"
 | 
						||
volatile uint32_t XT_SquareCount = 0; 	//发送载波个数
 | 
						||
volatile uint16_t XT_FreeBackMaxCur,XT_FreeBackMinCur,XT_FreeBackMaxTime,XT_FreeBackMinTime,XT_CommEndMaxCur;
 | 
						||
volatile uint8_t 	XT_EnFreeBack_Test,XT_CommEnd_CurEn;
 | 
						||
volatile uint8_t XT_SendSquareFlag = 1;   	//发送方波标志
 | 
						||
volatile uint8_t XT_ReadUIDFlag = 1;		//扫描标志
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
#if XT_Read_AD_Sample_C > FIREBUS_ADC_BUF_LEN
 | 
						||
#error "JQDriver.c Firbus AD Sample BUFFER SIZE LIMIT"
 | 
						||
#else
 | 
						||
volatile uint16_t* XT_ADC_Buf = FireBus_ADC_Buf;//AD采样缓存区
 | 
						||
#endif
 | 
						||
 | 
						||
volatile uint8_t XT_ADCCollectStartFlag = 1;		//ADC采集标志
 | 
						||
 | 
						||
volatile uint32_t XT_ADC_BaseValue = 0;				//ADC采集最低电压
 | 
						||
volatile uint32_t XT_ADC_CollectValue_sum = 0;		//ADC采集电压和
 | 
						||
#define  XT_FreeBack_Noise  800
 | 
						||
 | 
						||
//static uint32_t XT_ADCCollectIncrementValue = XTCollectIncrementValue;
 | 
						||
//static uint32_t XT_ADCCollectSumValue = XTCollectSumValue;	
 | 
						||
//static uint32_t XT_TIMCollectTimerOverflowUs = XTCollectTimerOverflowUs;   
 | 
						||
 | 
						||
//static uint32_t XT_ADCSingleCollectAckValue = XTSingleCollectAckValue;
 | 
						||
 | 
						||
//static CurrentSample_Range_eu XT_CollectResistance = XTCollectResistance;
 | 
						||
 | 
						||
/*
 | 
						||
@brief 通信反码信息初始化
 | 
						||
*/
 | 
						||
void XT_FreeBack_Prapare(uint8_t enable_flag)
 | 
						||
{
 | 
						||
	XT_FreeBackMaxCur = 0;
 | 
						||
	XT_FreeBackMaxTime = 0;
 | 
						||
	XT_FreeBackMinCur = 0xFFFF;
 | 
						||
	XT_FreeBackMinTime = 0xFFFF;
 | 
						||
	XT_EnFreeBack_Test = enable_flag;
 | 
						||
}
 | 
						||
 | 
						||
static void XT_CommBegin()
 | 
						||
{
 | 
						||
	CurrentSampleR_Def;
 | 
						||
	//WaitDelayEnd(50);//5ms
 | 
						||
  //delay_ms(5);
 | 
						||
  delay_wait_untill_ms(5);
 | 
						||
}
 | 
						||
static void XT_CommEnd()
 | 
						||
{
 | 
						||
	uint16_t us_temp;
 | 
						||
	//StartDelayTime();
 | 
						||
  TimerCount_Off();
 | 
						||
  delay_wait_start();
 | 
						||
	if(XT_CommEnd_CurEn > 0)
 | 
						||
	{
 | 
						||
		delay_os_ms(10);
 | 
						||
		us_temp = ADC_Comm1p6mA_EndCur();
 | 
						||
		if(us_temp > XT_CommEndMaxCur)
 | 
						||
		{
 | 
						||
			XT_CommEndMaxCur = us_temp;
 | 
						||
		}
 | 
						||
	}
 | 
						||
	CurrentSampleR_Def;
 | 
						||
}
 | 
						||
 | 
						||
static void XT_SendBit(uint8_t bit)
 | 
						||
{
 | 
						||
	uint8_t i;
 | 
						||
	if( bit == XTBIT0 )
 | 
						||
	{
 | 
						||
		
 | 
						||
		for(i=0;i<5;i++)
 | 
						||
		{
 | 
						||
			XTBUS_W_0;
 | 
						||
			delay_us(XT_DAT_PLUS_T);
 | 
						||
			XTBUS_W_1;
 | 
						||
			delay_us(XT_DAT_PLUS_T);
 | 
						||
		}
 | 
						||
		delay_us(XT_BIT_DELAY);      //位结束符
 | 
						||
	}
 | 
						||
	else if( bit == XTBIT1)
 | 
						||
	{
 | 
						||
		for(i=0;i<3;i++)
 | 
						||
		{
 | 
						||
			XTBUS_W_0;
 | 
						||
			delay_us(XT_DAT_PLUS_T);
 | 
						||
			XTBUS_W_1;
 | 
						||
			delay_us(XT_DAT_PLUS_T);
 | 
						||
		}
 | 
						||
		
 | 
						||
		delay_us(XT_BIT_DELAY);      //位结束符
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
static void XT_SendData(uint8_t *DownData, uint8_t DownLength)
 | 
						||
{
 | 
						||
	uint8_t temp,i,j;
 | 
						||
	XT_CommBegin();
 | 
						||
	//发送数据
 | 
						||
	for(i=0;i<DownLength;i++)
 | 
						||
	{
 | 
						||
		temp = DownData[i] ;
 | 
						||
		for(j=0;j<8;j++)
 | 
						||
		{
 | 
						||
			XT_SendBit( (temp >> 7) & 0x01 );
 | 
						||
			temp <<= 1;
 | 
						||
		}
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
volatile uint8_t XT_Trim_Flag = 0;
 | 
						||
static void XT_TrimPlusCallback(uint8_t flag)
 | 
						||
{
 | 
						||
	if(flag == 1)
 | 
						||
	{
 | 
						||
		XTBUS_W_0;
 | 
						||
	}else if(flag > 1){
 | 
						||
		XTBUS_W_1;
 | 
						||
	}
 | 
						||
	XT_Trim_Flag = flag;
 | 
						||
}
 | 
						||
 | 
						||
static void XT_SendTrimSquare(uint16_t cycle,uint16_t duty,  uint32_t count)
 | 
						||
{
 | 
						||
	delay_us(XTCmdAndSquareUs);
 | 
						||
	FireBus_ClkAmend(cycle,duty,count,XT_TrimPlusCallback);
 | 
						||
	XT_Trim_Flag = 0;
 | 
						||
	while(XT_Trim_Flag != 3)
 | 
						||
	{
 | 
						||
		delay_ms(20);
 | 
						||
	}
 | 
						||
	
 | 
						||
}
 | 
						||
 | 
						||
/*
 | 
						||
@brief 直接反馈模式
 | 
						||
@param timeoutcnt 回读超时时间 单位0.1ms
 | 
						||
@param ConfirmAckCount ADC 采样确认个数
 | 
						||
@param *executiontime 
 | 
						||
*/
 | 
						||
static uint8_t XT_Get_Ack(uint32_t timeoutcnt, uint8_t ConfirmAckCount,uint32_t *executiontime)
 | 
						||
{
 | 
						||
	uint32_t  FeekValue=0,count=0;
 | 
						||
	uint32_t ul_readtime = 0,ul_runtime = 0;
 | 
						||
	uint8_t rtv = 1;
 | 
						||
	LED1_Out_On;
 | 
						||
	TimerCount_Init();
 | 
						||
	Get100usCount();	
 | 
						||
	Power_SetSampleRange_Seep(XTDriver_Sample_R,ADC_SPEED_HFAST);
 | 
						||
	//延时700us
 | 
						||
	delay_us(XTCmdAndSquareUs);	
 | 
						||
//	XT_ADC_BaseValue = 0;
 | 
						||
//	while(us_temp < 64)
 | 
						||
//	{
 | 
						||
//		XT_ADC_BaseValue += ADC_GetCurADCFast();
 | 
						||
//	}
 | 
						||
//	XT_ADC_BaseValue = (XT_ADC_BaseValue>>6) +  XT_FreeBack_Noise;
 | 
						||
	XT_ADC_BaseValue = XT_FreeBack_Noise;
 | 
						||
	while(1)             
 | 
						||
	{
 | 
						||
		FeekValue = ADC_GetCurADCFast();
 | 
						||
		if(FeekValue >= XT_ADC_BaseValue)
 | 
						||
		{
 | 
						||
			count++;
 | 
						||
		}
 | 
						||
		else
 | 
						||
		{
 | 
						||
			count=0;
 | 
						||
		}
 | 
						||
		if(count>=ConfirmAckCount)
 | 
						||
		{
 | 
						||
			*executiontime = ul_readtime + GetCountTimerCnt();
 | 
						||
			rtv = 0;
 | 
						||
			break;
 | 
						||
		}
 | 
						||
		ul_runtime = GetCountTimerCnt();
 | 
						||
		if(ul_runtime > 60000)
 | 
						||
		{
 | 
						||
			ul_readtime += Get100usCount();
 | 
						||
			ul_runtime = 0;
 | 
						||
		}
 | 
						||
		ul_runtime = ul_readtime+ul_runtime;
 | 
						||
		if(ul_runtime >= timeoutcnt){
 | 
						||
      // time out
 | 
						||
			rtv = 2;
 | 
						||
			break;
 | 
						||
    }
 | 
						||
	}
 | 
						||
	LED1_Out_Off;
 | 
						||
	XTBUS_IDLE;
 | 
						||
	Power_SetSampleCurrentRange(Current_Max);
 | 
						||
	XT_CommEnd();
 | 
						||
  if(rtv){
 | 
						||
    rtv=!0;
 | 
						||
  }
 | 
						||
	return rtv;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
static void XT_ReceiveData(uint8_t *UpData, uint32_t ReceiveBitLength)
 | 
						||
{	
 | 
						||
	uint8_t uc_data;
 | 
						||
	uint32_t ul_readcount,ul_adv_sum;
 | 
						||
	uint16_t us_adccount ,us_index,us_ack_count;
 | 
						||
	XTBUS_RWIDLE;
 | 
						||
	delay_us(XTCmdAndSquareUs);	
 | 
						||
	
 | 
						||
	Power_SetSampleRange_Seep(XTDriver_Sample_R,ADC_SPEED_HIGH);
 | 
						||
	
 | 
						||
	UpData[0] = 0;
 | 
						||
	XTBUS_WR_0;
 | 
						||
	delay_us(500);
 | 
						||
	ul_readcount = 0;
 | 
						||
	while( ul_readcount <  ReceiveBitLength)
 | 
						||
	{
 | 
						||
		if((ul_readcount & 0x07) == 0)
 | 
						||
		{
 | 
						||
			uc_data = 0;
 | 
						||
		}
 | 
						||
		XTBUS_WR_1;
 | 
						||
		delay_us(120);
 | 
						||
		for(us_adccount = 0; us_adccount < XT_Read_AD_Sample_C; us_adccount++)
 | 
						||
		{
 | 
						||
			XT_ADC_Buf[us_adccount] = ADC_GetCurADCFast();
 | 
						||
		}
 | 
						||
		XTBUS_WR_0;
 | 
						||
		
 | 
						||
		for(us_index = 3; us_index < us_adccount; us_index ++)
 | 
						||
		{
 | 
						||
			if((XT_ADC_Buf[us_index] < XT_FreeBack_Noise) && (XT_ADC_Buf[us_index-1] < XT_FreeBack_Noise))
 | 
						||
			{
 | 
						||
				break;
 | 
						||
			}
 | 
						||
			if((XT_ADC_Buf[us_index] < XT_ADC_Buf[us_index-2] ) && (XT_ADC_Buf[us_index-1] < XT_ADC_Buf[us_index-3]))
 | 
						||
			{
 | 
						||
				break;
 | 
						||
			}
 | 
						||
		}
 | 
						||
		if(us_index >= us_adccount)
 | 
						||
		{
 | 
						||
			delay_us(450);
 | 
						||
			continue;
 | 
						||
		}
 | 
						||
		us_ack_count = 0;
 | 
						||
		ul_adv_sum = 0;
 | 
						||
		while(us_index < us_adccount)
 | 
						||
		{
 | 
						||
			if(XT_ADC_Buf[us_index] > XT_FreeBack_Noise)
 | 
						||
			{
 | 
						||
				ul_adv_sum += XT_ADC_Buf[us_index];
 | 
						||
				us_ack_count++;
 | 
						||
			}else if(us_ack_count < 2)//连续两个大于2启动检测
 | 
						||
			{
 | 
						||
				ul_adv_sum = 0;
 | 
						||
				us_ack_count = 0;
 | 
						||
			}
 | 
						||
			us_index++;
 | 
						||
		}
 | 
						||
		
 | 
						||
		if(us_ack_count > 10)
 | 
						||
		{
 | 
						||
			
 | 
						||
			 ul_adv_sum = ul_adv_sum / us_ack_count;
 | 
						||
			if( XT_EnFreeBack_Test > 0 )
 | 
						||
			{
 | 
						||
				if(XT_FreeBackMaxCur == 0)
 | 
						||
				{
 | 
						||
					XT_FreeBackMaxCur = XT_FreeBackMinCur = ul_adv_sum;
 | 
						||
				}else if(ul_adv_sum > XT_FreeBackMaxCur){
 | 
						||
					XT_FreeBackMaxCur = ul_adv_sum;
 | 
						||
				}else if(ul_adv_sum < XT_FreeBackMinCur){
 | 
						||
					XT_FreeBackMinCur = ul_adv_sum;
 | 
						||
					
 | 
						||
				}
 | 
						||
				if(XT_FreeBackMaxTime == 0)
 | 
						||
				{
 | 
						||
					XT_FreeBackMaxTime = XT_FreeBackMinTime = us_ack_count;
 | 
						||
				}else if(us_ack_count > XT_FreeBackMaxTime)
 | 
						||
				{
 | 
						||
					XT_FreeBackMaxTime = us_ack_count;
 | 
						||
				}else if(us_ack_count < XT_FreeBackMinTime){
 | 
						||
					XT_FreeBackMinTime = us_ack_count;
 | 
						||
				}
 | 
						||
				
 | 
						||
			}
 | 
						||
			uc_data |= (0x80 >>  (ul_readcount & 0x07));
 | 
						||
		}
 | 
						||
		UpData[ul_readcount>>3] = uc_data;
 | 
						||
		ul_readcount++;
 | 
						||
		delay_us(300);
 | 
						||
		
 | 
						||
	}
 | 
						||
	XTBUS_RWIDLE
 | 
						||
	XT_CommEnd();
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
static void XT_ScanUID(uint8_t *UpData, uint32_t ReceiveBitLength)
 | 
						||
{
 | 
						||
	uint8_t uc_data;
 | 
						||
	uint32_t ul_readcount;
 | 
						||
	
 | 
						||
	uint16_t us_adccount,us_index2,us_index3;
 | 
						||
	uint16_t us_ack_count;
 | 
						||
	uint16_t us_sum1,us_sum2,us_minSum = 0xFFFF;
 | 
						||
	XTBUS_RWIDLE;
 | 
						||
	delay_us(XTCmdAndSquareUs);	
 | 
						||
 | 
						||
	Power_SetSampleRange_Seep(XTDriver_Sample_R,ADC_SPEED_HFAST);
 | 
						||
	
 | 
						||
	UpData[0] = 0;
 | 
						||
	XTBUS_WR_0;
 | 
						||
	delay_us(500);
 | 
						||
	ul_readcount = 0;
 | 
						||
	while( ul_readcount <  ReceiveBitLength)
 | 
						||
	{
 | 
						||
		if((ul_readcount & 0x07) == 0)
 | 
						||
		{
 | 
						||
			uc_data = 0;
 | 
						||
		}
 | 
						||
		XTBUS_WR_1;
 | 
						||
		delay_us(120);
 | 
						||
		us_sum1 = 0;
 | 
						||
		us_sum2 = 0;
 | 
						||
		for(us_adccount = 0; us_adccount < 8; us_adccount++)
 | 
						||
		{
 | 
						||
			XT_ADC_Buf[us_adccount] = ADC_GetCurADCFast();
 | 
						||
			if(us_adccount < 4)
 | 
						||
			{
 | 
						||
				us_sum1 += XT_ADC_Buf[us_adccount];
 | 
						||
				us_index2 = us_adccount;
 | 
						||
			}else{
 | 
						||
				us_sum2  += XT_ADC_Buf[us_adccount];
 | 
						||
				us_index3 = us_adccount;
 | 
						||
			}
 | 
						||
		}
 | 
						||
		
 | 
						||
		us_ack_count = 0;
 | 
						||
		
 | 
						||
		while(us_adccount < 160 && us_ack_count < 5)
 | 
						||
		{
 | 
						||
			if(us_sum1 < us_minSum)
 | 
						||
			{
 | 
						||
				us_minSum = us_sum1;
 | 
						||
			}
 | 
						||
			if(us_sum2 > (us_minSum + (XT_FreeBack_Noise << 2)))
 | 
						||
			{
 | 
						||
				us_ack_count++;
 | 
						||
			}else{
 | 
						||
				us_ack_count = 0;
 | 
						||
			}
 | 
						||
			us_sum1 -= XT_ADC_Buf[(us_index2-3)&0x07];
 | 
						||
			us_sum2 -= XT_ADC_Buf[(us_index3-3)&0x07];
 | 
						||
			us_adccount++;
 | 
						||
			XT_ADC_Buf[us_adccount & 0x07] = ADC_GetCurADCFast();
 | 
						||
			us_index2++;
 | 
						||
			us_index3++;
 | 
						||
			us_sum1 += XT_ADC_Buf[us_index2&0x07];
 | 
						||
			us_sum2 += XT_ADC_Buf[us_index3&0x07];
 | 
						||
			
 | 
						||
		}
 | 
						||
		if(us_ack_count < 5)
 | 
						||
		{
 | 
						||
			delay_us(600);
 | 
						||
			XTBUS_WR_0;
 | 
						||
			delay_us(300);
 | 
						||
		}else{
 | 
						||
			XTBUS_WR_0;
 | 
						||
			delay_us(800);
 | 
						||
			uc_data |= (0x80 >> (ul_readcount & 0x07));
 | 
						||
		}
 | 
						||
		UpData[ul_readcount>>3] = uc_data;
 | 
						||
		ul_readcount++;
 | 
						||
	}
 | 
						||
	XTBUS_RWIDLE
 | 
						||
	XT_CommEnd();
 | 
						||
}
 | 
						||
 | 
						||
static uint8_t XT_CalCRC(uint8_t data[], uint8_t length)
 | 
						||
{
 | 
						||
	uint8_t c=0,temp,crc[8] = {0},nextcrc[8] = {0};
 | 
						||
	uint8_t i,j,k;
 | 
						||
	for(i=0;i<length;i++)
 | 
						||
	{
 | 
						||
		for(j=0;j<8;j++)
 | 
						||
		{
 | 
						||
			temp = (data[i] >> (7-j)) & 0x1;
 | 
						||
			nextcrc[0] = temp ^ crc[7];
 | 
						||
			nextcrc[1] = temp ^ crc[0] ^ crc[7];
 | 
						||
			nextcrc[2] = temp ^ crc[1] ^ crc[7];
 | 
						||
			nextcrc[3] = crc[2];
 | 
						||
			nextcrc[4] = crc[3];
 | 
						||
			nextcrc[5] = crc[4];
 | 
						||
			nextcrc[6] = crc[5];
 | 
						||
			nextcrc[7] = crc[6];
 | 
						||
			for(k=0;k<8;k++)
 | 
						||
			{
 | 
						||
				crc[k] = nextcrc[k];
 | 
						||
			}
 | 
						||
		}
 | 
						||
	}
 | 
						||
	for(i=0;i<8;i++)
 | 
						||
	{
 | 
						||
		c += crc[i]<<i;
 | 
						||
	}
 | 
						||
	return c;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
uint8_t XT_Power_Init()
 | 
						||
{
 | 
						||
	uint8_t errorcode=0;
 | 
						||
	
 | 
						||
	if(PowerCalibration_set(XTREGISTERVOLTAGE, XTCOMMMEDIUMVOLTAGE))
 | 
						||
	{
 | 
						||
		errorcode |= 0x1;
 | 
						||
	}
 | 
						||
	
 | 
						||
	if(PowerCalibration_set(XTCOMMHIGHVOLTAGE, XTCOMMMEDIUMVOLTAGE))
 | 
						||
	{
 | 
						||
		errorcode |= 0x2;
 | 
						||
	}
 | 
						||
	
 | 
						||
	if(PowerCalibration_set(XTCHARGEINSTRUCTIONVOLTAGE, XTCOMMMEDIUMVOLTAGE))
 | 
						||
	{
 | 
						||
		errorcode |= 0x4;
 | 
						||
	}
 | 
						||
	
 | 
						||
	if(PowerCalibration_set(XTCHARGEVOLTAGE, XTCOMMMEDIUMVOLTAGE))
 | 
						||
	{
 | 
						||
		errorcode |= 0x8;
 | 
						||
	}
 | 
						||
	
 | 
						||
	Power_SetSampleCurrentRange(Current_Max);
 | 
						||
	
 | 
						||
	return errorcode;
 | 
						||
}
 | 
						||
 | 
						||
void XT_BUS_CTRL( uint8_t NewState )
 | 
						||
{
 | 
						||
	PowerCalibration_set(XTCOMMHIGHVOLTAGE, XTCOMMMEDIUMVOLTAGE);
 | 
						||
	if(NewState){
 | 
						||
		XTBUS_ON;
 | 
						||
	}else{
 | 
						||
		XTBUS_OFF;
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:写现场值
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID正确且CRC校验通过时,将编号值、延期值、孔位值写入EEPROM。载波反馈1表示收到指令。编号值长度为2字节,延期值长度为3字节,孔位值长度为2字节。
 | 
						||
//函数返回:雷管是否接收成功 0接收失败 / 1接收成功
 | 
						||
uint8_t XT_Write_Field(uint8_t *uid, uint8_t uidlen, uint8_t *field)
 | 
						||
{
 | 
						||
	uint8_t SData[22],RData[1];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDA_WRITE_FIELD;
 | 
						||
	memcpy(SData+1,uid,uidlen);
 | 
						||
	memcpy(SData+1+uidlen,field,7);
 | 
						||
	SData[uidlen+8] = XT_CalCRC(SData,uidlen+8);
 | 
						||
	XT_SendData(SData,9+uidlen);
 | 
						||
	XT_ReceiveData(RData,1);
 | 
						||
	
 | 
						||
	if(*RData & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:读现场值
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID正确且CRC校验通过时,读出编号值、延期值、孔位值、状态字节。编号值长度为2字节,延期值长度为3字节,孔位值长度为2字节,状态字节为1字节。反馈完成后会继续反馈一位1作为结束符。
 | 
						||
//函数返回:field存储编号值、延期值、孔位值、状态字节  0接收失败 / 1接收成功
 | 
						||
uint8_t XT_Read_Field(uint8_t *uid, uint8_t uidlen, uint8_t *field)
 | 
						||
{
 | 
						||
	uint8_t SData[15];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDA_READ_FIELD;
 | 
						||
	memcpy(SData+1,uid,uidlen);
 | 
						||
	SData[uidlen+1] = XT_CalCRC(SData,uidlen+1);
 | 
						||
	XT_SendData(SData,uidlen+2);
 | 
						||
	XT_ReceiveData(field,66);
 | 
						||
	if(*(field+8) & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:读管壳码
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID正确且CRC校验通过时,读出管壳码。管壳码长度为13字节。反馈完成后会继续反馈一位1作为结束符。
 | 
						||
//函数返回:管壳码  0接收失败 / 1接收成功
 | 
						||
uint8_t XT_Read_Shell(uint8_t *uid, uint8_t uidlen, uint8_t *shell)
 | 
						||
{
 | 
						||
	uint8_t SData[15];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDA_READ_SHELL;
 | 
						||
	memcpy(SData+1,uid,uidlen);
 | 
						||
	SData[uidlen+1] = XT_CalCRC(SData,uidlen+1);
 | 
						||
	XT_SendData(SData,uidlen+2);
 | 
						||
	//XT_ReceiveInit(106,1);
 | 
						||
	
 | 
						||
	XT_ReceiveData(shell,106);
 | 
						||
	if(*(shell+13) & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:读测量参数值
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID正确且CRC校验通过时,读出CCSC、AMP、R1、Rdson。这4个字段的长度均为1字节。反馈完成后会继续反馈一位1作为结束符。
 | 
						||
//函数返回:CCSC、AMP、R1、Rdson   0接收失败 / 1接收成功
 | 
						||
uint8_t XT_Read_Param(uint8_t *uid, uint8_t uidlen, uint8_t *param)
 | 
						||
{
 | 
						||
	uint8_t SData[15];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDA_READ_PARAM;
 | 
						||
	memcpy(SData+1,uid,uidlen);
 | 
						||
	SData[uidlen+1] = XT_CalCRC(SData,uidlen+1);
 | 
						||
	XT_SendData(SData,uidlen+2);
 | 
						||
	//XT_ReceiveInit(34,1);
 | 
						||
	XT_ReceiveData(param,34);
 | 
						||
	if(*(param+4) & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:测量药头电阻
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID正确且CRC校验通过时,打开药头电阻测量电路开关。
 | 
						||
//          等待40个载波后,发出ADC复位信号,再经过1个载波后,
 | 
						||
//          发出开始ADC采样信号,随后的8个载波中反馈ADC采样的值。
 | 
						||
//           然后再发出ADC复位信号,如上重复三次
 | 
						||
//函数返回:ADC采样值
 | 
						||
uint8_t XT_Measure_Res(uint8_t *uid, uint8_t uidlen, uint8_t *adcvalue)
 | 
						||
{
 | 
						||
	uint8_t SData[15],RData[9];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDA_MEASURE_RES;
 | 
						||
	memcpy(SData+1,uid,uidlen);
 | 
						||
	SData[uidlen+1] = XT_CalCRC(SData,uidlen+1);
 | 
						||
	XT_SendData(SData,uidlen+2);
 | 
						||
	
 | 
						||
	//XT_ReceiveInit(70,1);
 | 
						||
	
 | 
						||
	XT_ReceiveData(RData,70);
 | 
						||
	
 | 
						||
	*adcvalue = (RData[5]<<2) + (RData[6]>>6);
 | 
						||
	*(adcvalue+1) = (RData[6]<<4) + (RData[7]>>4);
 | 
						||
	*(adcvalue+2) = (RData[7]<<6) + (RData[8]>>2);
 | 
						||
	
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:测量储能电容
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID正确且CRC校验通过时,将电容电压比较器档位设定为LEVEL指定的档位,
 | 
						||
//          并打开恒流源开关,关闭放电开关进行充电。充电完成时发出反馈,并关闭恒流源开关,打开放电开关。
 | 
						||
//函数返回:充电时间
 | 
						||
uint8_t XT_Measure_Cap(uint8_t *uid, uint8_t uidlen, uint8_t level, uint32_t *chargetime)
 | 
						||
{
 | 
						||
	uint8_t SData[16];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDA_MEASURE_CAP;
 | 
						||
	memcpy(SData+1,uid,uidlen);
 | 
						||
	SData[uidlen+1] = level;
 | 
						||
	SData[uidlen+2] = XT_CalCRC(SData,uidlen+2);
 | 
						||
	XT_SendData(SData,uidlen+3);
 | 
						||
	
 | 
						||
	return XT_Get_Ack(*chargetime, XTConfirmAckCount, chargetime);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:单发充电
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID正确且CRC校验通过时,将电容电压比较器档位设定为LEVEL指定的档位,
 | 
						||
//         将当前充满电标志位复位,并打开充电开关,关闭放电开关进行充电。充电完成时发出反馈,并将曾充满电标志位、当前充满电标志位置位。
 | 
						||
//		    LEVEL:0x11-1V、0x22-4V、0x33-6V、0x44-10V、0x55-12V、0x66-14V、0x77-18V、0x88-22V、0x99-26V
 | 
						||
//函数返回:是否充满
 | 
						||
uint8_t XT_Charge_One(uint8_t *uid,uint8_t uidlen, uint8_t level,uint16_t busvoltage, uint8_t isgetack)
 | 
						||
{
 | 
						||
	uint8_t SData[16];
 | 
						||
	uint32_t chargetime=0;
 | 
						||
	uint8_t chargeresult =1;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDA_CHARGE;
 | 
						||
	memcpy(SData+1,uid,uidlen);
 | 
						||
	SData[uidlen+1] = level;
 | 
						||
	SData[uidlen+2] = XT_CalCRC(SData,uidlen+2);
 | 
						||
	XT_SendData(SData,uidlen+3);
 | 
						||
	
 | 
						||
	PowerCalibration_set(busvoltage,XTCOMMMEDIUMVOLTAGE);	//修改总线电压
 | 
						||
	
 | 
						||
	if(!isgetack || level == 0x00)
 | 
						||
	{
 | 
						||
		return 0;
 | 
						||
	}
 | 
						||
	
 | 
						||
	//XT_GetAckInit();
 | 
						||
 | 
						||
	chargeresult = XT_Get_Ack(XTSingleCollectAckTimerOverflowCnt, XTConfirmAckCount, &chargetime);
 | 
						||
	
 | 
						||
	return chargeresult;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/******************************************
 | 
						||
*
 | 
						||
* B类指令(广播指令)
 | 
						||
*
 | 
						||
*******************************************/
 | 
						||
 | 
						||
 | 
						||
//函数名称:清除已读状态
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID已读标志位复位。
 | 
						||
//函数返回:
 | 
						||
void XT_Clear_Read(void)
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_CLEAR_READH;
 | 
						||
	SData[1] = XT_CMDB_CLEAR_READL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:起爆
 | 
						||
//函数参数:
 | 
						||
//函数功能:若起爆密码验证通过标志位、延期标定完成标志位、曾充满电标志位均为1,
 | 
						||
//			则设置电容电压比较器档位为最低档位,并进入延期状态。延期倒计时归零时,进行起爆前反馈,然后逐位翻转起爆控制信号。之后进行起爆后反馈。若上述标志位不均为1,则对芯片进行复位,效果同软件复位指令相同
 | 
						||
//函数返回:
 | 
						||
void XT_Fire()
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_FIREH;
 | 
						||
	SData[1] = XT_CMDB_FIREL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
uint8_t XT_FireandCheck(uint8_t *delay)			//delay 3字节  最大的延期时间
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	uint8_t fireresult = 1;
 | 
						||
	uint32_t timeout=0;
 | 
						||
	uint32_t delay_max=0;
 | 
						||
	
 | 
						||
	delay_max = (*delay<<16) + (*(delay+1)<<8) + (*(delay+2));
 | 
						||
	
 | 
						||
	timeout = delay_max*10+5000;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_FIREH;
 | 
						||
	SData[1] = XT_CMDB_FIREL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
	
 | 
						||
	fireresult = XT_Get_Ack(timeout, 2, &delay_max);
 | 
						||
	return fireresult;
 | 
						||
}
 | 
						||
 | 
						||
uint8_t XT_MeasureFire(uint32_t *delay)	
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	uint8_t fireresult = 1;
 | 
						||
	uint32_t timeout=0;
 | 
						||
	uint32_t delay_max=0;
 | 
						||
	
 | 
						||
	delay_max = *delay+2;
 | 
						||
	
 | 
						||
	timeout = delay_max*10+5000;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_FIREH;
 | 
						||
	SData[1] = XT_CMDB_FIREL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
	
 | 
						||
	fireresult = XT_Get_Ack(timeout, 2, delay);
 | 
						||
	return fireresult;
 | 
						||
}
 | 
						||
 | 
						||
//函数名称:初始化
 | 
						||
//函数参数:
 | 
						||
//函数功能:初始化寄存器。
 | 
						||
//函数返回:
 | 
						||
void XT_Init(uint8_t regdata)
 | 
						||
{
 | 
						||
	uint8_t SData[3];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_INITH;
 | 
						||
	SData[1] = XT_CMDB_INITL;
 | 
						||
	SData[2] = regdata;
 | 
						||
	XT_SendData(SData,3);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:软件复位
 | 
						||
//函数参数:
 | 
						||
//函数功能:对芯片进行复位,2,000时钟周期后可以继续接收指令。
 | 
						||
//函数返回:
 | 
						||
void XT_Reset()
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_RESETH;
 | 
						||
	SData[1] = XT_CMDB_RESETL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:扫描
 | 
						||
//函数参数:
 | 
						||
//函数功能:读出UID、编号值、延期值、孔位值、状态字节。使用防冲突机制,当重复发送该指令时,所有在线的雷管会按照UID顺序从大到小依次反馈。
 | 
						||
//			指令码长度为2字节,UID长度为7~13字节,编号值长度为2字节,延期值长度为3字节,孔位值长度为2字节,状态字节长度为1字节
 | 
						||
//函数返回:UID、编号值、延期值、孔位值、状态字节
 | 
						||
uint8_t XT_Read_Uid(uint8_t *uid, uint8_t uidlen)
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_READ_UIDH;
 | 
						||
	SData[1] = XT_CMDB_READ_UIDL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
	//XT_ReceiveData(uid,((uint32_t)uidlen<<3)+66);
 | 
						||
	XT_ScanUID(uid,((uint32_t)uidlen<<3)+66);
 | 
						||
	
 | 
						||
	if(*(uid+uidlen+8) & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:快速延期标定
 | 
						||
//函数参数:
 | 
						||
//函数功能:翻转信号接收模块的识别极性,起爆器会以正常通信相反的极性发送该指令,以控制极性识别错误的雷管恢复正确极性。
 | 
						||
//函数返回:
 | 
						||
void XT_Trim_Fast(void)
 | 
						||
{
 | 
						||
	XT_Trim_Faset_Cycle(1000,500);
 | 
						||
}
 | 
						||
void XT_Trim_Faset_Cycle(uint16_t cycle,uint16_t duty)
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_TRIM_FASTH;
 | 
						||
	SData[1] = XT_CMDB_TRIM_FASTL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
	
 | 
						||
	XT_SendTrimSquare(cycle,duty,1026);
 | 
						||
}
 | 
						||
 | 
						||
//函数名称:完整延期标定
 | 
						||
//函数参数:
 | 
						||
//函数功能:标定第1个方波下降沿至第(DELAY+1)个方波下降沿所对应的时钟周期数,并写入TIMER模块的计数器中。标定完成标志位置位。
 | 
						||
//函数返回:
 | 
						||
void XT_Trim_Complete(uint32_t delay_max)
 | 
						||
{
 | 
						||
	XT_Trim_Complete_Cycle(1000,500,delay_max);
 | 
						||
}
 | 
						||
void XT_Trim_Complete_Cycle(uint16_t cycle,uint16_t duty, uint32_t delay_max)
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_TRIM_COMPLETEH;
 | 
						||
	SData[1] = XT_CMDB_TRIM_COMPLETEL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
	
 | 
						||
	XT_SendTrimSquare(cycle,duty,delay_max);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:在线检测
 | 
						||
//函数参数:
 | 
						||
//函数功能:指令后发送数量等于最大编号值的方波,每发雷管对方波进行计数,在计数到自己的编号值所对应的方波时,反馈1
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Check_Online(uint16_t index_max, uint8_t *online)
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_CHECK_ONLINEH;
 | 
						||
	SData[1] = XT_CMDB_CHECK_ONLINEL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
	XT_ReceiveData(online, index_max+8);
 | 
						||
	
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:验证起爆密码
 | 
						||
//函数参数:
 | 
						||
//函数功能:验证起爆密码。验证正确时反馈并将起爆密码验证通过标志位置位,否则不反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Check_Bmid(uint8_t *bmid, uint8_t bmidlen)
 | 
						||
{
 | 
						||
	uint8_t SData[10],RData[1]={0};
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_CHECK_BMIDH;
 | 
						||
	SData[1] = XT_CMDB_CHECK_BMIDL;
 | 
						||
	
 | 
						||
	memcpy(SData+2,bmid,bmidlen);
 | 
						||
	XT_SendData(SData,2+bmidlen);
 | 
						||
	
 | 
						||
	XT_ReceiveData(RData, 1);
 | 
						||
	
 | 
						||
	if(*RData & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:获取全部验证状态
 | 
						||
//函数参数:
 | 
						||
//函数功能:若曾充满电标志位、延期标定完成标志位、起爆密码验证通过标志位均为1则不反馈,否则反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Check_Fire_All(void)
 | 
						||
{
 | 
						||
	uint8_t SData[2],RData[1]={0};
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_CHECK_FIRE_ALLH;
 | 
						||
	SData[1] = XT_CMDB_CHECK_FIRE_ALLL;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
	
 | 
						||
	XT_ReceiveData(RData, 1);
 | 
						||
	
 | 
						||
	if(*RData & 0x80)
 | 
						||
		return 1;
 | 
						||
	else
 | 
						||
		return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:逐发获取验证状态
 | 
						||
//函数参数:
 | 
						||
//函数功能:指令后发送数量等于最大编号值的方波。
 | 
						||
//          每发雷管对方波进行计数,在计数到自己的编号值所对应的方波时,
 | 
						||
//          若当前充满电标志位、延期标定完成标志位、起爆密码验证通过标志位均为1则反馈,否则不反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Check_Fire_Each(uint32_t index_max, uint8_t *check)
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_CHECK_FIRE_EACHH;
 | 
						||
	SData[1] = XT_CMDB_CHECK_FIRE_EACHL;
 | 
						||
	XT_SendData(SData,2);	
 | 
						||
	XT_ReceiveData(check, index_max);
 | 
						||
	
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:设置反馈电流大小
 | 
						||
//函数参数:
 | 
						||
//函数功能:CRC校验通过时,将SETTING常驻寄存器的[3:2]位改为LEVEL所指定的档位。不改变EEPROM。若要改变EEPROM,应使用写配置区指令。
 | 
						||
//函数返回:
 | 
						||
void XT_Set_Current(uint8_t level)
 | 
						||
{
 | 
						||
	uint8_t SData[3];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_SET_CURRENTH;
 | 
						||
	SData[1] = level;
 | 
						||
	SData[2] = XT_CalCRC(SData,2);
 | 
						||
	XT_SendData(SData,3);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:广播充电
 | 
						||
//函数参数:
 | 
						||
//函数功能:CRC校验通过时,将电容电压比较器档位设定为LEVEL指定的档位,将当前充满电标志位复位,
 | 
						||
//          并打开充电开关,关闭放电开关进行充电。充电完成时将曾充满电标志位、当前充满电标志位置位。
 | 
						||
//			LEVEL:0x11-1V、0x22-4V、0x33-6V、0x44-10V、0x55-12V、0x66-14V、0x77-18V、0x88-22V、0x99-26V
 | 
						||
//函数返回:
 | 
						||
void XT_Charge_All(uint8_t level)
 | 
						||
{
 | 
						||
	uint8_t SData[3];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_CHARGE;
 | 
						||
	SData[1] = level;
 | 
						||
	SData[2] = XT_CalCRC(SData,2);
 | 
						||
	XT_SendData(SData,3);
 | 
						||
}
 | 
						||
 | 
						||
//函数名称:检查配置区
 | 
						||
//函数参数:
 | 
						||
//函数功能:CRC校验通过时,若配置区中的UID/起爆密码长度及版本号两个字段同指令中的值相同则不反馈,否则反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Check_Config(uint8_t *config)
 | 
						||
{
 | 
						||
	uint8_t SData[4],RData[1]={0};
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDB_CHECK_CONFIG;
 | 
						||
	SData[1] = *(config);
 | 
						||
	SData[2] = *(config+1);
 | 
						||
	SData[3] = XT_CalCRC(SData,3);
 | 
						||
	XT_SendData(SData,4);
 | 
						||
	
 | 
						||
	XT_ReceiveData(RData, 1);
 | 
						||
	
 | 
						||
	if(*RData & 0x80)
 | 
						||
		return 1;
 | 
						||
	else
 | 
						||
		return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
/******************************************
 | 
						||
*
 | 
						||
* C类指令(测试指令)
 | 
						||
*
 | 
						||
*******************************************/
 | 
						||
 | 
						||
//函数名称:写UID
 | 
						||
//函数参数:
 | 
						||
//函数功能:将UID写入EEPROM。写入完成后有反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Write_Uid(uint8_t *uid, uint8_t uidlen)
 | 
						||
{
 | 
						||
	uint8_t SData[14];
 | 
						||
	uint32_t writetime=0;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_WRITE_UID;
 | 
						||
	memcpy(SData+1,uid,uidlen);
 | 
						||
	XT_SendData(SData,uidlen+1);
 | 
						||
		
 | 
						||
	return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:写起爆密码
 | 
						||
//函数参数:
 | 
						||
//函数功能:将起爆密码写入EEPROM。写入完成后有反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Write_Bmid(uint8_t *bmid, uint8_t bmidlen)
 | 
						||
{
 | 
						||
	uint8_t SData[9];
 | 
						||
	uint32_t writetime=0;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_WRITE_BMID;
 | 
						||
	memcpy(SData+1,bmid,bmidlen);
 | 
						||
	XT_SendData(SData,bmidlen+1);
 | 
						||
	return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:写管壳码
 | 
						||
//函数参数:
 | 
						||
//函数功能:将管壳码写入EEPROM。写入完成后有反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Write_Shell(uint8_t *shell)
 | 
						||
{
 | 
						||
	uint8_t SData[14];
 | 
						||
	uint32_t writetime=0;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_WRITE_SHELL;
 | 
						||
	memcpy(SData+1,shell,13);
 | 
						||
	
 | 
						||
	XT_SendData(SData,14);
 | 
						||
	
 | 
						||
	return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:写现场值_C
 | 
						||
//函数参数:
 | 
						||
//函数功能:将编号值、延期值、孔位值写入EEPROM。写入完成后有反馈。编号值长度为2字节,延期值长度为3字节,孔位值长度为2字节
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Write_Field_All(uint8_t *field)
 | 
						||
{
 | 
						||
	uint8_t SData[8];
 | 
						||
	uint32_t writetime=0;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_WRITE_FIELD;
 | 
						||
 | 
						||
	memcpy(SData+1,field,13);
 | 
						||
	
 | 
						||
	XT_SendData(SData,8);
 | 
						||
	
 | 
						||
	return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:写配置区
 | 
						||
//函数参数:
 | 
						||
//函数功能:将LEN、SETTING、REV写入EEPROM及相应的常驻寄存器。写入完成后有反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Write_Config(uint8_t *config)
 | 
						||
{
 | 
						||
	uint8_t SData[4];
 | 
						||
	uint32_t writetime=0;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_WRITE_CONFIG;
 | 
						||
	memcpy(SData+1,config,3);
 | 
						||
	XT_SendData(SData,4);
 | 
						||
	
 | 
						||
	return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:写测量参数值
 | 
						||
//函数参数:
 | 
						||
//函数功能:将CCSC、AMP、R1、Rdson写入EEPROM。写入完成后有反馈
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Write_Param(uint8_t *param)
 | 
						||
{
 | 
						||
	uint8_t i,SData[5];
 | 
						||
	uint32_t writetime=0;
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_WRITE_PARAM;
 | 
						||
	
 | 
						||
	for(i=0;i<4;i++)
 | 
						||
	{
 | 
						||
		SData[i+1] = *(param+i);
 | 
						||
	}
 | 
						||
	memcpy(SData+1,param,4);
 | 
						||
	
 | 
						||
	XT_SendData(SData,5);	
 | 
						||
	
 | 
						||
	return XT_Get_Ack(XTWriteBitTimerOverflowCnt, XTConfirmAckCount, &writetime);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:测量储能电容C
 | 
						||
//函数参数:
 | 
						||
//函数功能:UID正确且CRC校验通过时,将电容电压比较器档位设定为LEVEL指定的档位,并打开恒流源开关,关闭放电开关进行充电。充电完成时发出反馈,并关闭恒流源开关,打开放电开关。
 | 
						||
//函数返回:充电时间
 | 
						||
uint8_t XT_Measure_Cap_All(uint8_t level, uint32_t *chargetime)
 | 
						||
{
 | 
						||
	uint8_t SData[2];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_MEASURE_CAP;
 | 
						||
	SData[1] = level;
 | 
						||
	XT_SendData(SData,2);
 | 
						||
	return XT_Get_Ack(*chargetime, XTConfirmAckCount, chargetime);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:锁定
 | 
						||
//函数参数:
 | 
						||
//函数功能:向EEPROM中LOCK字段写入0x8B,锁定标志位置位。写入完成后有反馈。锁定后C类指令不再识别,仅可写入现场值
 | 
						||
//函数返回:
 | 
						||
void XT_Lock(void)
 | 
						||
{
 | 
						||
	uint8_t SData[1];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_LOCK;
 | 
						||
	XT_SendData(SData,1);
 | 
						||
	delay_us(700);
 | 
						||
	XTBUS_W_0;
 | 
						||
	delay_us(500);
 | 
						||
	XTBUS_W_1;
 | 
						||
	delay_os_ms(50);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:读测量参数值_C
 | 
						||
//函数参数:
 | 
						||
//函数功能:读出CCSC、AMP、R1、Rdson
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Read_Param_All(uint8_t *param)
 | 
						||
{
 | 
						||
	uint8_t SData[1];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_READ_PARAM;
 | 
						||
	XT_SendData(SData,1);
 | 
						||
	XT_ReceiveData(param, 34);
 | 
						||
	
 | 
						||
	if(*(param+4) & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:读配置区
 | 
						||
//函数参数:
 | 
						||
//函数功能:读出CKCFG、LEN、SETTING、REV
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Read_Config(uint8_t *config)
 | 
						||
{
 | 
						||
	uint8_t SData[1];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_READ_CONFIG;
 | 
						||
	XT_SendData(SData,1);
 | 
						||
	XT_ReceiveData(config, 34);
 | 
						||
	
 | 
						||
	if(*(config+4) & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:读管壳码_C
 | 
						||
//函数参数:
 | 
						||
//函数功能:读出管壳码。管壳码长度为13字节。反馈完成后会继续反馈一位1作为结束符
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Read_Shell_All(uint8_t *shell)
 | 
						||
{
 | 
						||
	uint8_t SData[1];
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_READ_SHELL;
 | 
						||
	XT_SendData(SData,1);
 | 
						||
	XT_ReceiveData(shell, 106);
 | 
						||
	
 | 
						||
	if(*(shell+13) & 0x80)
 | 
						||
		return 0;
 | 
						||
	else
 | 
						||
		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//函数名称:测量药头电阻_C
 | 
						||
//函数参数:
 | 
						||
//函数功能:收到指令时打开药头电阻测量电路开关。等待40个载波后,发出ADC复位信号,再经过1个载波后,发出开始ADC采样信号,随后的8个载波中反馈ADC采样的值。然后再发出ADC复位信号,如上重复三次
 | 
						||
//函数返回:
 | 
						||
uint8_t XT_Measure_Res_All(uint8_t *adcvalue)
 | 
						||
{
 | 
						||
	uint8_t SData[1],RData[9]={0};
 | 
						||
	
 | 
						||
	SData[0] = XT_CMDC_MEASURE_RES;
 | 
						||
	XT_SendData(SData,1);
 | 
						||
	XT_ReceiveData(RData, 70);
 | 
						||
	
 | 
						||
	*adcvalue = (RData[5]<<2) + (RData[6]>>6);
 | 
						||
	*(adcvalue+1) = (RData[6]<<4) + (RData[7]>>4);
 | 
						||
	*(adcvalue+2) = (RData[7]<<6) + (RData[8]>>2);
 | 
						||
	
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
uint8_t XT_Get_UID_R(uint8_t *uid, uint8_t uidlen)                    			//算桥丝电阻
 | 
						||
{
 | 
						||
	uint8_t adcvalue[3];
 | 
						||
	uint16_t qsadc=0,count=1;
 | 
						||
	
 | 
						||
	XT_Measure_Res(uid,uidlen,adcvalue);
 | 
						||
	
 | 
						||
	qsadc = adcvalue[1];
 | 
						||
	if(adcvalue[0]>0x00 && adcvalue[0]<0xF0)
 | 
						||
	{
 | 
						||
		qsadc += adcvalue[0];
 | 
						||
		count++;
 | 
						||
	}
 | 
						||
	if(adcvalue[2]>0x00 && adcvalue[2]<0xF0)
 | 
						||
	{
 | 
						||
		qsadc += adcvalue[2];
 | 
						||
		count++;
 | 
						||
	}
 | 
						||
	qsadc = qsadc / count;
 | 
						||
	return (qsadc & 0xFF);
 | 
						||
//	if(qsadc < 0xF0)
 | 
						||
//		return 0;
 | 
						||
//	else
 | 
						||
//		return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
uint8_t XT_Get_R()                    			//算桥丝电阻
 | 
						||
{
 | 
						||
	uint8_t adcvalue[3];
 | 
						||
	uint16_t qsadc=0,count=1;
 | 
						||
	
 | 
						||
	XT_Measure_Res_All(adcvalue);
 | 
						||
	
 | 
						||
	qsadc = adcvalue[1];
 | 
						||
	if(adcvalue[0]>0x00 && adcvalue[0]<0xF0)
 | 
						||
	{
 | 
						||
		qsadc += adcvalue[0];
 | 
						||
		count++;
 | 
						||
	}
 | 
						||
	if(adcvalue[2]>0x00 && adcvalue[2]<0xF0)
 | 
						||
	{
 | 
						||
		qsadc += adcvalue[2];
 | 
						||
		count++;
 | 
						||
	}
 | 
						||
	qsadc = qsadc / count;
 | 
						||
	return (qsadc & 0xFF);
 | 
						||
//	if(qsadc < 0xF0)
 | 
						||
//		return 0;
 | 
						||
//	else
 | 
						||
//		return 1;
 | 
						||
}
 | 
						||
 | 
						||
uint8_t XT_Get_UID_C(uint8_t *uid, uint8_t uidlen, uint8_t level, uint32_t time_out,float *CapacitanceValue)               //算储能电容
 | 
						||
{
 | 
						||
	uint8_t exeresult=1;
 | 
						||
	uint32_t chargetime=time_out;
 | 
						||
	uint8_t param[5]={0};
 | 
						||
	float CSCC=0;
 | 
						||
	
 | 
						||
	exeresult = XT_Measure_Cap(uid, uidlen, level, &chargetime);
 | 
						||
	if(exeresult)
 | 
						||
	{
 | 
						||
		return 1;
 | 
						||
	}
 | 
						||
	
 | 
						||
	__disable_irq();
 | 
						||
	delay_ms(10);
 | 
						||
	__enable_irq();
 | 
						||
	
 | 
						||
	exeresult = XT_Read_Param(uid,uidlen, param);
 | 
						||
	if(exeresult)
 | 
						||
	{
 | 
						||
		return 1;
 | 
						||
	}
 | 
						||
	
 | 
						||
	CSCC = 0.390625f * param[0] + 120;
 | 
						||
	
 | 
						||
	if(level == 0x11)
 | 
						||
	{
 | 
						||
		*CapacitanceValue = CSCC * chargetime  /10000.0f;
 | 
						||
	}
 | 
						||
	else if(level == 0x22)
 | 
						||
	{
 | 
						||
		*CapacitanceValue = CSCC * chargetime / 40000.0f;
 | 
						||
	}
 | 
						||
	else if(level == 0x33)
 | 
						||
	{
 | 
						||
		*CapacitanceValue = CSCC * chargetime / 100000.0f;
 | 
						||
	}
 | 
						||
	
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 | 
						||
uint8_t XT_Get_C(uint8_t level,uint32_t time_out ,float *CapacitanceValue)               //算储能电容
 | 
						||
{
 | 
						||
	uint8_t exeresult=1;
 | 
						||
	uint32_t chargetime=time_out;
 | 
						||
	uint8_t param[5]={0};
 | 
						||
	float CSCC=0;
 | 
						||
	
 | 
						||
	exeresult = XT_Measure_Cap_All(level, &chargetime);
 | 
						||
	if(exeresult)
 | 
						||
	{
 | 
						||
		return 1;
 | 
						||
	}
 | 
						||
	
 | 
						||
	delay_os_ms(20);
 | 
						||
	
 | 
						||
	exeresult = XT_Read_Param_All(param);
 | 
						||
	if(exeresult)
 | 
						||
	{
 | 
						||
		return 1;
 | 
						||
	}
 | 
						||
	
 | 
						||
	CSCC = 0.390625f * param[0] + 120;
 | 
						||
	
 | 
						||
	if(level == 0x11)
 | 
						||
	{
 | 
						||
		*CapacitanceValue = CSCC * chargetime  /10000.0f;
 | 
						||
	}
 | 
						||
	else if(level == 0x22)
 | 
						||
	{
 | 
						||
		*CapacitanceValue = CSCC * chargetime / 40000.0f;
 | 
						||
	}
 | 
						||
	else if(level == 0x33)
 | 
						||
	{
 | 
						||
		*CapacitanceValue = CSCC * chargetime / 100000.0f;
 | 
						||
	}
 | 
						||
	
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 |