#include "EWChecker.h" #include "EWUpdata.h" #include "driver/EWDriver.h" #include "base/delay.h" #include "hardware/adc_cfg.h" #include "base/utility.h" #include "hardware/power.h" #include "hardware/timer_cfg.h" #include "debug.h" #include "commend.h" #include "mystring.h" #include "mystdlib.h" #include "interface/checkerext.h" #define EW_CHECKER_RUN_BUF 32 uint8_t EW_Test_UID[13]="123456789ACDE"; uint8_t EW_Test_PWD[8]="FBCDabcd"; uint8_t EW_RunBuf[EW_CHECKER_RUN_BUF]; /* @brief 统计模块的上电充能,具有电压设置功能,采集档位 R10_0p1mA_1p6mA_UC @param0 总线电压 @param1 超时时间 0.1ms @param2 充电结束时的AD值 @rtv1 返回总线电流低于设置AD值的时间 */ void EW_Test_PowerOn() { uint8_t uc_rtv = 0; uint16_t us_rsult[2]; uint16_t us_max; uint16_t us_shake; EW_BUS_OFF; uc_rtv = PowerCalibration_set(checker_runcfg.params[0],checker_runcfg.params[0]-1); checker_runcfg.netid = 1; Power_SetSampleRange_Seep(Checker_PowerOn_Sample_R,ADC_SPEED_HIGH); //POWER_ON delay_os_ms(100); EW_BUS_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 EW_Test_SetBusV(void) { Checker_RunCfg_st *cfg=&checker_runcfg; uint8_t uc_rtv = 0; uint16_t us_h_v,us_m_v; us_h_v = cfg->params[0]; if(us_h_v < 55) { uc_rtv = 1; }else{ us_m_v = (us_h_v>>1) > 50 ? (us_h_v>>1):50; uc_rtv |= PowerCalibration_set(us_h_v,us_m_v); EW_BUS_ON us_m_v = ((us_h_v/80)+2)*60; delay_ms(us_m_v); us_h_v = Power_GetBousV(); Checker_SetRtv(&us_h_v,cfg->rtv_count); } Checker_MaskResult(uc_rtv,cfg->task_info.runindex); } /* @brief 测量总线基本电压 @rtv1 返回总线电流 单位0.01uA */ void EW_Test_BaseCur(void) { uint16_t ul_cur[2]; EW_DIFF_MOD_H delay_ms(250); ul_cur[0] = ADC_GetBaseStableCur(); EW_DIFF_MOD_L delay_ms(100); ul_cur[1] = ADC_GetBaseStableCur(); EW_DIFF_MOD_H delay_ms(20); Checker_MaskResult(0,checker_runcfg.task_info.runindex); Checker_SetRtv(ul_cur,checker_runcfg.rtv_count); } /* @breif 使能MTP擦写 @param 0 失能 1 使能 */ void EW_Test_EnMTP(void) { uint8_t uc_ack = 0; uc_ack = EW_EnWriteMTP(checker_runcfg.netid,checker_runcfg.params[0]); Checker_MaskResult(uc_ack,checker_runcfg.task_info.runindex); } /* @brief 扫描总线上的电子模块 1发 @param0 UID长度 @param1 使能或失能 UID对比 @param2 使能反馈监控 @rtv1 最大反馈电流 @rtv2 最大反馈时间 @rtv3 最小反馈电流 @rtv4 最小反馈时间 @rtv5 UID 2Bytes @rtv6 UID 2Bytes @rtv7 UID 2Bytes @rtv8 UID 2Bytes */ void EW_Test_ReadUID(void) { uint8_t uc_rtv = 0; uint8_t uc_count = 0; uint16_t aus_temp[12]; uint32_t ul_temp = 0; memset(EW_RunBuf,0,EW_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; } } if(checker_runcfg.params[2] > 0) { EW_FreeBack_Prapare(); } uc_rtv = EW_ReadUID(checker_runcfg.netid,EW_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] != EW_RunBuf[uc_count]) { uc_rtv |= 0x01; } } } memcpy(checker_runcfg.writeuid,EW_RunBuf,checker_runcfg.uid_len); ul_temp = Power_ConvCur(EW_FreeBack_MaxCur,EWDriver_Sample_R); ul_temp = (ul_temp + 500)/1000; aus_temp[0] = ul_temp ; aus_temp[1] = EW_FreeBack_MaxTime; ul_temp = Power_ConvCur(EW_FreeBack_MinCur,EWDriver_Sample_R); ul_temp = (ul_temp + 500)/1000; aus_temp[2] = ul_temp; aus_temp[3] = EW_FreeBack_MinTime; uc_count = 0; if(uc_rtv == 0) { checker_runcfg.uid_len = checker_runcfg.params[0]; memcpy(checker_runcfg.writeuid,EW_RunBuf,checker_runcfg.uid_len); uc_count = (checker_runcfg.params[0]+7+1)/2; } Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); memcpy(aus_temp+4,EW_RunBuf,24); Checker_SetRtv(aus_temp,checker_runcfg.rtv_count); } /* @brief 写模块运行时的配置参数 @param0 起爆MOS选择 0内部/1外部 @param1 通信信号源 0:rxh 1:rxl 2:rx @param2 通信模式 1:差分 2:单端 @param3 起爆日志标记周期 0:不标记 1:5ms 2:10ms 3:20ms 4:50ms 5:10ms 6:150ms 7:200ms @param4 UID长度 @param5 密码长度 @param6 模块版本 */ void EW_Test_SetRunCfg() { uint8_t uc_rtv = 0; RunCfg_un run_cfg; if(checker_runcfg.params[4] > 14) { checker_runcfg.params[4] = 14; } checker_runcfg.uid_len = checker_runcfg.params[4]; checker_runcfg.params[4] -= 7; if(checker_runcfg.params[5] > 7) { checker_runcfg.params[5] = 7; } checker_runcfg.pwd_len = checker_runcfg.params[5]; checker_runcfg.params[5] -= 4; if(checker_runcfg.params[6] > 31) { checker_runcfg.params[6] = 31; } run_cfg.runcfg_st.fire_mos_sw = checker_runcfg.params[0]; run_cfg.runcfg_st.vbus_rx_sg = checker_runcfg.params[1]; run_cfg.runcfg_st.vbus_mode = checker_runcfg.params[2]; run_cfg.runcfg_st.reset_run_step = checker_runcfg.params[3]; run_cfg.runcfg_st.uid_len = checker_runcfg.params[4]; run_cfg.runcfg_st.pwd_len = checker_runcfg.params[5]; run_cfg.runcfg_st.version = checker_runcfg.params[6]; run_cfg.run_cfg_buf[3] = CheckCRC_8(run_cfg.run_cfg_buf,3); uc_rtv = EW_WriteRunCfg(checker_runcfg.netid,&run_cfg); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 验证模组运行时配置 @param0 起爆MOS选择 0内部/1外部 @param1 通信信号源 0:rxh 1:rxl 2:rx @param2 通信模式 1:差分 2:单端 @param3 起爆日志标记周期 0:不标记 1:5ms 2:10ms 3:20ms 4:50ms 5:10ms 6:150ms 7:200ms @param4 UID长度 @param5 密码长度 @param6 模块版本 */ void EW_Test_CheckRunCfg() { uint8_t uc_rtv = 0; uint16_t aus_temp[3]; RunCfg_un run_cfg; uc_rtv = EW_ReadRunCfgVersion(checker_runcfg.netid,(uint8_t*)&run_cfg,&aus_temp[2]); if(run_cfg.runcfg_st.fire_mos_sw != checker_runcfg.params[0]) { uc_rtv |= 0x01; } if(run_cfg.runcfg_st.vbus_rx_sg != checker_runcfg.params[1]) { uc_rtv |= 0x01; } if(run_cfg.runcfg_st.vbus_mode != checker_runcfg.params[2]) { uc_rtv |= 0x01; } if(run_cfg.runcfg_st.reset_run_step != checker_runcfg.params[3]) { uc_rtv |= 0x01; } checker_runcfg.uid_len = checker_runcfg.params[4]; if((checker_runcfg.params[4] <7 ) || (run_cfg.runcfg_st.uid_len != (checker_runcfg.params[4])-7)) { uc_rtv |= 0x01; } checker_runcfg.pwd_len = checker_runcfg.params[5]; if((checker_runcfg.params[5] < 4) ||(run_cfg.runcfg_st.pwd_len != (checker_runcfg.params[5] - 4))) { uc_rtv |= 0x01; } if(run_cfg.runcfg_st.version != checker_runcfg.params[6]) { uc_rtv |= 0x01; } memcpy(aus_temp,run_cfg.run_cfg_buf,4); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); Checker_SetRtv(aus_temp,checker_runcfg.rtv_count); } /* @brief 验证配置 @param0 配置验证掩码低2bytes @param1 配置验证掩码高2bytes @param2 配置验证比较低2bytes @param3 配置验证比较高2bytes */ void EW_Test_VerifyRunCfg() { uint8_t uc_rtv = 0; uint32_t ul_mask = 0; uint32_t ul_cfg = 0; uint8_t uc_ack = 1; ul_mask = checker_runcfg.params[1]; ul_mask <<=16; ul_mask |= checker_runcfg.params[0]; ul_cfg = checker_runcfg.params[3]; ul_cfg <<=16; ul_cfg |= checker_runcfg.params[2]; //比较通过返码 uc_rtv = EW_CheckRunCfg(checker_runcfg.netid,ul_mask,ul_cfg,&uc_ack); if(uc_ack == 0) { uc_rtv = 1; } Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 写三码数据测试 */ void EW_Test_WriteThreedCode(void) { uint8_t uc_rtv = 0; if(checker_runcfg.uid_len ==0 || checker_runcfg.uid_len > 14 \ || checker_runcfg.pwd_len ==0 || checker_runcfg.pwd_len > 7) { uc_rtv = 1; Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } memcpy(checker_runcfg.writeuid,EW_Test_UID,checker_runcfg.uid_len); memcpy(checker_runcfg.writepwd,EW_Test_PWD,checker_runcfg.pwd_len); memcpy(EW_RunBuf,EW_Test_UID,checker_runcfg.uid_len); EW_RunBuf[checker_runcfg.uid_len] = CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len); uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1); delay_os_ms(50); uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1); delay_os_ms(50); memcpy(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len); EW_RunBuf[checker_runcfg.pwd_len] = CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len); uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x04,EW_RunBuf,checker_runcfg.pwd_len+1); delay_os_ms(50); uc_rtv = EW_WriteMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @breif 验证测试的三码数据 */ void EW_Test_VerifyThreedCode(void) { uint8_t uc_rtv = 0; System_State_un state; //读UID MTP EW_ReadMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1); if(EW_RunBuf[checker_runcfg.uid_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len)) { uc_rtv = 1; } if(0 != memcmp(EW_RunBuf,EW_Test_UID,checker_runcfg.uid_len)) { uc_rtv = 1; } if(uc_rtv > 0) { Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } EW_ReadMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1); if(EW_RunBuf[checker_runcfg.uid_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len)) { uc_rtv = 1; } if(0 != memcmp(EW_RunBuf,EW_Test_UID,checker_runcfg.uid_len)) { uc_rtv = 1; } if(uc_rtv > 0) { Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } //读PWD MTP EW_ReadMTP(checker_runcfg.netid,0x04,EW_RunBuf,checker_runcfg.pwd_len+1); if(EW_RunBuf[checker_runcfg.pwd_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len)) { uc_rtv = 1; } if(0 != memcmp(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len)) { uc_rtv = 1; } if(uc_rtv > 0) { Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } EW_ReadMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1); if(EW_RunBuf[checker_runcfg.pwd_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len)) { uc_rtv = 1; } if(0 != memcmp(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len)) { uc_rtv = 1; } if(uc_rtv > 0) { Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } //读UID uc_rtv = EW_ReadUID(checker_runcfg.netid,EW_RunBuf,checker_runcfg.uid_len); if(0 != memcmp(EW_RunBuf,EW_Test_UID,checker_runcfg.uid_len)) { uc_rtv = 1; } if(uc_rtv > 0) { Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } //验证PWD memcpy(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len); uc_rtv = EW_VerfyPWD(checker_runcfg.netid,EW_RunBuf,checker_runcfg.pwd_len); if(uc_rtv > 0) { Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } //读状态 uc_rtv = EW_ReadState(checker_runcfg.netid,(uint8_t*)state.datas); if(uc_rtv > 0 || state.State_st.erprom_error >0 || state.State_st.pswd_flag == 0) { Checker_MaskResult(1,checker_runcfg.task_info.runindex); return; } Checker_MaskResult(1,checker_runcfg.task_info.runindex); } /* @brief 自检 @param 自检模式 @rtv 自检模式0x08的回读数据 */ void EW_Test_CheckSelf() { uint8_t uc_rtv = 0; uint32_t ul_temp; uint8_t uc_mode = checker_runcfg.params[0]; uc_rtv = EW_ChecSelf(checker_runcfg.netid,uc_mode,(uint8_t*)&ul_temp); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 状态码比较 @param0 掩码参数 @param1 比较结果值 @rtv0 状态值低2字节 @rtv1 状态值高2字节 */ void EW_Test_CheckeState(void) { uint8_t uc_rtv; System_State_un state; uc_rtv = EW_ReadState(checker_runcfg.netid,(uint8_t*)state.datas); if(uc_rtv > 0 || ((state.us_data[0] & checker_runcfg.params[0] )!= checker_runcfg.params[1])) { Checker_MaskResult(1,checker_runcfg.task_info.runindex); return; } Checker_MaskResult(1,checker_runcfg.task_info.runindex); Checker_SetRtv((uint16_t*)state.us_data,checker_runcfg.rtv_count); } /* @brief 充电 @param0 充电模式 @param1 充电分组 */ void EW_Test_Charge() { uint8_t uc_rtv = 0; uc_rtv = EW_Charge(checker_runcfg.netid, checker_runcfg.params[0],checker_runcfg.params[1]); 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 EW_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; uc_rtv = EW_Charge(0, uc_charge_class,0); if(us_adend > 10) { Power_SetSampleRange_Seep(EWChecker_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,EWChecker_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 放电 */ void EW_Test_DisChg() { uint8_t uc_rtv = 0; uc_rtv = EW_DisCharge(0); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 写延时 @param0 写延时 */ void EW_Test_SetDelay() { uint8_t uc_rtv = 0; uc_rtv = EW_SetDelay(checker_runcfg.netid,checker_runcfg.params[0]); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 读延时 */ void EW_Test_ReadDelay() { uint8_t uc_rtv = 0; uint16_t aus_temp[2]; uc_rtv = EW_ReadDelay(checker_runcfg.netid,aus_temp); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); Checker_SetRtv(aus_temp,checker_runcfg.rtv_count); } /* @brief 时钟校准 @param 校准周期 @param 校准脉冲数据 @rtv 校准值,真实值的4倍 */ void EW_Test_ClkAmend() { uint8_t uc_rtv = 0; uint32_t ul_temp = 0; uc_rtv = EW_ClkAmend(checker_runcfg.netid,checker_runcfg.params[0],checker_runcfg.params[1]); delay_os_ms(100); uc_rtv |= EW_ReadClkAmend(checker_runcfg.netid,&ul_temp); ul_temp >>= 2; Checker_SetRtv((uint16_t*)&ul_temp,checker_runcfg.rtv_count); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 设置通信地址 @param0 通信地址 @param1 设置模式 0:系统 1:UID配置地址 2:快速配置 @param2 延时 @rtv 延时 */ void EW_Test_SetAddr(void) { uint8_t uc_rtv = 0; uint16_t us_temp = 0; checker_runcfg.netid = checker_runcfg.params[0]; if(checker_runcfg.params[1] == 0) { Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } if(checker_runcfg.params[1] == 1) { uc_rtv = EW_SetAddrByUID(checker_runcfg.netid,checker_runcfg.writeuid,checker_runcfg.uid_len); }else{ uc_rtv = EW_FastSetByUID (checker_runcfg.netid,checker_runcfg.params[2],checker_runcfg.writeuid,checker_runcfg.uid_len,(uint8_t*)&us_temp); } Checker_SetRtv(&us_temp,checker_runcfg.rtv_count); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 状态巡检,测试系统只能巡检一个地址,起始地址应该大于1,结束地址小于1024,两个地址差值应该小于256 @param0 起始地址 @param1 结束地址 @param2 状态码 @rtv 地址结果 */ void EW_Test_Inspect(void) { uint8_t uc_rtv = 0; uint16_t us_temp = 0; uint16_t us_count = 0; uint8_t uc_temp; uint16_t uc_rtv_count = 0; memset(EW_RunBuf,0,EW_CHECKER_RUN_BUF); if(checker_runcfg.params[0] > 0 || checker_runcfg.params[1] < 1024 \ | checker_runcfg.params[0] < checker_runcfg.params[1] \ | (checker_runcfg.params[1] - checker_runcfg.params[0]) < 256) { uc_rtv = 1; Checker_SetRtv(&us_temp,checker_runcfg.rtv_count); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } uc_rtv = EW_Inspect(checker_runcfg.params[0],checker_runcfg.params[1],checker_runcfg.params[2],EW_RunBuf); us_temp = 0; for(us_count = 0,uc_rtv_count = 0; us_count < (checker_runcfg.params[1] - checker_runcfg.params[0]);us_count++) { uc_temp = EW_RunBuf[us_count >> 3]; uc_temp = uc_temp & (0x01 <<(us_count & 0x07)); if(uc_temp > 0) { us_temp = us_count; uc_rtv_count++; } } if(uc_rtv_count > 1) { uc_rtv = 1; } Checker_SetRtv(&us_temp,checker_runcfg.rtv_count); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 起爆使能 */ void EW_Test_EnBoom(void) { uint8_t uc_rtv = 0; uc_rtv = EW_EnWriteMTP(0,1); uc_rtv |= EW_SaveFireInfo(0); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 起爆 @param0 采样超时 @param1 起爆电流AD @param2 延迟采样 */ void EW_Test_Boom() { uint8_t uc_rtv; uint16_t us_temp = 0; uc_rtv = EW_Boom(0,0); Power_SetSampleRange_Seep(EWChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH); ADC_GetCurADCFast(); delay_ms(checker_runcfg.params[2]); if(checker_runcfg.params[0] > 0 || checker_runcfg.params[1] > 0) { us_temp = AD_GetBusCurUp(checker_runcfg.params[1],checker_runcfg.params[0]); } Checker_SetRtv(&us_temp,checker_runcfg.rtv_count); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 运行BootLoader @param0 0 立即跳转 1 等待升级 */ void EW_Test_RunBoot() { uint8_t uc_rtv = 0; uc_rtv = EW_RunBootLoader(0,checker_runcfg.params[0]); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } /* @brief 缓存信息写入MTP @param0 MTP地址 @param1 缓存地址 @param2 写入长度 */ void EW_Test_WriteFacBuff() { uint8_t uc_rtv = 0; uint8_t uc_mtpAddr = checker_runcfg.params[0] >> 2; uint8_t uc_bufIndex = checker_runcfg.params[1]; uint8_t uc_writeCount = checker_runcfg.params[2]; //Checker_FacBuf 验证合法性 if(0 != Checker_FacBufCheck()) { uc_rtv = 1; Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } uc_rtv = EW_WriteMTP(checker_runcfg.netid,uc_mtpAddr,(Checker_FacBuf+2+uc_bufIndex),uc_writeCount); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } /* @brief 验证OTP内部与缓存比较 @param0 OTP起始地址 @param1 缓存首地址 @param2 验证长度 */ void EW_Test_VerifyFacBuff(void) { uint8_t uc_rtv = 0; uint8_t uc_mtpAddr = checker_runcfg.params[0] >> 2; uint8_t uc_bufIndex = checker_runcfg.params[1]; uint8_t uc_verifyCount = checker_runcfg.params[2]; uint8_t uc_count = 0; if(0 != Checker_FacBufCheck()) { uc_rtv = 1; Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } EW_ReadMTP(checker_runcfg.netid,uc_mtpAddr,EW_RunBuf,uc_verifyCount); uc_bufIndex += 2; for(uc_count = 0; uc_count < uc_verifyCount; uc_count++,uc_bufIndex++) { if(EW_RunBuf[uc_count] != Checker_FacBuf[uc_bufIndex]) { break; } } uc_rtv = 0; if(uc_verifyCount != uc_count) { uc_rtv = 1; } Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); return; } /* @brief 关闭桥输出 */ void EW_Test_PowerOFF(void) { uint8_t uc_rtv = 0; delay_os_ms(100); XTBUS_OFF; PowerCalibration_set(POWER_DEF_V,45); POWER_OFF; Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); } void EW_Empty(void) { Checker_RunCfg_st *cfg=&checker_runcfg; int count=cfg->rtv_count; while(count > 0) { cfg->Test_Rtv[cfg->rtv_index++] = 0; count--; } Checker_MaskResult(0,cfg->task_info.runindex); } CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ={ Checker_PowerPrapare, //0 电源准备 Checker_WaitDelay, //1 延时等待 Checker_ResistorSample, //2 桥丝电阻测试 EW_Test_PowerOn, //3 上电充能 EW_Test_SetBusV, //4 设置总线电压 EW_Test_BaseCur, //5 获取总线电流 EW_Test_EnMTP , //6 使能MTP EW_Test_ReadUID, //7 扫描UID EW_Test_SetRunCfg, //8 写配置参数 EW_Test_CheckRunCfg, //9 检测配置 EW_Test_VerifyRunCfg, //10 验证配置 EW_Test_WriteThreedCode, //11 模拟注码 EW_Test_VerifyThreedCode, //12 EW_Test_CheckSelf, //13 芯片自检 EW_Test_CheckeState, //14状态检测 EW_Test_Charge, //15 充电 EW_Test_DisChg, //16 放电 EW_Test_SetDelay, //17写延时 EW_Test_ReadDelay, //18读延时 EW_Test_ClkAmend, //19时钟校准 EW_Test_SetAddr, //20设置通信地址 EW_Test_Inspect, //21状态巡检 EW_Test_EnBoom, //22起爆使能 EW_Test_Boom, //23起爆检测 EW_Test_WriteFacBuff, //24缓存数据写入MTP EW_Test_VerifyFacBuff, //25验证缓存数据 EW_Test_PowerOFF, //26 关总线 EW_Updata, //27 升级 EW_Test_ChgEnergy, //28 充能统计 CheckerExt_CalcErr, //29 计算异常 CheckerExt_Repeat, //30 重新执行一次指定任务 (void*)0 //数组结束 };