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

1203 lines
26 KiB
C
Raw Normal View History

#include "driver/JQDriver.h"
#include "base/delay.h"
#include "hardware/adc_cfg.h"
#include "base/utility.h"
#include "hardware/power.h"
#include "JQChecker.h"
/*
@brief , R10_0p1mA_1p6mA_UC
@param0 线
@param1 0.1ms
@param2 AD值
@rtv1 线AD值的时间
*/
void JQ_Test_PowerOn(void)
{
uint8_t uc_rtv = 0;
uint16_t us_rsult[2];
uint16_t us_max;
uint16_t us_shake;
JQBUS_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);
JQBUS_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);
}
/*
@brief 线
@param1 线
@rtv1 线
*/
void JQ_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);
JQBUS_ON;
delay_ms(100);
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 JQ_Test_BaseCur(void)
{
uint16_t ul_cur[2];
JQBUS_W_1
delay_ms(250);
ul_cur[0] = ADC_GetBaseStableCur();
JQBUS_W_0
delay_ms(100);
ul_cur[1] = ADC_GetBaseStableCur();
JQBUS_W_1
delay_ms(20);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(ul_cur,checker_runcfg.rtv_count);
}
/*
@brief 线 1
@param0 使
@param1 1 uid数据全0验证
@rtv1
@rtv2
@rtv3
@rtv4
@rtv5 UID 2Bytes
@rtv6 UID 2Bytes
@rtv7 UID 2Bytes
@rtv8 UID 2Bytes
*/
void JQ_Test_ScanUID(void)
{
uint16_t aus_temp[8];
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_count = 0;
uint32_t ul_temp;
for(uc_count = 0; uc_count < 4; uc_count++)
{
aus_temp[uc_count] = 0x00;
}
for(uc_count = 4; uc_count < 8; uc_count++)
{
aus_temp[uc_count] = 0x55;
}
JQ_ScanUIDBegin();
if(checker_runcfg.params[0] > 0)
{
JQ_FreeBack_Prapare(1);
}
uc_ack = JQ_ScanReadUID(CHECKER_NET_ID,(uint8_t*)&aus_temp[4]);
// uc_rtv = JQ_ScanReadUID(checker_runcfg.jq_params[2],(uint8_t*)&aus_temp[4]);
if(uc_ack < 1)
{
uc_rtv = 1;
}
ul_temp = Power_ConvCur(JQ_FreeBack_MaxCur,JQDriver_Sample_R);
ul_temp = (ul_temp + 500)/1000;
aus_temp[0] = ul_temp ;
aus_temp[1] = (uint16_t)((((589u*1000)*JQ_FreeBack_MaxTime)/JQ_Read_AD_Sample_C+400)/1000) ;
ul_temp = Power_ConvCur(JQ_FreeBack_MinCur,JQDriver_Sample_R);
ul_temp = (ul_temp + 500)/1000;
aus_temp[2] = ul_temp;
aus_temp[3] = (uint16_t)((((589u*1000)*JQ_FreeBack_MinTime)/JQ_Read_AD_Sample_C+400)/1000) ;
if(checker_runcfg.params[1] == 0)
{
for(uc_count = 4; uc_count < 8; uc_count++)
{
if(aus_temp[uc_count] != 0x00)
{
uc_rtv |= 0x01;
}
}
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(aus_temp,checker_runcfg.rtv_count);
}
/*
@brief
@rtv 2
*/
void JQ_Test_ReadChipID(void)
{
uint8_t uc_rtv = 0;
uint16_t us_chipid;
uint8_t uc_ack;
uc_ack = JQ_ReadChipID(CHECKER_NET_ID,&us_chipid);
if(uc_ack < 1)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_chipid,checker_runcfg.rtv_count);
}
/*
@brief
@param0 使
*/
void JQ_Test_PWCheck(void)
{
uint8_t auc_pwd[4]={0,0,0,0};
uint8_t uc_count = 0,uc_ack = 0,uc_rtv = 0;
if(checker_runcfg.params[0] > 0)
{
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,11,4,auc_pwd);
if(uc_ack != 4)
{
uc_rtv = 1;
}
uc_ack = auc_pwd[3] ;
auc_pwd[3] = auc_pwd[0];
auc_pwd[0] = uc_ack;
uc_ack = auc_pwd[2] ;
auc_pwd[2] = auc_pwd[1];
auc_pwd[1] = uc_ack;
}
JQ_VerifyPWD(auc_pwd);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief OTP全0检测
@param0 UID区和密码区验证标志 1 0
@param1 1 0
@param2
*/
void JQ_Test_OTPCheck(void)
{
uint8_t uc_optbuf[16];
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_count = 0;
//出厂校准
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,0,1,uc_optbuf);
if(uc_ack !=1 || uc_optbuf[0] == 0xFF || uc_optbuf[0] == 0)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return ;
}
if(checker_runcfg.params[0] < 1)
{
uc_count = 0;
while(uc_count < 16)
{
uc_optbuf[uc_count++] = 0x55;
}
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,3,12,uc_optbuf);
if(uc_ack != 12)
{
uc_rtv = 1;
}
uc_count = 0;
while(uc_count < 12)
{
if(uc_optbuf[uc_count++] != 0)
{
uc_rtv = 1;
}
}
}
if(checker_runcfg.params[1] < 1)
{
uc_count = 0;
while(uc_count < 16)
{
uc_optbuf[uc_count++] = 0x55;
}
//延时区
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,15,2,uc_optbuf); //2Bytes
if(uc_ack != 2)
{
uc_rtv = 1;
}
//保留区 3-16损坏使用
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,17,3,uc_optbuf+2);//3Bytes
if(uc_ack != 3)
{
uc_rtv = 1;
}
//错误标记区
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,26,6,uc_optbuf+5);//6Bytes
if(uc_ack != 6)
{
uc_rtv = 1;
}
uc_count = 0;
//OTP31 30 特殊处理其高4bit不错比较
uc_optbuf[10] &= 0x0F;
uc_optbuf[9] &= 0x0F;
while(uc_count < 11)
{
if(uc_optbuf[uc_count++] != 0)
{
uc_rtv = 1;
}
}
}
if(checker_runcfg.params[2] < 1)
{
uc_count = 0;
while(uc_count < 16)
{
uc_optbuf[uc_count++] = 0x55;
}
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,4,uc_optbuf);
if(uc_ack != 4)
{
uc_rtv = 1;
}
uc_count = 0;
while(uc_count < 4)
{
if(uc_optbuf[uc_count++] != 0)
{
uc_rtv = 1;
}
}
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void JQ_Test_FTCheck(void)
{
uint16_t us_opt;
uint8_t uc_rtv = 0;
uint8_t uc_ack;
us_opt = 0x00;
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,24,2,(uint8_t*)&us_opt);
if(uc_ack != 2)
{
uc_rtv = 1;
}
if(us_opt != 0xFFFF)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@param0
*/
void JQ_Test_ReadState(void)
{
uint8_t state = 0x00;
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uc_ack = JQ_ReadState(CHECKER_NET_ID,&state);
if((state & checker_runcfg.params[0]) != checker_runcfg.params[0])
{
uc_rtv = 1;
}
if(uc_ack < 1)
{
uc_rtv = 1;
}
checker_runcfg.params[0] = state;
Checker_SetRtv(checker_runcfg.params,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief OTP数据
@param0 2OTP数据
@param1 2OTP数据
*/
void JQ_Test_WriteUserInfo(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_count = 0;
uint8_t uc_wcount ;
uint32_t ul_temp = 0;
uint32_t ul_write = checker_runcfg.params[1];
ul_write <<= 16;
ul_write |= checker_runcfg.params[0];
JQ_EnWOTP();
JQ_EnWOTP();
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,4,(uint8_t*)&ul_temp);
if(uc_ack < 1)
{
uc_rtv = 1;
}
uc_wcount = 0;
//要不全部为0要不除去低5位一致其他bits为0
if(ul_temp == 0)
{
uc_wcount = 4;
}
if((ul_temp & (~0x01Fu)) == 0)
{
if((ul_temp & 0x01Fu) == (ul_write & 0x01Fu))
{
uc_wcount = 4;
}
}
if(uc_wcount == 0 || uc_rtv == 1)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_wcount = JQ_WriteOTP(20,4,(uint8_t*)&ul_write);
if(uc_count != 4)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
ul_temp = 0;
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,4,(uint8_t*)&ul_temp);
if(uc_ack < 1)
{
uc_rtv = 1;
}
if(ul_temp != ul_write)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief OTP数据
@param0 OTP
@param1
@param2 2Bytes OTP数据
@param3 2Bytes OTP数据
@param4 2Bytes OTP数据
@param5 2Bytes OTP数据
*/
void JQ_Test_WriteOTP(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_count = 0;
uint8_t uc_wcount ;
uint8_t uc_otpaddr;
uint8_t* uc_pbuf;
uint8_t uc_optbuf[8];
JQ_EnWOTP();
JQ_EnWOTP();
uc_otpaddr = checker_runcfg.params[0];
uc_count = checker_runcfg.params[1];
if(uc_count > 8)
uc_count = 8;
uc_pbuf = (uint8_t*)(&checker_runcfg.params[2]);
uc_wcount = JQ_WriteOTP(uc_otpaddr,uc_count,uc_pbuf);
if(uc_wcount != uc_count)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpaddr,uc_count,(uint8_t*)uc_optbuf);
if(uc_ack < 1)
{
uc_rtv = 1;
}
for(uc_wcount = 0; uc_wcount < uc_count; uc_wcount++)
{
if(uc_optbuf[uc_wcount] != uc_pbuf[uc_wcount])
{
break;
}
}
if(uc_wcount != uc_count)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief OTP
@param0 OTP地址
@param1 OTP
*/
void JQ_Test_ReadOTP(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_count = 0;
uint8_t uc_wcount ;
uint8_t uc_otpaddr;
uint16_t uc_optbuf[16];
uc_otpaddr = checker_runcfg.params[0];
uc_count = checker_runcfg.params[1];
if((uc_otpaddr+uc_count) > 32)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpaddr,uc_count,(uint8_t*)uc_optbuf);
if(uc_ack < 1)
{
uc_rtv = 1;
}
Checker_SetRtv(uc_optbuf,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
@param0 0.1us
@param1 线,AD值
@param2 0.1uA
@param3 ,100ms
@param4 0.1s
@rtv0 0.1ms
@rtv1 0.1uA
@rtv2 0.1Ma
@rtv3 adv
*/
void JQ_Test_ChgEnergy(void)
{
uint16_t us_sample_timeout = checker_runcfg.params[0];
uint16_t us_adend = checker_runcfg.params[1];
uint16_t us_chgend_cur = checker_runcfg.params[2];
uint16_t us_timeout = checker_runcfg.params[3];
uint32_t ul_holdtime = checker_runcfg.params[4];
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;
JQ_Chage(0);
Power_SetSampleRange_Seep(JQChecker_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,JQChecker_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;
}
us_timeout++;
while(us_timeout > 0)
{
us_end_cur = ADC_GetBaseStableCur();
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 DAC检测
@param DAC检测的起始值
@param DAC检测的结束值
*/
void JQ_Test_CheckDAC(void)
{
uint16_t uc_bg_dac = checker_runcfg.params[0];
uint16_t uc_end_dac = checker_runcfg.params[1];
uint8_t uc_rtv = 1,uc_state;
while(uc_bg_dac >= uc_end_dac)
{
JQ_ChargJudge(uc_bg_dac);
uc_state = 0;
if( JQ_ReadState(CHECKER_NET_ID,&uc_state) < 1)
{
uc_bg_dac = 0;
uc_rtv = 1;
break;
}
if(uc_state & 0x80)
{
uc_rtv = 0;
break;
}
if(uc_bg_dac == 0)
{
break;
}
uc_bg_dac--;
}
if(uc_bg_dac < uc_end_dac)
{
uc_bg_dac = 0;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&uc_bg_dac,checker_runcfg.rtv_count);
}
/*
@brief
@param
*/
void JQ_Test_SetDelay(void)
{
uint16_t us_delaytime = checker_runcfg.params[0];
JQ_WriteDelay(CHECKER_NET_ID,us_delaytime);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief
@param
*/
void JQ_Test_ReadDelay(void)
{
uint8_t uc_rtv = 0;
uint16_t us_delaytime,us_temp;
uc_rtv = JQ_ReadDelay(CHECKER_NET_ID,&us_delaytime);
uc_rtv = uc_rtv < 1?1:0;
us_temp = (us_delaytime >> 8) & 0x0FF;
us_temp |= (us_delaytime << 8) & 0xFF00;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
}
/*
@brief
@param1
@param2
*/
void JQ_Test_ClkTrim(void)
{
uint16_t us_cycle = checker_runcfg.params[0];
uint16_t us_count = checker_runcfg.params[1];
JQ_TimeAmend(us_cycle,us_count);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief JQ2012才有
@param0 0 1
@param1
*/
void JQ_Test_Discharge(void)
{
uint16_t us_time = checker_runcfg.params[1];
JQ_DisChage();
if(checker_runcfg.params[0] == 1 && us_time > 0)
{
JQ_FastDisChage(1);
delay_os_ms(100*us_time);
JQ_FastDisChage(0);
}
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void JQ_Test_Reset(void)
{
uint8_t ack = 0,uc_state;
uint8_t i = 0;
for(i = 0; i < 5;i++)
{
delay_os_ms(20);
JQ_Reset(); //软复位
delay_os_ms(20);
ack = JQ_ReadState(0,&uc_state); //读状态
if(ack == 0)
continue;
if((uc_state & 0x7B) == 0x18)
{
break;
}
}
delay_os_ms(20);
JQ_DisChage(); //内部放电
if(i < 5)
{
ack = 0;
}else{
ack = 1;
}
Checker_MaskResult(ack,checker_runcfg.task_info.runindex);
}
/*
@brief 使
*/
void JQ_Test_BootEn(void)
{
JQ_BoomActive();
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void JQ_Test_ClearBoom()
{
uint16_t us_temp;
JQ_CheckerBoomCmd(1,&us_temp);
}
/*
@brief
@param0 adc
@param1
@param2
@rtv1
@rtv2
@rtv3
@rtv4
*/
void JQ_Test_BoomEnergy(void)
{
uint16_t us_adc_bg = checker_runcfg.params[0];
uint16_t us_plus_count = checker_runcfg.params[1];
uint16_t us_delay = checker_runcfg.params[2];
uint16_t aus_rtv[4];// us_shake,max_cul,us_shake2,us_energy;
uint32_t ul_max_cur;
us_plus_count = JQ_CheckerBoomCmd(us_plus_count,&aus_rtv[1]);
if(checker_runcfg.params[1] > 652)
{
Power_SetSampleRange_Seep(JQChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH);
delay_ms(us_delay);
aus_rtv[0] = AD_GetChgEnergy(40000,us_adc_bg,&aus_rtv[2],&aus_rtv[3]);
ul_max_cur = Power_ConvCur(aus_rtv[2],JQChecker_ChgEnger_Sample_R);
ul_max_cur = (ul_max_cur + 500)/1000;//0.01mA
aus_rtv[2] = ul_max_cur;
}else{
aus_rtv[0] = aus_rtv[2] = aus_rtv[3] = 0;
}
if(us_plus_count != CHECKER_NET_ID)
{
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
}else{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
Checker_SetRtv(aus_rtv,checker_runcfg.rtv_count);
}
/*
@brief 使
*/
void JQ_Test_EnCommEndCur(void)
{
JQ_CommEnd_MaxCur = 0;
JQ_CommEnd_CurEn = 1;
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief
@rtv
*/
void JQ_Test_GetCommEndCur(void)
{
JQ_CommEnd_CurEn = 0;
Checker_SetRtv(&JQ_CommEnd_MaxCur,checker_runcfg.rtv_count);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief 线
*/
void JQ_Test_PowerOff(void)
{
JQ_Test_Discharge();
delay_ms(20);
JQBUS_OFF;
PowerCalibration_set(POWER_DEF_V,POWER_DEF_V-10);
}
/*
@brief OTP数据
@param0 OTP
@param1
@param2
*/
void JQ_Test_WriteBuf2OTP(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_count = 0;
uint8_t uc_wcount ;
uint8_t uc_otpaddr;
uint8_t* uc_pbuf;
uint8_t uc_optbuf[16];
JQ_EnWOTP();
JQ_EnWOTP();
if((checker_runcfg.params[1] + checker_runcfg.params[2] > CHECKER_WRITE_BUF) || (checker_runcfg.params[1] > 16))
{
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(uc_optbuf,0x55,16);
uc_otpaddr = checker_runcfg.params[0];
uc_count = checker_runcfg.params[2];
uc_pbuf = &Checker_FacBuf[2]+checker_runcfg.params[1];
uc_wcount = JQ_WriteOTP(uc_otpaddr,uc_count,uc_pbuf);
if(uc_wcount != uc_count)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpaddr,uc_count,(uint8_t*)uc_optbuf);
if(uc_ack < 1)
{
uc_rtv = 1;
}
for(uc_wcount = 0; uc_wcount < uc_count; uc_wcount++)
{
if(uc_optbuf[uc_wcount] != uc_pbuf[uc_wcount])
{
break;
}
}
if(uc_wcount != uc_count)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void JQ_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_ack = JQ_ReadOTP(CHECKER_NET_ID,0x03,12,(uint8_t*)uc_optbuf);
if(uc_ack < 1)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
JQ_EnWOTP();
JQ_EnWOTP();
for(uc_count = 0; uc_count < 8; uc_count++)
{
if((checker_runcfg.writeuid[uc_count] & uc_optbuf[uc_count]) != uc_optbuf[uc_count])
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
if(checker_runcfg.writeuid[uc_count] != uc_optbuf[uc_count])
{
ul_write_mask |= ((0x01ul)<<uc_count);
}
}
for(uc_count = 0; uc_count < 4; uc_count++)
{
if((checker_runcfg.writepwd[uc_count] & uc_optbuf[uc_count+8]) != uc_optbuf[uc_count+8])
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
if(checker_runcfg.writepwd[uc_count] != uc_optbuf[uc_count+8])
{
ul_write_mask |= ((0x01ul)<<(uc_count+8));
}
}
rt_memcpy(uc_optbuf,checker_runcfg.writeuid,8);
rt_memcpy(uc_optbuf+8,checker_runcfg.writepwd,4);
for(uc_count = 0; uc_count < 12; uc_count++)
{
if(ul_write_mask & 0x01)
{
uc_ack = JQ_WriteOTP(0x03+uc_count,1,&uc_optbuf[uc_count]);
if(uc_ack != 1)
{
break;
}
}
ul_write_mask >>= 1;
}
if(uc_count != 12)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief UID PWD
*/
void JQ_Verify_UID_PWD(void)
{
uint8_t uc_ack;
uint8_t auc_uid_temp[8];
uint8_t auc_pwd_temp[4];
uint8_t uc_state;
if(JQXT_Test_IsNeedBind() == 0)
{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
return;
}
JQ_ScanUIDBegin();
if(checker_runcfg.params[0] > 0)
{
JQ_FreeBack_Prapare(1);
}
uc_ack = JQ_ScanReadUID(CHECKER_NET_ID,auc_uid_temp);
if(uc_ack < 1)
{
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
return;
}
for(uc_ack = 0; uc_ack < 4; uc_ack++)
{
auc_pwd_temp[uc_ack] = checker_runcfg.writepwd[3-uc_ack];
}
JQ_VerifyPWD(auc_pwd_temp);
uc_state = 0;
uc_ack = JQ_ReadState(CHECKER_NET_ID,&uc_state);
if((uc_state & 0x40) == 0)
{
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
return;
}
for(uc_ack = 0; uc_ack < 8; uc_ack++)
{
if(checker_runcfg.writeuid[uc_ack] != auc_uid_temp[7-uc_ack])
{
break;
}
}
if(uc_ack != 8)
{
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
}else{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
}
/*
@breif
@param0 0.1s
@rtv0
*/
void JQ_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);
JQBUS_ON
Power_SetSampleCurrentRange(Current_Max);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_capv1,checker_runcfg.rtv_count);
}
/*
@breif OTP 使
*/
void JQ_Test_EnOTPW(void)
{
JQ_EnWOTP();
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@breif 使OTP (ENWOTP)
@param0
*/
void JQ_Test_WriteVersion(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_temp = 0;
uint8_t uc_write = checker_runcfg.params[0] & 0x1F;
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,1,(uint8_t*)&uc_temp);
if(uc_ack < 1)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
if((uc_temp & 0x1F) == uc_write)
{
uc_rtv = 0;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_temp |= uc_write;
if((uc_temp & 0x1F) != uc_write)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
JQ_EnWOTP();
JQ_EnWOTP();
uc_ack = JQ_WriteOTP(20,1,(uint8_t*)&uc_temp);
if(uc_ack != 1)
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_write = uc_temp;
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,1,(uint8_t*)&uc_temp);
if(uc_ack < 1)
{
uc_rtv = 1;
}
if(uc_temp != uc_write)
{
uc_rtv = 1;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief
*/
void JQ_Test_ReadVersion(void)
{
uint16_t us_temp = 0xFF;
uint8_t uc_ack;
uint8_t uc_rtv = 0;
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,20,1,(uint8_t*)&us_temp);
if(uc_ack < 1)
{
uc_rtv = 1;
}
us_temp &= 0x1F;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
}
/*
@brief OTP数据
@param0 OTP起始地址
@param1
@param2
*/
void JQ_Test_WriteFacBuff(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_otpAddr = checker_runcfg.params[0];
uint8_t uc_bufIndex = checker_runcfg.params[1];
uint8_t uc_writeCount = checker_runcfg.params[2];
uint8_t uc_count = 0;
uint8_t uc_wcount ;
uint8_t ul_temp[4];
//Checker_FacBuf 验证合法性
if(0 != Checker_FacBufCheck())
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
JQ_EnWOTP();
JQ_EnWOTP();
for(uc_count = 0; uc_count < uc_writeCount;uc_count++,uc_otpAddr++,uc_bufIndex++)
{
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpAddr,1,ul_temp);
if(uc_ack < 1)
{
uc_rtv = 2;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
if(Checker_FacBuf[uc_bufIndex+2] == ul_temp[0])
{
continue;
}
if(ul_temp[0] != 0)
{
if((ul_temp[0] & Checker_FacBuf[uc_bufIndex+2]) != ul_temp[0])//OTP不能由1变成0
{
uc_rtv = 3;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
}
uc_wcount = JQ_WriteOTP(uc_otpAddr,1,&Checker_FacBuf[uc_bufIndex+2]);
if(uc_wcount != 1)
{
uc_rtv = 4;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
}
uc_rtv = 0;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
/*
@brief OTP内部与缓存比较
@param0 OTP起始地址
@param1
@param2
*/
void JQ_Test_VerifyFacBuff(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_otpAddr = checker_runcfg.params[0];
uint8_t uc_bufIndex = checker_runcfg.params[1];
uint8_t uc_verifyCount = checker_runcfg.params[2];
uint8_t uc_count = 0;
uint8_t ul_temp[4];
if(0 != Checker_FacBufCheck())
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
for(uc_count = 0; uc_count < uc_verifyCount;uc_count++)
{
uc_ack = JQ_ReadOTP(CHECKER_NET_ID,uc_otpAddr,1,ul_temp);
if((uc_ack < 1) || (Checker_FacBuf[uc_bufIndex+2] != ul_temp[0]))
{
uc_rtv = 2;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
uc_bufIndex++;
uc_otpAddr++;
}
uc_rtv = 0;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
CheckerTask jqtaskArray[CHECKER_MAXID_COUNT] ={
Checker_PowerPrapare, //0 电源准备
JQ_Test_PowerOn, //1 上电充能
JQ_Test_SetBusV, //2 设置总线电压
JQ_Test_BaseCur, //3 获取总线电流
JQ_Test_ScanUID, //4 扫描UID
JQ_Test_PWCheck, //5 密码验证
JQ_Test_ReadChipID, //6 读取芯片代码
JQ_Test_OTPCheck, //7 OTP检测
JQ_Test_FTCheck, //8 工厂测试检测
JQ_Test_ReadState, //9 读取状态
JQ_Test_WriteUserInfo,//10 写工厂信息
JQ_Test_ChgEnergy ,//11 充能统计
JQ_Test_CheckDAC ,//12 充电电压检测
Checker_WaitDelay ,//13 延时等待
JQ_Test_SetDelay ,//14 设置延时
JQ_Test_ReadDelay ,//15 读取延时
JQ_Test_ClkTrim ,//16 时钟校准
JQ_Test_Discharge ,//17 放电
JQ_Test_Reset ,//18 复位
JQ_Test_BootEn ,//19 起爆使能
JQ_Test_BoomEnergy ,//20 起爆充能
JQ_Test_EnCommEndCur ,//21 使能通讯末电流采集
JQ_Test_GetCommEndCur ,//22 获取通讯末电流
JQ_Test_WriteOTP ,//23 写OTP
JQ_Test_ReadOTP ,//24 读OTP
JQ_Test_ClearBoom ,//25 清除起爆计数
JQ_Test_PowerOff ,//26 关总线
JQ_Test_WriteBuf2OTP ,//27 将缓存区数据写入OTP
JQ_UID_PWD_Bind ,//28 三码写入错误
JQ_Verify_UID_PWD ,//29 三码验证错误
JQ_Test_CapVoltage ,//30 测量电容压差
Checker_ResistorSample,//31 测量桥丝阻值
JQ_Test_EnOTPW ,//32 使能OTP写
JQ_Test_WriteVersion ,//33 写模块版本
JQ_Test_ReadVersion ,//34 读取版本号
JQ_Test_WriteFacBuff ,//35 写缓存数据
JQ_Test_VerifyFacBuff ,//36 验证缓存数据
(void*)0 //数组结束
};