Files
checker_slave/source/elec_det/interface/XTChecker.c

1429 lines
34 KiB
C
Raw Normal View History

#include "base/delay.h"
#include "hardware/adc_cfg.h"
#include "base/utility.h"
#include "hardware/power.h"
#include "driver/XTDriver.h"
#include "XTChecker.h"
#include "hardware/timer_cfg.h"
#define XT_CHECKER_RUN_BUF 56
uint8_t XT_Test_UID[13]="123456789ACDE";
uint8_t XT_Test_PWD[8]="FBCDabcd";
uint8_t XT_RunBuf[XT_CHECKER_RUN_BUF];
/*
@brief
@rtv 0 1 2
*/
static uint8_t XT_Test_CheckeThreeCode(void);
/*
@brief
*/
static uint8_t XT_Test_UID_PWD_Verify_(void);
/*
@brief , R10_0p1mA_1p6mA_UC
@param0 线
@param1 0.1ms
@param2 AD值
@rtv1 线AD值的时间
*/
void XT_Test_PowerOn(void)
{
uint8_t uc_rtv = 0;
uint16_t us_rsult[2];
uint16_t us_max;
uint16_t us_shake;
XTBUS_OFF;
uc_rtv = PowerCalibration_set(checker_runcfg.params[0],checker_runcfg.params[0]-1);
Power_SetSampleRange_Seep(Checker_PowerOn_Sample_R,ADC_SPEED_HIGH);
//POWER_ON
delay_os_ms(100);
XTBUS_ON;
delay_us(20);
us_rsult[1] = AD_GetChgEnergy(checker_runcfg.params[1],checker_runcfg.params[2], &us_max,&us_shake);
delay_os_ms(100);
us_rsult[0] = Power_GetBousV();
Checker_SetRtv(us_rsult,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
XT_Init(0x78);
}
/*
@brief 线
@param1 线
@rtv1 线
*/
void XT_Test_SetBusV(void)
{
uint8_t uc_rtv = 0;
uint16_t us_h_v,us_m_v;
us_h_v = checker_runcfg.params[0];
if(us_h_v < 55)
{
uc_rtv = 1;
}else{
us_m_v = 50;
uc_rtv |= PowerCalibration_set(us_h_v,us_m_v);
XTBUS_ON
// if(checker_runcfg.params[1] == 0)
// {
// XTBUS_ON;
// }else{
// HMOS_SWITCH_RW_1;
// }
us_m_v = ((us_h_v/80)+2)*60;
delay_ms(us_m_v);
us_h_v = Power_GetBousV();
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 线
@rtv1 线 0.01uA
*/
void XT_Test_BaseCur(void)
{
uint16_t ul_cur[2];
XTBUS_W_1
delay_ms(200);
ul_cur[0] = ADC_GetBaseStableCur();
XTBUS_W_0
delay_ms(100);
ul_cur[1] = ADC_GetBaseStableCur();
XTBUS_W_1
delay_ms(50);
// if(ul_cur[0] < 100 || ul_cur[1] < 100)
// {
// __disable_irq();
// while(1){};
// }
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(ul_cur,checker_runcfg.rtv_count);
}
/*
@brief 线 1
@param0 UID长度
@param1 使 UID对比
*/
void XT_Test_ScanUID(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
uint16_t us_temp[12];
XT_Clear_Read();
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[0] == 0)
{
checker_runcfg.params[0] = checker_runcfg.uid_len;
if(checker_runcfg.params[0] == 0)
{
checker_runcfg.params[0] = 7;
}
}
uc_rtv = XT_Read_Uid(XT_RunBuf,checker_runcfg.params[0]);
if(checker_runcfg.params[1] > 0)
{
for(uc_count = 0; uc_count < checker_runcfg.params[0];uc_count++)
{
if(checker_runcfg.writeuid[uc_count] != XT_RunBuf[uc_count])
{
uc_rtv |= 0x01;
}
}
}
uc_count = 0;
if(uc_rtv == 0)
{
checker_runcfg.uid_len = checker_runcfg.params[0];
memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len);
uc_count = (checker_runcfg.params[0]+8+1)/2;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
memcpy(us_temp,XT_RunBuf,24);
Checker_SetRtv(us_temp,checker_runcfg.rtv_count);
}
/*
@brief
@param0 UID长度
@param1
@param2
@param4
*/
void XT_Test_WriteChipCfg(void)
{
uint8_t uc_rtv = 0;
XT_RunBuf[0] = (((checker_runcfg.params[0] & 0x0F)-7) << 4) & 0xF0;
XT_RunBuf[0] += ((checker_runcfg.params[1] - 4) & 0x0F) ;
XT_RunBuf[1] = 0x8C;//((checker_runcfg.params[2] & 0x0F) << 2) & 0xF0;
XT_RunBuf[2] = checker_runcfg.params[3];
uc_rtv = XT_Write_Config(XT_RunBuf);
checker_runcfg.uid_len = (uint8_t)checker_runcfg.params[0];
checker_runcfg.pwd_len = (uint8_t)checker_runcfg.params[1];
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@param0 UID长度
@param1
@param2
@param4
*/
void XT_Test_CheckChipCfg(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
memset(XT_RunBuf,0,10);
XT_RunBuf[0] = (((checker_runcfg.params[0] & 0x0F)-7) << 4) & 0xF0;
XT_RunBuf[0] += ((checker_runcfg.params[1] - 4) & 0x0F) ;
XT_RunBuf[1] = 0x8C;//((checker_runcfg.params[2] & 0x0F) << 2) & 0xF0;
XT_RunBuf[2] = checker_runcfg.params[3];
uc_rtv = XT_Read_Config(XT_RunBuf+5);
for(uc_count = 0; uc_count < 3; uc_count++)
{
if(XT_RunBuf[uc_count] != XT_RunBuf[6+uc_count])
{
uc_rtv |= 0x01;
}
}
XT_RunBuf[1] = XT_RunBuf[2];//验证密码/UID 和版本号
if(XT_Check_Config(XT_RunBuf) == 0)
{
checker_runcfg.uid_len = (uint8_t)checker_runcfg.params[0];
checker_runcfg.pwd_len = (uint8_t)checker_runcfg.params[1];
}else{
uc_rtv |= 0x01;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief ,
*/
void XT_Test_BindTestCode(void)
{
uint8_t uc_rtv = 0;
if(checker_runcfg.uid_len == 0)
{
checker_runcfg.uid_len = 7;
}
memcpy(XT_RunBuf,XT_Test_UID,checker_runcfg.uid_len);
uc_rtv = XT_Write_Uid(XT_RunBuf, checker_runcfg.uid_len);
if(uc_rtv == 0)
{
memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len);
}
if(checker_runcfg.pwd_len == 0)
{
checker_runcfg.pwd_len = 7;
}
memcpy(XT_RunBuf,XT_Test_PWD,checker_runcfg.pwd_len);
uc_rtv |= XT_Write_Bmid(XT_RunBuf, checker_runcfg.pwd_len);
if(uc_rtv == 0)
{
memcpy(checker_runcfg.writepwd,XT_RunBuf,checker_runcfg.pwd_len);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@param0
@param1 线,AD值
@param2 0.1uA
@param3 ,100ms
@param4 0.1s
@rtv0 0.1ms
@rtv1 0.1uA
@rtv2 0.1Ma
@rtv3 adv
*/
void XT_Test_ChgEnergy(void)
{
uint8_t uc_charge_class = checker_runcfg.params[0];
uint16_t us_sample_timeout = checker_runcfg.params[1];
uint16_t us_adend = checker_runcfg.params[2];
uint16_t us_chgend_cur = checker_runcfg.params[3];
uint16_t us_timeout = checker_runcfg.params[4];
uint32_t ul_holdtime = checker_runcfg.params[5];
uint16_t us_array[4];
uint16_t us_energy = 0;
uint16_t us_end_cur = 2000;
uint16_t us_max_cur = 0;
uint16_t us_shake = 65535;
uint32_t ul_temp;
uint8_t uc_rtv = 0;
XT_Init(0x78);
XT_Charge_All(uc_charge_class);
if(us_adend > 10)
{
Power_SetSampleRange_Seep(XTChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH);
delay_ms(1);
us_energy = AD_GetChgEnergy(us_sample_timeout,us_adend,&us_max_cur,&us_shake);
us_max_cur = ( Power_ConvCur(us_max_cur,XTChecker_ChgEnger_Sample_R) /100+5)/10;
ADC_CurChnnelSet(AN_MAL_CH, ADC_SPEED_MIDLE);
ul_temp = AD_CurMonitor(ul_holdtime*1000);
if(ul_temp > us_shake)
{
us_shake = ul_temp;
}
}else{
us_shake = 0;
us_max_cur = 0;
us_energy = 0;
}
us_timeout++;
us_array[0] = ADC_GetBaseStableCur();
us_array[1] = ADC_GetBaseStableCur();
us_array[2] = ADC_GetBaseStableCur();
while(us_timeout > 0)
{
us_array[3] = ADC_GetBaseStableCur();
Bubble_Sort_u16(us_array,3);
us_end_cur = us_array[0];
if(us_end_cur < us_chgend_cur )
{
break;
}
us_timeout--;
}
// if(us_end_cur > us_chgend_cur)
// {
// uc_rtv = 1;
// }
CurrentSampleR_Def;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
us_array[0] = us_energy;
us_array[1] = us_end_cur;
us_array[2] = us_max_cur;
us_array[3] = us_shake;
Checker_SetRtv(us_array,checker_runcfg.rtv_count);
}
/*
@brief ,UID已经写入
@param 0
@param 1
@param 2
*/
void XT_Test_WriteRunField(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
XT_RunBuf[0] = 0xFF & (checker_runcfg.params[0] >> 8);
XT_RunBuf[1] = 0xFF & (checker_runcfg.params[0]);
XT_RunBuf[2] = 0;
XT_RunBuf[3] = 0xFF & (checker_runcfg.params[1] >> 8);
XT_RunBuf[4] = 0xFF & (checker_runcfg.params[1]);
XT_RunBuf[5] = 0xFF & (checker_runcfg.params[2] >> 8);
XT_RunBuf[6] = 0xFF & (checker_runcfg.params[2]);
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Write_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
delay_os_ms(40);
uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+10);
for(uc_count = 0; uc_count < 7; uc_count++)
{
if(XT_RunBuf[uc_count] != XT_RunBuf[uc_count+10])
{
uc_rtv |= 0x01;
}
}
}else{
uc_rtv = XT_Write_Field_All(XT_RunBuf);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@param0
@param1
@param2
@param3 1使 0
@rtv1
@rtv2
@rtv3
@rtv4
*/
void XT_Test_CheckRunField(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
uint16_t aus_temp[4];
uint32_t ul_temp;
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
XT_RunBuf[0] = 0xFF & (checker_runcfg.params[0] >> 8);
XT_RunBuf[1] = 0xFF & (checker_runcfg.params[0]);
XT_RunBuf[2] = 0;
XT_RunBuf[3] = 0xFF & (checker_runcfg.params[1] >> 8);
XT_RunBuf[4] = 0xFF & (checker_runcfg.params[1]);
XT_RunBuf[5] = 0xFF & (checker_runcfg.params[2] >> 8);
XT_RunBuf[6] = 0xFF & (checker_runcfg.params[2]);
if(checker_runcfg.uid_len == 0)
{
memset(aus_temp,0,8);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(aus_temp,checker_runcfg.rtv_count);
return;
}
if(checker_runcfg.params[3] > 0)
{
XT_FreeBack_Prapare(1);
}
uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+10);
ul_temp = Power_ConvCur(XT_FreeBackMaxCur, XTDriver_Sample_R); //通信电流
ul_temp = (ul_temp / 10+4)/10;//0.01mA
aus_temp[0] = ul_temp ;
aus_temp[1] = (uint16_t)((((XT_ADC_SAMPLE_TIME*1000)*XT_FreeBackMaxTime)/XT_Read_AD_Sample_C+400)/1000) ;
ul_temp = Power_ConvCur(XT_FreeBackMinCur, XTDriver_Sample_R); //通信电流
ul_temp = (ul_temp / 10+4)/10;//0.01mA
aus_temp[2] = ul_temp;
aus_temp[3] = (uint16_t)((((XT_ADC_SAMPLE_TIME*1000)*XT_FreeBackMinTime)/XT_Read_AD_Sample_C+400)/1000) ;
if(uc_rtv == 0)
{
for(uc_count = 0; uc_count < 7; uc_count++)
{
if(XT_RunBuf[uc_count] != XT_RunBuf[10+uc_count])
{
uc_rtv |= 0x01;
}
}
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(aus_temp,checker_runcfg.rtv_count);
}
/*
@brief ,uiduid方式通信
*/
void XT_Test_Resister(void)
{
uint16_t us_rtv = 0;
if(checker_runcfg.uid_len > 0)
{
us_rtv = XT_Get_UID_R(checker_runcfg.writeuid,checker_runcfg.uid_len);
}else{
us_rtv = XT_Get_R();
}
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_rtv,checker_runcfg.rtv_count);
}
/*
@brief ,uiduid方式通信
@param0
@param1
@rtv0 0.1uF
*/
void XT_Test_Cap(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp;
uint32_t ul_time_out = checker_runcfg.params[1] ;
float f_cap = 0.0f;
if(checker_runcfg.params[0] == 0)
{
checker_runcfg.params[0] = 0x11;//默认1V挡位
}
if(ul_time_out == 0)
{
ul_time_out = XTSingleCollectAckTimerOverflowCnt;
}
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Get_UID_C(checker_runcfg.writeuid,checker_runcfg.uid_len,checker_runcfg.params[0],ul_time_out,&f_cap);
}else{
uc_rtv = XT_Get_C(checker_runcfg.params[0],ul_time_out,&f_cap);
}
XT_Charge_All(0x00);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
us_temp = (uint16_t)(f_cap*10);
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
}
/*
@brief uiduid方式通信
@param
@param
*/
void XT_Test_WriteShell(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
if(0 != Checker_FacBufCheck())
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
//管壳号最长 13个字节
if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF) || checker_runcfg.params[1] > 13)
{
uc_rtv = 2;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]);
uc_rtv |= XT_Write_Shell(XT_RunBuf);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief UID
@param
@param
*/
void XT_Test_WriteUID(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF))
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
if(CheckCRC_8(&Checker_FacBuf[2],Checker_FacBuf[0]) != Checker_FacBuf[1])
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[1] > 13)
{
checker_runcfg.params[1] = 13;
}
memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]);
uc_rtv = XT_Write_Uid(XT_RunBuf,checker_runcfg.params[1]);
XT_Clear_Read();
uc_rtv |= XT_Read_Uid(XT_RunBuf+16,checker_runcfg.params[1]);
if(uc_rtv == 0)
{
for(uc_count = 0; uc_count < checker_runcfg.params[1];uc_count++)
{
if(XT_RunBuf[uc_count] != XT_RunBuf[16+uc_count])
{
uc_rtv |= 0x01;
}
}
}
if(uc_rtv == 0)
{
checker_runcfg.uid_len = checker_runcfg.params[1];
memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@param
@param
*/
void XT_Test_WritePWD(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_state;
if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF))
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
if(CheckCRC_8(&Checker_FacBuf[2],Checker_FacBuf[0]) != Checker_FacBuf[1])
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[1] > 13)
{
checker_runcfg.params[1] = 13;
}
memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]);
uc_rtv = XT_Write_Bmid(XT_RunBuf,checker_runcfg.params[1]);
uc_rtv |= XT_Check_Bmid(XT_RunBuf,checker_runcfg.params[1]);
if(checker_runcfg.uid_len > 0)
{
memset(XT_RunBuf+16,0,8);
uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+16);
uc_state = XT_RunBuf[16+7];
if( (uc_state & 0x20) == 0)
{
uc_rtv = 0x01;
}
}
if(uc_rtv == 0)
{
checker_runcfg.pwd_len = checker_runcfg.params[1];
memcpy(checker_runcfg.writepwd,XT_RunBuf,checker_runcfg.pwd_len);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief ,
@param0 0 1
@param1 1Bytes
@param1 1Bytes
*/
void XT_Test_CheckBackFlag(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp1;
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Read_Param(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
}else{
uc_rtv = XT_Read_Param_All(XT_RunBuf);
}
if(uc_rtv != 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
us_temp1 = XT_RunBuf[1];
if(checker_runcfg.params[0] == 0)
{
us_temp1 &= (~checker_runcfg.params[1]);
us_temp1 |= checker_runcfg.params[2];
XT_RunBuf[1] = 0x0FF & us_temp1;
uc_rtv |= XT_Write_Param(XT_RunBuf);
}
else{
us_temp1 = us_temp1 & checker_runcfg.params[1] ;
if(us_temp1 != checker_runcfg.params[2])
{
uc_rtv = 1;
}
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@rtv0 2
@rtv0 2
*/
void XT_Test_ReadBackFlag(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp[2];
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Read_Param(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
}else{
uc_rtv = XT_Read_Param_All(XT_RunBuf);
}
memcpy(us_temp,XT_RunBuf,4);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(us_temp,checker_runcfg.rtv_count);
}
/*
@brief
@param0 1 0
@param1
@param2
*/
void XT_Test_Trim(void)
{
uint8_t uc_rtv = 0;
if(checker_runcfg.params[0] > 0)
{
XT_Trim_Faset_Cycle(checker_runcfg.params[1],checker_runcfg.params[1]>>1);
}else{
XT_Trim_Complete_Cycle(checker_runcfg.params[1],checker_runcfg.params[1]>>1,checker_runcfg.params[2]);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void XT_Test_Discharge(void)
{
uint8_t uc_rtv = 0;
XT_Charge_All(0x00);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void XT_Test_EnCommEndCur(void)
{
XT_CommEndMaxCur = 0;
XT_CommEnd_CurEn = 1;
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void XT_Test_GetCommEndCur(void)
{
XT_CommEnd_CurEn = 0;
Checker_SetRtv((uint16_t *)&XT_CommEndMaxCur,checker_runcfg.rtv_count);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief 线
@param
*/
void XT_Test_OneLineCheck(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_temp;
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
uc_rtv = XT_Check_Online(400,XT_RunBuf);
if(checker_runcfg.params[0] > 400)
{
checker_runcfg.params[0] = 400;
}
if(checker_runcfg.params[1] > 400)
{
checker_runcfg.params[1] = 400;
}
if(checker_runcfg.params[0] > 0)
checker_runcfg.params[0]--;
uc_temp = checker_runcfg.params[0] >> 3;
uc_temp = XT_RunBuf[uc_temp] << (checker_runcfg.params[0] & 0x07);
if(uc_temp != 0x80)
{
uc_rtv = 0x01;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief ,UID已经存在使UID读取
@param0
@rtv0
*/
void XT_Test_CheckState(void)
{
uint8_t uc_rtv = 0;
uint16_t us_state = 0;
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
us_state = XT_RunBuf[7];
if((us_state & checker_runcfg.params[0]) != checker_runcfg.params[1])
{
uc_rtv = 1;
}
}else{
uc_rtv = 1;
us_state = 0;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_state,checker_runcfg.rtv_count);
}
/*
@brief
@param
@param
*/
void XT_Test_Boom(void)
{
uint8_t uc_rtv,uc_temp;
uint16_t us_index = 0;
uint16_t us_count = 0;
uint16_t us_res[2];
uint32_t ul_maxdelay = checker_runcfg.params[0];
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[1] == 0)
{
checker_runcfg.params[1] = 400;
}
uc_rtv = XT_Check_Fire_Each(checker_runcfg.params[1],XT_RunBuf);
for(us_index = 0; us_index < XT_CHECKER_RUN_BUF;us_index++)
{
if(XT_RunBuf[us_index] != 0)
{
uc_temp = XT_RunBuf[us_index];
us_res[1] = us_index*8;
while(uc_temp > 0)
{
us_res[1]++;
if((uc_temp & 0x80) > 0)
{
us_count++;
}
uc_temp <<= 1;
}
}
}
if(us_count != 1)
{
uc_rtv = 1;
}
uc_rtv |= XT_Check_Fire_All();
uc_rtv |= XT_MeasureFire(&ul_maxdelay);
us_res[0] = (uint16_t)ul_maxdelay;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(us_res,checker_runcfg.rtv_count);
}
/*
@brief
*/
void XT_Test_Reset(void)
{
uint8_t uc_rtv = 0;
XT_Reset();
delay_os_ms(40);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 线
*/
void XT_Test_PowerOFF(void)
{
uint8_t uc_rtv = 0;
XT_Charge_All(0x00);
delay_os_ms(100);
XTBUS_OFF;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void XT_Test_LockCmdC(void)
{
uint8_t uc_rtv = 0;
XT_Lock();
delay_ms(20);
XT_Clear_Read();
if(0 != XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len))
{
uc_rtv = 0x01;
}
else{
if((XT_RunBuf[checker_runcfg.uid_len+7] & 0x80) != 0x80)//锁存后是bit7 = 1;
{
uc_rtv = 0x01;
}
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void XT_Test_CodeBindEn(void)
{
uint8_t uc_rtv = 0;
checker_runcfg.uid_pwd_bind_flag = 0xAA;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
static uint8_t XT_Test_InputChek_(uint16_t us_count )
{
uint8_t uc_rtv = 0;
uint8_t uc_flag = 0;
uint32_t ul_timeout,ul_time;
Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE);
ul_timeout = us_count;
ul_timeout *= 100;
ul_time = 0;
Get10usCount();
while(ul_time <= ul_timeout )
{
ul_time += Get10usCount();
if(ADC_GetCurADCFast() > 25)
{
uc_flag++;
if(uc_flag > 50)
{
if( ADC_GetBaseStableCur() > 120)
{
Power_SetSampleCurrentRange(Current_Max) ;
delay_ms(2);
ul_time += Get10usCount();
XT_Clear_Read();
if( 0 == XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len))
{
break;
}else{
ul_time += 250000;
Get10usCount();//XT通信超时定时器也是使用tim2产生通信后需要请您
Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE);
delay_ms(1);
}
}else{
Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE);
delay_ms(1);
}
}else{
delay_ms(1);
}
continue;
}else{
delay_ms(1);
}
uc_flag = 0;
}
uc_rtv = 1;
if(uc_flag > 50)
{
uc_rtv = 0;
}
return uc_rtv;
}
/*
@brief
@param0
@param1
*/
void XT_Test_InputCheck(void)
{
uint8_t uc_rtv = 0;
uint16_t us_h_v = checker_runcfg.params[0];
uint16_t us_count = checker_runcfg.params[1];
us_h_v = checker_runcfg.params[0];
if(us_h_v < 55)
{
uc_rtv = 1;
}else{
uc_rtv |= PowerCalibration_set(us_h_v,50);
XTBUS_ON;
delay_ms(100);
us_h_v = Power_GetBousV();
}
uc_rtv = XT_Test_InputChek_(us_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
/*
@brief
*/
void XT_Test_CheckPWD(void)
{
uint8_t uc_rtv = 0;
if(checker_runcfg.pwd_len == 0)
{
checker_runcfg.pwd_len = 7;
}
uc_rtv = XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@rtv UID长度
@rtv
@rtv
@rtv
*/
void XT_Test_LoadChipCfg(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp[4];
memset(XT_RunBuf,0,10);
memset(us_temp,0,8);
uc_rtv = XT_Read_Config(XT_RunBuf);
if(uc_rtv == 0)
{
us_temp[0] = ((XT_RunBuf[1] >> 4) & 0x0F)+7;
us_temp[1] = (XT_RunBuf[1] & 0x0F)+4;
us_temp[2] = XT_RunBuf[3];
us_temp[3] = (XT_RunBuf[2] >> 2) & 0x0F;
checker_runcfg.uid_len = us_temp[0];
checker_runcfg.pwd_len = us_temp[1];
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(us_temp,checker_runcfg.rtv_count);
}
/*
@breif
@param0 0.1s
@rtv0
*/
void XT_Test_CapVoltage(void)
{
uint16_t us_capv1;
POWER_OFF;
Power_SetSampleCurrentRange(Checker_OnLine_Sample_R);
HMOS_FAST_DISCHG;
HMOS_SWITCH_GND;
delay_os_ms(1000);
us_capv1 = AD_SampleCap(checker_runcfg.params[0]);
POWER_ON;
delay_os_ms(500);
XTBUS_ON
Power_SetSampleCurrentRange(Current_Max);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_capv1,checker_runcfg.rtv_count);
}
/*
@brief
@rtv 0 1 2
*/
static uint8_t XT_Test_CheckeThreeCode(void)
{
uint8_t uc_index;
/*
*/
XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);//密码验证
XT_Clear_Read();
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len);//扫描UID
uc_index = XT_RunBuf[checker_runcfg.uid_len+7];
if((uc_index & 0x80) == 0x80)//已经上锁
{
if((uc_index & 0xA0) != 0xA0)//已经上锁,密码验证失败
{
return 0x01;
}
//已经上锁但UID比对错误
if(rt_memcmp(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len) != 0)
{
return 0x01;
}
//已经上锁,比对成功
XTBUS_OFF;
return 0;
}
return 2;
}
/*
@brief
*/
void XT_Test_UID_PWD_Bind(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_count = 0;
uint8_t uc_optbuf[16];
uint32_t ul_write_mask = 0;
if(JQXT_Test_IsNeedBind() == 0)
{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
uc_rtv = XT_Test_CheckeThreeCode();
if(uc_rtv != 2)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
uc_rtv = XT_Write_Uid(checker_runcfg.writeuid,checker_runcfg.uid_len);
delay_ms(40);
uc_rtv |= XT_Write_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@rtv 0 1 UID验证不通过 2
*/
static uint8_t XT_Test_UID_PWD_Verify_(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_state;
XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);
XT_Clear_Read();
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len);
uc_rtv = rt_memcmp(checker_runcfg.writeuid , XT_RunBuf,checker_runcfg.uid_len);
if(uc_rtv != 0)
{
return 0x01;
}
uc_state = XT_RunBuf[checker_runcfg.uid_len+7];
if((uc_state & 0x20) == 0)
{
uc_rtv = 0x02;
}
return uc_rtv;
}
/*
@brief
*/
void XT_Test_UID_PWD_Verify(void)
{
uint8_t uc_rtv = XT_Test_UID_PWD_Verify_();
if(uc_rtv != 0)
{
uc_rtv = 0x01;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@breif 线
@param0 线
@param1 1ms 6S
@param2 UID长度
*/
void XT_OnLine_SCAN(void)
{
uint16_t us_h_v;
uint8_t uc_rtv = 0;
PowerCalibration_set(checker_runcfg.params[0],50);
XTBUS_ON;
delay_os_ms(100);
us_h_v = Power_GetBousV();
if((us_h_v > (checker_runcfg.params[0]+5)) || (us_h_v < (checker_runcfg.params[0]-5)))
{
XTBUS_OFF;
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
if(0 != XT_Test_InputChek_(checker_runcfg.params[1]))
{
XTBUS_OFF;
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
delay_ms(10);
XT_Init(0x78);
XT_Clear_Read();
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[2] == 0)
{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
return;
}
uc_rtv = XT_Read_Uid(XT_RunBuf,checker_runcfg.params[2]);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
/*
@brief 线
@param0 1ms
@param1 线 0.1uA
@param2
*/
void XT_OFFLine_SCAN(void)
{
uint32_t ul_timeout = checker_runcfg.params[0];
uint16_t us_cur = checker_runcfg.params[1];
uint16_t us_count = checker_runcfg.params[2];
uint16_t us_temp = 0,ul_time = 0;
ul_timeout *= 1000;
Get1usCount();
while((us_temp < us_count) && (ul_time < ul_timeout))
{
ul_time += Get1usCount();
if(us_cur >= ADC_GetBaseStableCur())
{
us_temp++;
continue;
}
us_temp = 0;
}
if(us_temp >= us_count)
{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
}
/*
@brief 线
@param0 使
@param1 10ms
@param2
*/
void XT_CurMonitor(void)
{
uint16_t us_charge_en = checker_runcfg.params[0];
uint32_t ul_timeout = checker_runcfg.params[1];
uint16_t us_count = checker_runcfg.params[2];
uint16_t us_temp = 0,ul_time = 0;
uint32_t ul_runTimer = 0,ul_cur,ul_1sCount;
ul_timeout *= 1000;
if(us_charge_en > 0)
{
XT_Charge_All(us_charge_en);
}
while(us_count > 0)
{
Get1usCount();
// ul_cur = Power_GetCurrent();
ul_cur = (uint32_t) (Get_Temperature()*100);
printf("CurM %d\r\n",ul_cur);
ul_runTimer= Get1usCount();
if((ul_runTimer+5) > ul_timeout)
{
continue;
}
ul_runTimer = ul_timeout - ul_timeout -5;
ul_1sCount = ul_runTimer / 1000000;
ul_runTimer = ul_runTimer - ul_1sCount*1000000;
while(ul_1sCount > 0)
{
delay_us(1000000);
}
delay_us(ul_runTimer);
}
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief uiduid方式通信
@param
@param
*/
void XT_Test_VerfyShell(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
uint8_t uc_index = 0;
uint16_t us_temp[7];
if(0 != Checker_FacBufCheck())
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
//管壳号最长 13个字节
if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF) || checker_runcfg.params[1] > 13)
{
uc_rtv = 2;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.uid_len > 0)
{
uc_rtv=XT_Read_Shell(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
if(uc_rtv) uc_rtv =3;
}else{
uc_rtv=XT_Read_Shell_All(XT_RunBuf);
if(uc_rtv) uc_rtv =4;
}
uc_index = checker_runcfg.params[0]+2;
for(uc_count = 0; uc_count < checker_runcfg.params[1];uc_count++)
{
if(Checker_FacBuf[uc_index++] != XT_RunBuf[uc_count])
{
uc_rtv =5;
break;
}
}
if(checker_runcfg.rtv_count > 7)
{
checker_runcfg.rtv_count = 7;
}
memcpy(us_temp,XT_RunBuf,checker_runcfg.rtv_count<<1);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(us_temp,checker_runcfg.rtv_count);
}
CheckerTask xttaskArray[CHECKER_MAXID_COUNT] ={
Checker_PowerPrapare, //0 电源准备
XT_Test_PowerOn, //1 上电充能
XT_Test_SetBusV, //2 设置总线电压
XT_Test_BaseCur, //3 获取总线电流
XT_Test_ScanUID, //4 扫描UID
XT_Test_WriteChipCfg, //5 写配置参数
XT_Test_CheckChipCfg, //6 验证配置
XT_Test_BindTestCode, //7 模拟注码
XT_Test_ChgEnergy, //8 充能统计
XT_Test_WriteRunField,//9 写现场值 网络id 延时
XT_Test_CheckRunField,//10比对现场值
XT_Test_Resister ,//11 桥丝通断检测
XT_Test_Cap ,//12 电容容量统计
Checker_WaitDelay ,//13 延时等待
XT_Test_WriteShell ,//14 写管壳号/工厂信息
XT_Test_WriteUID ,//15 写UID
XT_Test_WritePWD ,//16 写密码
XT_Test_CheckBackFlag ,//17 写入/检测备份区标志
XT_Test_ReadBackFlag ,//18 读取备份区数据
XT_Test_Trim ,//19 校准
XT_Test_EnCommEndCur ,//20 使能通讯末电流采集
XT_Test_GetCommEndCur ,//21 获取通讯末电流
XT_Test_Discharge ,//22 放电
XT_Test_OneLineCheck ,//23 在线检测
XT_Test_CheckState ,//24 状态检测
XT_Test_Boom ,//25 起爆
XT_Test_Reset ,//26 复位
XT_Test_PowerOFF ,//27 关总线
XT_Test_LockCmdC ,//28 芯片锁存
XT_Test_CodeBindEn ,//29 使能赋码设备
XT_Test_InputCheck ,//30 在线检测
XT_Test_CheckPWD ,//31 密码验证
XT_Test_LoadChipCfg ,//32 加载芯片配置
XT_Test_CapVoltage ,//33 电容压差测试
Checker_ResistorSample,//34 桥丝电阻测试
XT_Test_UID_PWD_Bind ,//35 检测过程中注码
XT_Test_UID_PWD_Verify,//36 验证注码
XT_OnLine_SCAN ,//37 模块在线检测
XT_Test_VerfyShell ,//38 验证管壳码
(void*)0 //数组结束
};
/*
@brief
@rtv 0
1
3 UID写入失败
4
5 UID失败
6 UID写入失败
7
8
9
*/
uint8_t XT_UID_PWD_Bind(void)
{
uint16_t us_h_v;
uint8_t uc_index = 0, uc_rtv = 0;
// 雷管厂代码为0时不锁定
uint8_t lock=checker_runcfg.writeuid[1];
uint8_t stat_check=0x20;
ThreeBindResult_flag = 0x00;
if(checker_runcfg.uid_pwd_bind_flag != 0xAA)
{
PowerCalibration_set(Checker_First_Set_Voltage,50);
XTBUS_ON;
delay_os_ms(100);
us_h_v = Power_GetBousV();
if((us_h_v > (Checker_First_Set_Voltage+5)) || (us_h_v < (Checker_First_Set_Voltage-5)))
{
XTBUS_OFF;
return 1;
}
if(0 != XT_Test_InputChek_(2000))
{
XTBUS_OFF;
return 8;
}
delay_ms(10);
XT_Init(0x78);
delay_ms(10);
}
/*
*/
uc_rtv = XT_Test_CheckeThreeCode();
if(uc_rtv == 0)
{
XTBUS_OFF;
ThreeBindResult_flag = 0x55;
return 0x55;
}
else if(uc_rtv == 1)
{
XTBUS_OFF;
return 0x09;
}
XT_Write_Uid(checker_runcfg.writeuid,checker_runcfg.uid_len);
delay_ms(40);
XT_Write_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);
delay_ms(40);
uc_rtv = XT_Test_UID_PWD_Verify_();
if(uc_rtv == 0x01)
{
XTBUS_OFF;
return 2;
}else if(uc_rtv == 0x02)
{
XTBUS_OFF;
return 4;
}
if(lock){
//设置电流挡位0x11 1档。锁定前必须执行该命令
XT_Set_Current(0x11);
delay_ms(30);
XT_Lock();
delay_ms(40);
stat_check=0xa0;//锁存后是0xa0
}
XT_Clear_Read();
if(0 != XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len))
{
XTBUS_OFF;
return 5;//扫描UID不存在
}
uc_rtv = rt_memcmp(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len);
if(uc_rtv != 0)
{
XTBUS_OFF;
return 6;
}
uc_index = XT_RunBuf[checker_runcfg.uid_len+7];
if((uc_index & stat_check) != stat_check)
{
XTBUS_OFF;
return 7;
}
ThreeBindResult_flag = 0x55;
XTBUS_OFF;
return 0x55;
}