#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 桥丝通断检测,如果测试器有uid,将采用uid方式通信 */ 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 电容容量检测,如果测试器有uid,将采用uid方式通信 @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 写管壳码 如果测试器有uid,将采用uid方式通信 @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 验证壳码 如果测试器有uid,将采用uid方式通信 @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; }