#include "EWChecker.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" #define UPDATA_PACK_LEN 128 #define UPDATA_BASE_ADDR 0x1000 #define UPDATA_DATA_LEN (12*1024) #define UPDATA_FLAG_ADDR (0x7c) //#define UPDATA_FLAG ((uint8_t []){0x99,0x66,0xaa,0x55}) #define UPDATA_FLAG ((uint8_t []){0xaa,0xbb,0xcc,0xdd}) #define UPDATA_CRC_ALL ((uint32_t *)(MC_CODE_ADDR+16*1024))[0] #define UPDATA_CRC_APP ((uint32_t *)(MC_CODE_ADDR+16*1024))[1] #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]; // 擦除 static uint8_t EW_bootErease(void) { uint8_t data[3]={0xfe,0x00,0x00}; uint8_t read[4]={0}; uint8_t ret=0; DMod_SendBytesXor(data,2,1); delay_ms(50); ret=DMod_ReadBytesXor(read,4,100); DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]); return ret; } static int cmd_jwt_boot_erase(list_def *argv) { int ret=0; ret=EW_bootErease(); return ret; } commend_export(jwt_boot_erase,cmd_jwt_boot_erase,"jwt srase in boot") // 跳转 static uint8_t EW_bootJump(void) { uint8_t data[3]={0xf9,0x00,0x00}; uint8_t read[4]={0}; uint8_t ret=0; DMod_SendBytesXor(data,2,1); ret=DMod_ReadBytesXor(read,4,100); DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]); return ret; } static int cmd_jwt_boot_jump(list_def *argv) { int ret=0; ret=EW_bootJump(); return ret; } commend_export(jwt_boot_jump,cmd_jwt_boot_jump,"jwt jump in boot") // 充电 static uint8_t EW_bootCharg(void) { uint8_t data[4]={0xf8,0x01,0x01,0x00}; uint8_t read[4]={0}; uint8_t ret=0; DMod_SendBytesXor(data,3,1); delay_ms(2); ret=DMod_ReadBytesXor(read,4,100); DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]); return ret; } static int cmd_jwt_boot_charg(list_def *argv) { int ret=0; ret=EW_bootCharg(); return ret; } commend_export(jwt_boot_charg,cmd_jwt_boot_charg,"jwt charg in boot") // 放电 static uint8_t EW_bootDisCharg(void) { uint8_t data[4]={0xf8,0x01,0x00,0x00}; uint8_t read[4]={0}; uint8_t ret=0; DMod_SendBytesXor(data,3,1); ret=DMod_ReadBytesXor(read,4,100); DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]); return ret; } static int cmd_jwt_boot_discharg(list_def *argv) { int ret=0; ret=EW_bootDisCharg(); return ret; } commend_export(jwt_boot_discharg,cmd_jwt_boot_discharg,"jwt discharg in boot") // 发送数据 // len 最长为128字节 static uint8_t EW_bootWrite(uint16_t addr,uint8_t *d,uint16_t len) { uint8_t ret=0; uint8_t read[4]={0}; uint8_t *buf=rt_malloc(len+2+2+1); if(buf==RT_NULL) return 1; buf[0]=0xfc; buf[1]=2+len; buf[2]=addr&0xff; buf[3]=addr>>8; rt_memcpy(&buf[4],d,len); LED2_Out=0; DMod_SendBytesXor(buf,len+2+2,1); LED2_Out=1; ret=DMod_ReadBytesXor(read,4,100); rt_free(buf); if(ret){ DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]); } return ret; } // 校验 static uint8_t EW_bootCheckCrc(uint16_t adr_start,uint16_t adr_end,uint32_t *crc) { uint8_t ret=0; uint8_t cmd[7]={0xfb,0x04,adr_start&0xff,adr_start>>8,adr_end&0xff,adr_end>>8}; uint8_t read[4+4]={0}; DMod_SendBytesXor(cmd,6,1); delay_ms(10); ret=DMod_ReadBytesXor(read,8,100); if(ret==0){ if(crc){ *crc=(read[3]<<24)|(read[4]<<16)|(read[5]<<8)|(read[6]<<0); } } DBG_LOG("addr_start=0x%04x,addr_end=0x%04x.",adr_start,adr_end); DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,", ret,read[0],read[1],read[2],read[3],read[4],read[5],read[6],read[7]); return ret; } static int cmd_jwt_boot_checkcrc(list_def *argv) { int ret=0; uint32_t crc=0; ret=EW_bootCheckCrc(UPDATA_BASE_ADDR,UPDATA_BASE_ADDR+UPDATA_DATA_LEN,&crc); cmd_print("jwt crc32=0x%04x.",crc); //crc=Crc32Calu((uint32_t *)(MC_CODE_ADDR+UPDATA_BASE_ADDR),UPDATA_DATA_LEN); crc=UPDATA_CRC_APP; cmd_print("local crc32=0x%04x.",crc); return ret; } commend_export(jwt_boot_checkcrc,cmd_jwt_boot_checkcrc,"jwt checkcrc in boot") // 读取 static uint8_t EW_bootRead(uint16_t adr,uint8_t *buf,uint16_t len) { uint8_t ret=0; uint8_t cmd[7]={0xfa,0x03,adr&0xff,adr>>8,len}; uint16_t read_len=2+len+1+1; uint8_t *read=rt_malloc(read_len); if(read==RT_NULL) return 1; DMod_SendBytesXor(cmd,6,1); ret=DMod_ReadBytesXor(read,read_len,100); rt_memset(buf,0,len); if(ret==0) { rt_memcpy(buf,&read[3],len); } DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]); rt_free(read); return ret; } // app:通信测试 static int EW_appCommTest(void) { uint8_t data[4]={0x11,0x22}; uint8_t ret; DBG_LOG("send:%02x,%02x.",data[0],data[1]); ret=EW_CommTest(data,2,300); DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,data[0],data[1],data[2],data[3]); return ret; } static int cmd_jwt_app_commtest(list_def *argv) { int ret=0; ret=EW_appCommTest(); return ret; } commend_export(jwt_app_commtest,cmd_jwt_app_commtest,"jwt commtest in app") // app:读取数据 static int EW_appRead(void) { uint8_t read_buf[4]={0}; int ret=0; uint8_t addr=(uint8_t)(UPDATA_FLAG_ADDR/4); DBG_LOG("addr=0x%02x.",addr); ret=EW_ReadMTP(1,addr,read_buf,4); DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read_buf[0],read_buf[1],read_buf[2],read_buf[3]); return ret; } static int cmd_jwt_app_read(list_def *argv) { int ret=0; ret=EW_appRead(); return ret; } commend_export(jwt_app_read,cmd_jwt_app_read,"jwt read in app") // 升级 void EW_Updata(void) { Checker_RunCfg_st *cfg=&checker_runcfg; uint8_t ret=0; uint8_t read_buf[4]={0}; uint8_t *data=(uint8_t *)MC_CODE_ADDR+UPDATA_BASE_ADDR; uint16_t len=UPDATA_DATA_LEN; uint16_t addr=UPDATA_BASE_ADDR; uint8_t pack_len=UPDATA_PACK_LEN; uint32_t crc=0; uint32_t crc_module=0; delay_ms(100); ret=EW_bootCharg(); if(ret) {ret=1;goto err;} delay_ms(6000); ret=EW_bootErease(); if(ret) {ret=2;goto err;} delay_ms(600); while(len>0){ pack_len=len>UPDATA_PACK_LEN?UPDATA_PACK_LEN:len; LED1_Out=!LED1_Out; ret=EW_bootWrite(addr,data,pack_len); addr+=pack_len; data+=pack_len; len-=pack_len; if(ret) {ret=3;goto err;} delay_ms(1); } //crc=Crc32Calu((uint32_t *)(MC_CODE_ADDR+UPDATA_BASE_ADDR),UPDATA_DATA_LEN); crc=UPDATA_CRC_APP; DBG_LOG("local crc:0x%04x.",crc); ret=EW_bootCheckCrc(UPDATA_BASE_ADDR,UPDATA_BASE_ADDR+UPDATA_DATA_LEN,&crc_module); DBG_LOG("module crc:0x%04x.",crc_module); if(ret) {ret=4;goto err;} if(crc!=crc_module){ret=5;goto err;} delay_ms(50); ret=EW_bootJump(); if(ret) {ret=6;goto err;} delay_ms(6000); ret=EW_EnWriteMTP(0,1); if(ret) {ret=7;goto err;} DBG_LOG("EW_EnWriteMTP success."); delay_ms(1); ret=EW_WriteMTP(1,(uint8_t)(UPDATA_FLAG_ADDR/4),UPDATA_FLAG,4); if(ret) {ret=8;goto err;} DBG_LOG("EW_WriteMTP success."); delay_ms(1); ret=EW_ReadMTP(1,(uint8_t)(UPDATA_FLAG_ADDR/4),read_buf,4); if(ret) {ret=9;goto err;} if(memcmp(read_buf,UPDATA_FLAG,4)!=0){ DBG_LOG("read_buf=0x%02d,0x%02d,0x%02d,0x%02d.",read_buf[0],read_buf[1],read_buf[2],read_buf[3]); ret=10;goto err; } DBG_LOG("EW_ReadMTP check success."); delay_ms(1); XTBUS_OFF; delay_ms(1000); XTBUS_ON; delay_ms(6000); ret=EW_appCommTest(); if(ret) {ret=11;goto err;} DBG_LOG("EW_appCommTest success."); err: DBG_LOG("ret=%d",ret); Checker_MaskResult(ret,checker_runcfg.task_info.runindex); } static int cmd_jwt_updata(list_def *argv) { int ret=0; EW_Updata(); return ret; } commend_export(jwt_updata,cmd_jwt_updata,"jwt updata") /* @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[3]); 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 升级 (void*)0 //数组结束 };