diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx index 32729a5..8aeaea0 100644 --- a/checher_slave.uvoptx +++ b/checher_slave.uvoptx @@ -583,7 +583,7 @@ 0 DLGUARM - d + 9 0 diff --git a/source/ReadMe.txt b/source/ReadMe.txt index a7c5250..038ace4 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -232,3 +232,6 @@ 添加 HARD_VERSION 宏,根据硬件版本不同来确定power参数 2023.10.30 添加通用的异常判断算法 +2023.10.31 + 添加通用的异常判定算法,已验证 + 更新EW模块驱动 diff --git a/source/elec_det/driver/EWDriver.c b/source/elec_det/driver/EWDriver.c index c347fa2..2e9e39b 100644 --- a/source/elec_det/driver/EWDriver.c +++ b/source/elec_det/driver/EWDriver.c @@ -17,21 +17,33 @@ static volatile CurrentSample_Range_eu buscurrent_range = Current_Max; #endif #define SMod_Read_Idle_Filter 90 -#define DMod_Read_Idle_Filter 50 +#define DMod_Read_Idle_Filter 70 volatile uint16_t* EW_Read_AD_V = FireBus_ADC_Buf; static volatile uint16_t SMod_Read_Idle_C; static uint16_t firebus_idle_diff = SMod_Read_Idle_Filter; const static uint16_t data2bit_signal[]={200,234,275,323,380,446}; -volatile static uint16_t datapulus[6][2]; +static uint16_t datapulus[6][2]; //发送起始信号 #define SMod_Begin_Plus() SMod_2Bit_Plus(4) //发送结束信号 #define SMod_End_Plus() SMod_2Bit_Plus(5) -volatile uint8_t EW_CommBuf[EW_DMODE_FRAME_SIZE]; -volatile uint16_t EW_DMOD_Peroid = 300; -volatile uint16_t EW_DMOD_READ_Timeout = 6000; +uint8_t EW_CommBuf[EW_DMODE_FRAME_SIZE]; +uint16_t EW_DMOD_Peroid = 300; +uint16_t EW_DMOD_READ_Timeout = 6000; + +uint16_t EW_FreeBack_MaxCur,EW_FreeBack_MinCur; +uint16_t EW_FreeBack_MaxTime,EW_FreeBack_MinTime; +//通信监控变量初始化 +void EW_FreeBack_Prapare(void) +{ + EW_FreeBack_MaxCur = 0; + EW_FreeBack_MinCur = 0xFFFE; + EW_FreeBack_MaxTime = 0; + EW_FreeBack_MinTime = 0xFFFE; +} + //发送唤醒信号 static void SMod_Wake_Plus(void) { @@ -104,39 +116,7 @@ static uint8_t DMod_ReadBit(uint16_t wait_us) LED1_Out_Off; return 0; } -/* -@brief 读取模块ACK -@param 超时 0.1ms -*/ -static uint8_t DMod_ReadAck(uint16_t time_out) -{ - uint32_t ul_temp = 0; - uint32_t ul_temp2 = 0; - uint16_t us_count = 0; - ul_temp = time_out*10; - ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); - EW_DIFF_MOD_M; - Get10usCount(); - while((ul_temp2 < ul_temp) && (us_count < 10)) - { - if(ADC_GetCurADCFast() > SMod_Read_Idle_C) - { - us_count++; - }else{ - us_count = 0; - } - ul_temp2 += Get10usCount(); - } - if(us_count < 10) - { - EW_DIFF_MOD_H; - return 0; - } - delay_ms(20); - EW_DIFF_MOD_H - return 1; - -} + //从AD采样缓存总,计算空闲电流 static uint16_t FireBus_UpdataIdeV(void) @@ -157,12 +137,12 @@ static uint16_t SMod_GetIdleV(void) SMod_ReadBit(80);//获取采样电流 return FireBus_UpdataIdeV(); } -static uint16_t DMod_GetIdleV(void) -{ - firebus_idle_diff = DMod_Read_Idle_Filter; - DMod_ReadBit(300);//获取采样电流 - return FireBus_UpdataIdeV(); -} +//static uint16_t DMod_GetIdleV(void) +//{ +// firebus_idle_diff = DMod_Read_Idle_Filter; +// DMod_ReadBit(300);//获取采样电流 +// return FireBus_UpdataIdeV(); +//} static uint16_t SMod_GetIdle2V(void) { uint32_t ul_temp = 0; @@ -185,7 +165,44 @@ static uint16_t DMod_GetIdle2V(void) return FireBus_UpdataIdeV(); } - +/* +@brief 读取模块ACK +@param 超时 0.1ms +*/ +static uint8_t DMod_ReadAck(uint16_t time_out) +{ + uint32_t ul_temp = 0; + uint32_t ul_temp2 = 0; + uint16_t us_count = 0; + CurrentSample_Range_eu range = buscurrent_range;//档位保存 + ul_temp = time_out*10; + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + EW_DIFF_MOD_M; + Power_SetSampleCurrentRange(EWDriver_Sample_R); + delay_ms(1); + DMod_GetIdle2V(); + Get10usCount(); + while((ul_temp2 < ul_temp) && (us_count < 10)) + { + if(ADC_GetCurADCFast() > SMod_Read_Idle_C) + { + us_count++; + }else{ + us_count = 0; + } + ul_temp2 += Get10usCount(); + } + Power_SetSampleCurrentRange(range); + if(us_count < 10) + { + EW_DIFF_MOD_H; + return 0; + } + delay_ms(20); + EW_DIFF_MOD_H + return 1; + +} //采集到应答信号返0 否则返1 static uint8_t SMod_WaitAck(uint16_t time_out) @@ -270,8 +287,7 @@ void SMod_FireBusSend4BytesFrame(uint8_t* buf,EW_SINGLE_FRAME_TYPE_en type ,uint uint8_t SMod_SendData(uint8_t* buf, uint16_t len,uint8_t bg_count,uint8_t end_count) { uint16_t us_count = 0; - uint8_t* databuf = (uint8_t*)rt_malloc(len+4); - uint8_t crc = 0; + uint8_t* databuf = (uint8_t*)rt_malloc(len+4); if(databuf == RT_NULL) { @@ -316,7 +332,7 @@ uint8_t SMod_FireBusReadDatas(uint8_t* buf, uint8_t len, uint16_t time_out) uint32_t ul_temp = 0; uint8_t uc_data; CurrentSample_Range_eu range = buscurrent_range;//档位保存 - Power_SetSampleCurrentRange(R10_2mA_30mA_MC); + Power_SetSampleCurrentRange(EWDriver_Sample_R); ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); delay_ms(1); @@ -360,7 +376,7 @@ void FireBus_ReadInspect_Data(uint16_t count,uint8_t* buf) uint16_t index; uint8_t data; CurrentSample_Range_eu range = buscurrent_range;//档位保存 - Power_SetSampleCurrentRange(R10_2mA_30mA_MC);//采样电阻全开,快速放电 + Power_SetSampleCurrentRange(EWDriver_Sample_R); ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); //delay_us(500); //总线跳转到中电平 @@ -391,15 +407,26 @@ void FireBus_ReadInspect_Data(uint16_t count,uint8_t* buf) /*************************************************************/ #define DMOD_READ_AD_FILTER_COUNT 4 -static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t time_out,uint16_t ad_line,uint16_t* max_ad) +static uint16_t TEST_IDLE_Line_Buf[1000]; +static uint16_t TEST_IDLE_Line_Count = 0; +static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t time_out,uint16_t ad_line,uint16_t* max_ad,uint16_t* min_ad) { uint32_t ul_ad_sample; uint32_t ul_index = 0; uint16_t us_adc_buf[DMOD_READ_AD_FILTER_COUNT+1]; uint32_t ul_count = 0; uint32_t uc_step = 0; + uint32_t ul_maxad = 0,ul_minad = 0; uint32_t ul_h_count = 0,ul_l_count = 0; + uint32_t ul_h_all_count = 0; + uint32_t ul_l_all_count = 0; *max_ad = 0; + *min_ad = 0xFFFF; + if(TEST_IDLE_Line_Count > 999) + { + TEST_IDLE_Line_Count = 999; + } + TEST_IDLE_Line_Buf[TEST_IDLE_Line_Count++] = ad_line; for(ul_count =0; ul_count < DMOD_READ_AD_FILTER_COUNT; ul_count++) { us_adc_buf[ul_count++] = ADC_GetCurADCFast(); @@ -408,8 +435,8 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t do{ time_out--; ul_ad_sample = ADC_GetCurADCFast(); - if(ul_ad_sample > *max_ad) - *max_ad = ul_ad_sample; +// if(ul_ad_sample > *max_ad) +// *max_ad = ul_ad_sample; // if(ul_ad_sample > ad_line) // { // PBout(I2IC_SCL_Pin_Nu) = 1 ; @@ -425,8 +452,12 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t if(us_adc_buf[ul_index] > ad_line) { ul_h_count++; + ul_h_all_count++; + ul_maxad += us_adc_buf[ul_index]; }else{ ul_l_count++; + ul_l_all_count++; + ul_minad += us_adc_buf[ul_index]; } } if(uc_step == 0 && ul_h_count >(DMOD_READ_AD_FILTER_COUNT-1))//启动周期计数 @@ -434,7 +465,9 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t (*plus_h)++; (*plus_t)++; uc_step = 1; + }else if(uc_step == 0){ + continue;//未启动 } if(uc_step == 1) @@ -458,6 +491,8 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t (*plus_t)++; }while(time_out > 0); + *max_ad = ul_maxad / ul_h_all_count; + *min_ad = ul_minad / ul_h_all_count; if(time_out < 1)//等待起始信号超时 { return 1; @@ -474,79 +509,60 @@ static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t static uint16_t us_plus_H,us_plus_H2;//高电平采用次数 static uint16_t us_plus_T,us_plus_T2;//采样周期 uint16_t idle_line = 0; -typedef struct{ - uint16_t cur_idle; - uint16_t cur_idle_ad; - uint16_t cur_high_value; - uint16_t cur_idle_line; - uint16_t cur_max; -}firebus_def; uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out) { uint32_t ul_ad_sample; uint32_t ul_check_falg; //奇校验 uint32_t us_time_out = time_out; uint32_t ul_data = 0; - uint32_t us_dataT_Or;//数据周期 + //uint32_t us_dataT_Or;//数据周期 uint32_t us_temp1,us_temp2; - uint16_t ad_max = 0,ad_max_temp = 0; - firebus_def fire_dat={0}; - uint8_t ret=0; + uint16_t ad_max = 0,ad_min = 0; + uint8_t uc_rtv = 0; CurrentSample_Range_eu range = buscurrent_range;//档位保存 - Power_SetSampleCurrentRange(R10_2mA_30mA_MC); + Power_SetSampleCurrentRange(EWDriver_Sample_R); ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HFAST); + memset(TEST_IDLE_Line_Buf,0,sizeof(TEST_IDLE_Line_Buf)); + TEST_IDLE_Line_Count = 0; delay_us(2000); //总线跳转到中电平 EW_DIFF_MOD_M; //延时等待电流稳定 delay_us(800); //COM_PH2_Out = 0; - PBout(I2IC_SCL_Pin_Nu) = 0; + PBout(I2IC_SCL_Pin_Nu) = 0; delay_us(200); //获取中电平电流 - PBout(I2IC_SCL_Pin_Nu) = 1 ; + PBout(I2IC_SCL_Pin_Nu) = 1 ; DMod_GetIdle2V(); - fire_dat.cur_idle=SMod_Read_Idle_C; - fire_dat.cur_idle_ad=ADC_GetCurADCFast(); - PBout(I2IC_SCL_Pin_Nu) = 0 ; + PBout(I2IC_SCL_Pin_Nu) = 0 ; //读取指定长度数据 - //读取单字节数据 - ul_data = 0; - //等待起始信号唤醒信号 - us_plus_H = 0; - us_plus_T = 0; - us_time_out = 2000 + time_out; - do{ - - ul_ad_sample = ADC_GetCurADCFast(); - if(ad_max < ul_ad_sample) - ad_max = ul_ad_sample; - if(ul_ad_sample > SMod_Read_Idle_C) - { - if(ul_ad_sample-SMod_Read_Idle_C>50){ - us_plus_H++; - fire_dat.cur_high_value=fire_dat.cur_high_value/2+ul_ad_sample/2; - }else{ - SMod_Read_Idle_C=ul_ad_sample; - } - }else{ - us_plus_H = 0; - fire_dat.cur_high_value=0; - } - delay_us(2); - us_time_out--; - } - while((us_plus_H < 4) && (us_time_out > 0)); - fire_dat.cur_max=ad_max; - if(us_time_out < 1)//等待起始信号超时 - { - ret=1; - goto end; - } - - // 空闲判线以最高电平为基准 - SMod_Read_Idle_C=(SMod_Read_Idle_C+fire_dat.cur_high_value)/2; - fire_dat.cur_idle_line=SMod_Read_Idle_C; + //读取单字节数据 + ul_data = 0; + //等待起始信号唤醒信号 + us_plus_H = 0; + us_plus_T = 0; + us_time_out = 2000 + time_out; + do{ + + ul_ad_sample = ADC_GetCurADCFast(); + if(ad_max < ul_ad_sample) + ad_max = ul_ad_sample; + if(ul_ad_sample > SMod_Read_Idle_C) + { + us_plus_H++; + }else{ + us_plus_H = 0; + } + delay_us(2); + us_time_out--; + } + while((us_plus_H < 4) && (us_time_out > 0)); + if(us_time_out < 1)//等待起始信号超时 + { + uc_rtv = 1; + goto DMOD_Read_END; + } while(len > 0) { @@ -558,13 +574,15 @@ uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out) { us_plus_H = 0; us_plus_T = 0; - idle_line = SMod_Read_Idle_C; + idle_line = (uint16_t)(ad_max*0.01f+ad_min*0.08f) + SMod_Read_Idle_C; +// idle_line = SMod_Read_Idle_C; // idle_line = ad_max - SMod_Read_Idle_C; // idle_line = (idle_line>>1)+ (idle_line>>4)+ SMod_Read_Idle_C; - if(SMod_FireBusReadPlus(&us_plus_H,&us_plus_T,time_out,idle_line,&ad_max_temp ) > 0) + if(SMod_FireBusReadPlus(&us_plus_H,&us_plus_T,time_out,idle_line,&ad_max,&ad_min ) > 0) { - ret=2; - goto end; + + uc_rtv = 2; + goto DMOD_Read_END; } if(us_plus_H2 > (us_plus_T2- us_plus_H2)) { @@ -584,7 +602,7 @@ uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out) ul_check_falg = 0; us_time_out = 0; us_plus_T2 = 0; - us_dataT_Or = us_plus_T;//保存数据周期 + //us_dataT_Or = us_plus_T;//保存数据周期 do{ ul_data <<= 1; if(us_plus_H > (us_plus_T- us_plus_H)) //高电平时间大于低电平 1 @@ -611,42 +629,59 @@ uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out) us_plus_H2 = us_plus_H; us_plus_H = 0; us_plus_T = 0; - //idle_line = ad_max - SMod_Read_Idle_C; - //idle_line = (idle_line>>1)+ (idle_line>>4)+ SMod_Read_Idle_C; - idle_line = SMod_Read_Idle_C; - if(SMod_FireBusReadPlus(&us_plus_H,&us_plus_T,time_out,idle_line,&ad_max_temp ) > 0) + idle_line = (uint16_t)(ad_max*0.01f+ad_min*0.08f) + SMod_Read_Idle_C; + if(idle_line > 200) { - ret=4; - goto end; + idle_line = 200; } - ad_max = (uint16_t)(ad_max * 0.7f + ad_max_temp*0.3f); + //idle_line = (idle_line>>1)+ (idle_line>>4)+ SMod_Read_Idle_C; + //idle_line = SMod_Read_Idle_C; + if(SMod_FireBusReadPlus(&us_plus_H,&us_plus_T,time_out,idle_line,&ad_max,&ad_min ) > 0) + { + uc_rtv = 4; + goto DMOD_Read_END; + } + + if(EW_FreeBack_MaxTime < ad_max) + { + EW_FreeBack_MaxTime = ad_max; + } + if(EW_FreeBack_MinTime > ad_max) + { + EW_FreeBack_MinTime = ad_max; + } + if(EW_FreeBack_MaxTime < us_plus_T) + { + EW_FreeBack_MaxTime = us_plus_T; + } + if(EW_FreeBack_MinTime > us_plus_T) + { + EW_FreeBack_MinTime = us_plus_T; + } + + us_time_out++; }while(us_time_out < 13); if(ul_check_falg == 0) { - ret=5; - goto end; + uc_rtv =5; + goto DMOD_Read_END; } if(us_time_out != 9) { - ret=6; - goto end; + uc_rtv = 6; + goto DMOD_Read_END; } ul_data >>= 2; *buf = (uint8_t)ul_data; buf++; len--; } - //delay_us(time_out >> 1); - - end: - EW_DIFF_MOD_H; + DMOD_Read_END: + delay_ms(1); + EW_DIFF_MOD_H Power_SetSampleCurrentRange(range); - if(ret){ - DBG_LOG("cur_idle=%d,high_value=%d,idle_line=%d.",fire_dat.cur_idle, fire_dat.cur_high_value,fire_dat.cur_idle_line); - DBG_LOG("cur_max=%d,cur_idle_ad=%d",fire_dat.cur_max,fire_dat.cur_idle_ad); - } - return ret; + return uc_rtv; } @@ -745,7 +780,7 @@ static void DMod_SendBytesSelf(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t r EW_DIFF_MOD_L; } __enable_irq(); - delay_ms(5);//保障芯片总线空闲监听退出 + delay_ms(5);//保障芯片3ms总线空闲监听退出 } @@ -762,8 +797,7 @@ void DMod_SendBytes(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t rw_flag) */ void DMod_SendBytesXor(uint8_t* buf, uint8_t len, uint8_t rw_flag) { - //DMod_SendBytesSelf(buf,len,EW_DMOD_Peroid,rw_flag,CheckXOR_8); - DMod_SendBytesSelf(buf,len,200,rw_flag,CheckXOR_8); + DMod_SendBytesSelf(buf,len,EW_DMOD_Peroid,rw_flag,CheckXOR_8); } @@ -782,7 +816,7 @@ uint8_t DMod_ReadBytesXor(uint8_t* buf, uint8_t len,uint16_t retry_times) else return 2; } - return ret; + return 1; } @@ -796,7 +830,7 @@ void DMod_ReadInspect_Data(uint16_t count,uint8_t* buf) uint16_t index; uint8_t data; CurrentSample_Range_eu range = buscurrent_range;//档位保存 - Power_SetSampleCurrentRange(R10_2mA_30mA_MC);//采样电阻全开,快速放电 + Power_SetSampleCurrentRange(EWDriver_Sample_R);//采样电阻全开,快速放电 ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); //delay_us(500); //总线跳转到中电平 @@ -907,8 +941,8 @@ uint8_t EW_EnWriteMTP(uint16_t addr ,uint8_t en_flag) return 0; } delay_ms(2); - uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); - if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2]) { return 1; } @@ -933,22 +967,41 @@ uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) addr = (addr & 0xFFC0) | 63; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - EW_CommBuf[2] = mtpaddr; - if(len > 10) + + while(len > 10) { - len = 10; + EW_CommBuf[2] = mtpaddr; + EW_CommBuf[3] = 8; + memcpy((EW_CommBuf+4),buf,8); + DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); + len -= 8; + mtpaddr += 8; + buf += 8; + delay_os_ms(20); + if(uc_readflag == 0) + { + continue; + } + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)(EW_CommBuf+2),1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2]) + { + return 1; + } } + + EW_CommBuf[2] = mtpaddr; EW_CommBuf[3] = len; - memcpy((void*)(EW_CommBuf+4),buf,len); + memcpy((EW_CommBuf+4),buf,len); DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { + return 0; } - len = (len>>2)*8+4; + len = (len>>2)*8+6; delay_ms(len); - uc_ack = DMod_FireBusReadDatasV2((uint8_t*)(EW_CommBuf+2),2,EW_DMOD_READ_Timeout); - if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)(EW_CommBuf+2),1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2]) { return 1; } @@ -964,27 +1017,36 @@ uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) uint8_t EW_ReadMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) { uint8_t uc_ack = 0; - uint8_t uc_readflag = 0; - if(addr > 0) + uint8_t uc_readflag = 1; + if(addr == 0) { - uc_readflag = 1; + return 1; } addr<<=6; addr = (addr & 0xFFC0) | 62; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; + + while(len > 10) + { + EW_CommBuf[2] = mtpaddr; + EW_CommBuf[3] = 8; + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)buf,9,EW_DMOD_READ_Timeout); + if((buf[8] != CheckCRC_8(buf,8)) || (uc_ack != 0)) + { + return 1; + } + mtpaddr += 8; + buf += 8; + len -= 8; + delay_os_ms(20); + } + EW_CommBuf[2] = mtpaddr; - if(len > 10) - { - len = 10; - } EW_CommBuf[3] = len; - memcpy((void*)(EW_CommBuf+4),buf,len); - DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); - if(uc_readflag == 0) - { - return 1; - } + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag); delay_ms(2); uc_ack = DMod_FireBusReadDatasV2((uint8_t*)buf,len+1,EW_DMOD_READ_Timeout); if(buf[len] != CheckCRC_8(buf,len)) @@ -1010,7 +1072,7 @@ uint8_t EW_RunBootLoader(uint16_t addr,uint8_t reboot) { ul_bootflag = 0x9966AA55; } - memcpy((void*)(EW_CommBuf+2),&ul_bootflag,4); + memcpy((EW_CommBuf+2),&ul_bootflag,4); DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,0); return 0; } @@ -1032,15 +1094,15 @@ uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg) addr = (addr & 0xFFC0) | 20; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&runcfg,3); + memcpy((EW_CommBuf+2),&runcfg,3); DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { return 0; } delay_ms(4); - uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); - if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] ) { return 1; } @@ -1056,7 +1118,7 @@ uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg) @rtv 执行结果 */ -uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data) +uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len) { uint8_t uc_readflag = 0; uint8_t uc_ack = 0; @@ -1068,15 +1130,15 @@ uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_ addr = (addr & 0xFFC0) | 21; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),uid,uid_len); + memcpy((EW_CommBuf+2),uid,uid_len); DMod_SendBytes((uint8_t*)EW_CommBuf,uid_len+2,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { return 0; } delay_ms(2); - uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); - if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] ) { return 1; } @@ -1094,7 +1156,7 @@ uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_ @rtv 执行结果 */ -uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data) +uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data) { uint8_t uc_readflag = 0; uint8_t uc_ack = 0; @@ -1106,18 +1168,17 @@ uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* addr = (addr & 0xFFC0) | 22; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - EW_CommBuf[2] = pwd_flag; - memcpy((void*)(EW_CommBuf+3),&delay,2); - memcpy((void*)(EW_CommBuf+5),uid,uid_len); - uid_len +=5; + memcpy((EW_CommBuf+2),&delay,2); + memcpy((EW_CommBuf+4),uid,uid_len); + uid_len +=4; DMod_SendBytes(((uint8_t*)(EW_CommBuf)),uid_len,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { return 0; } delay_ms(2); - uc_ack = DMod_FireBusReadDatasV2(ack_data,5,EW_DMOD_READ_Timeout); - if(ack_data[4] != CheckCRC_8(ack_data,4)) + uc_ack = DMod_FireBusReadDatasV2(ack_data,2,EW_DMOD_READ_Timeout); + if(ack_data[0] != EW_CommBuf[2] || ack_data[1] != EW_CommBuf[2]) { return 1; } @@ -1133,15 +1194,24 @@ uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* */ uint8_t EW_SetDelay(uint16_t addr,uint16_t delay) { + uint8_t uc_readflag = 0; uint8_t uc_ack; + if(addr > 0) + { + uc_readflag = 1; + } addr<<=6; addr = (addr & 0xFFC0) | 23; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&delay,2); - DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); - uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); - if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + memcpy((EW_CommBuf+2),&delay,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2]) { return 1; } @@ -1157,19 +1227,33 @@ uint8_t EW_SetDelay(uint16_t addr,uint16_t delay) */ uint8_t EW_VerfyPWD(uint16_t addr,uint8_t* pwd,uint8_t pwd_len) { - + uint8_t uc_readflag = 0; + uint8_t uc_ack; + if(addr > 0) + { + uc_readflag = 1; + } addr<<=6; addr = (addr & 0xFFC0) | 24; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),pwd,pwd_len); + memcpy((EW_CommBuf+2),pwd,pwd_len); pwd_len += 2; - DMod_SendBytes((uint8_t*)EW_CommBuf,pwd_len,EW_DMOD_Peroid,0); - return 0; + DMod_SendBytes((uint8_t*)EW_CommBuf,pwd_len,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2]) + { + return 1; + } + return uc_ack; } /* -@brief 密码验证 +@brief 执行起爆 @param addr 通信地址 @param 延迟起爆时间*50ms @rtv 返回执行结果 @@ -1249,7 +1333,7 @@ uint8_t EW_ReadState(uint16_t addr,uint8_t* state) } delay_ms(2); uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,5,EW_DMOD_READ_Timeout); - if(EW_CommBuf[5] != CheckCRC_8((uint8_t*)EW_CommBuf,5)) + if(EW_CommBuf[4] != CheckCRC_8((uint8_t*)EW_CommBuf,4)) { return 1; }else{ @@ -1325,18 +1409,18 @@ uint8_t EW_CheckRunCfg(uint16_t addr,uint32_t cfg_mask ,uint32_t cfg_state,uint8 /* @brief 配置验证 @param addr 通信地址 -@param check_class 检测模式 0 基本自检 1 起爆开关检测 2 电容检测 4 读电容检测时间 +@param check_class 检测模式 0 基本自检 1 起爆开关检测 2 电容检测 8 读电容检测时间 @param *buf 读出测试结果 */ uint8_t EW_ChecSelf(uint16_t addr,uint8_t check_class,uint8_t* buf) { uint8_t uc_readflag = 0; uint8_t uc_ack = 0; - if(check_class == 4) + if(check_class == 8) { uc_readflag = 1; } - if(buf == NULL && check_class ==4) + if(buf == NULL && check_class ==8) { return 1; } @@ -1375,7 +1459,7 @@ uint8_t EW_SaveFireInfo(uint16_t addr) } /* -@brief 读延时和状态值 +@brief 读延时 @param addr 通信地址 @param delay 返回延时 */ @@ -1420,7 +1504,7 @@ uint8_t EW_SetReportCfg(uint8_t speed,uint8_t cur) EW_CommBuf[2] = speed; EW_CommBuf[3] = cur; DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); - return 0; + return 0; } /* @@ -1440,15 +1524,15 @@ uint8_t EW_UpdateCommAddr(uint8_t addr,uint16_t new_addr) addr = (addr & 0xFFC0) | 36; EW_CommBuf[0] = addr&0xFF; EW_CommBuf[1] = (addr >> 8)&0xFF; - memcpy((void*)(EW_CommBuf+2),&new_addr,2); + memcpy((EW_CommBuf+2),&new_addr,2); DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag); if(uc_readflag == 0) { return 0; } delay_ms(2); - uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); - if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2]) { return 1; } @@ -1484,7 +1568,7 @@ uint8_t EW_ReadClkAmend(uint16_t addr,uint32_t* clk_amend) return uc_ack; } /* -@brief 读校准值 +@brief 读配置信息和版本号 @param addr 通信地址 @param clk_amend 校准信息 */ @@ -1558,5 +1642,190 @@ uint8_t EW_ReadUID(uint16_t addr,uint8_t* uid,uint8_t uid_len) } return uc_ack; } +/**************************EW BootLoader命令*******************************************/ +/* +@brief 擦除代码空间 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_EraseCode(void) +{ + uint8_t uc_ack = 0; + EW_CommBuf[0] = 0xFE; + EW_CommBuf[1] = 0; + DMod_SendBytesXor(EW_CommBuf,2,1); + delay_ms(50); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,4,EW_DMOD_READ_Timeout<<1); + if(0 == CheckXOR_8((uint8_t*)EW_CommBuf,4) && uc_ack == 0) + { + uc_ack = 0; + }else{ + uc_ack = 1; + } + return uc_ack; +} +/* +@brief 擦除指定空间 +@param 起始地址 +@param 结束地址 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_EraseMTP(uint16_t bgaddr,uint16_t endaddr) +{ + uint8_t uc_ack = 0; + EW_CommBuf[0] = 0xFD; + EW_CommBuf[1] = 4; + EW_CommBuf[2] = bgaddr & 0xFF; + EW_CommBuf[3] = (bgaddr >> 8) & 0xFF; + EW_CommBuf[4] = endaddr & 0xFF; + EW_CommBuf[5] = (endaddr >> 8) & 0xFF; + DMod_SendBytesXor(EW_CommBuf,6,1); + delay_ms(10); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,4,EW_DMOD_READ_Timeout<<1); + if(0 == CheckXOR_8((uint8_t*)EW_CommBuf,4) && uc_ack == 0) + { + uc_ack = 0; + }else{ + uc_ack = 1; + } + return uc_ack; + +} + +/* +@brief 写数据到MTP,最多128字节 +@param 起始地址 +@param 写入数据缓存 +@param 写入数据长度 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_WriteMTP(uint16_t bgaddr,const uint8_t* w_buf,uint8_t len) +{ + uint8_t uc_ack = 0; + uint8_t* cmd_buf = rt_malloc(len+8); + uint32_t w_len = len; + if(len > 128) + { + return 1; + } + EW_CommBuf[0] = 0xFC; + EW_CommBuf[1] = 2+len; + EW_CommBuf[2] = bgaddr & 0xFF; + EW_CommBuf[3] = (bgaddr >> 8) & 0xFF; + + memcpy((EW_CommBuf+4),w_buf,len); + DMod_SendBytesXor(EW_CommBuf,len+4,1); + w_len = len+4; + w_len *= 60; + w_len /= 1000; + delay_ms(5+w_len); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,4,EW_DMOD_READ_Timeout); + if(0 == CheckXOR_8((uint8_t*)EW_CommBuf,4) && uc_ack == 0) + { + uc_ack = 0; + }else{ + uc_ack = 1; + } + return uc_ack; + +} + +/* +@breif 获取Crc32 +@param 起始地址 +@param 结束地址 +@param *rt_crc32存储区域 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_CacluCrc32(uint16_t bgaddr,uint16_t endaddr, uint32_t* rt_crc32) +{ + uint8_t uc_ack = 0; + EW_CommBuf[0] = 0xFB; + EW_CommBuf[1] = 4; + EW_CommBuf[2] = bgaddr & 0xFF; + EW_CommBuf[3] = (bgaddr >> 8) & 0xFF; + EW_CommBuf[4] = endaddr & 0xFF; + EW_CommBuf[5] = (endaddr >> 8) & 0xFF; + DMod_SendBytesXor(EW_CommBuf,6,1); + delay_ms(10); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,8,EW_DMOD_READ_Timeout); + if(0 == CheckXOR_8((uint8_t*)EW_CommBuf,4) && uc_ack == 0) + { + uc_ack = 0; + memcpy(rt_crc32,(uint8_t*)(EW_CommBuf+3),4); + }else{ + uc_ack = 1; + } + return uc_ack; +} +/* +@brief 读取MTP数据 +@param 起始地址 +@param 读取长度 +@param *read_buf 读取数据缓存 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_ReadMTP(uint16_t bgaddr,uint8_t read_len, uint8_t* read_buf) +{ + uint8_t uc_ack = 0; + EW_CommBuf[0] = 0xFA; + EW_CommBuf[1] = 4; + EW_CommBuf[2] = bgaddr & 0xFF; + EW_CommBuf[3] = (bgaddr >> 8) & 0xFF; + EW_CommBuf[4] = read_len; + DMod_SendBytesXor(EW_CommBuf,5,1); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,4+read_len,EW_DMOD_READ_Timeout); + if(0 == CheckXOR_8((uint8_t*)EW_CommBuf,4+read_len) && uc_ack == 0) + { + uc_ack = 0; + memcpy(read_buf,(uint8_t*)(EW_CommBuf+3),read_len); + }else{ + uc_ack = 1; + } + return uc_ack; +} + +/* +brief 强制跳转用户区 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_RunApp(void) +{ + uint8_t uc_ack = 0; + EW_CommBuf[0] = 0xF9; + EW_CommBuf[1] = 0; + DMod_SendBytesXor(EW_CommBuf,2,1); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,4,EW_DMOD_READ_Timeout); + if(0 == CheckXOR_8((uint8_t*)EW_CommBuf,4) && uc_ack == 0) + { + uc_ack = 0; + }else{ + uc_ack = 1; + } + return uc_ack; +} +/* +@brief 充放电控制 +@param chg_flag 充电控制开关 1 充电 0 放电 +@rtv 0 执行成功 1失败 +*/ +uint8_t EWB_ChgCtrl(uint8_t chg_flag) +{ + uint8_t uc_ack = 0; + EW_CommBuf[0] = 0xF8; + EW_CommBuf[1] = 1; + EW_CommBuf[2] = chg_flag; + DMod_SendBytesXor(EW_CommBuf,3,1); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,4,EW_DMOD_READ_Timeout); + if(0 == CheckXOR_8((uint8_t*)EW_CommBuf,4) && uc_ack == 0) + { + uc_ack = 0; + }else{ + uc_ack = 1; + } + return uc_ack; +} diff --git a/source/elec_det/driver/EWDriver.h b/source/elec_det/driver/EWDriver.h index 7cf1ff9..3a7d1d5 100644 --- a/source/elec_det/driver/EWDriver.h +++ b/source/elec_det/driver/EWDriver.h @@ -2,7 +2,7 @@ #define EWDRIVER_H #include "base/define.h" -#define EW_DMODE_FRAME_SIZE 16 +#define EW_DMODE_FRAME_SIZE 136 # typedef enum { @@ -22,9 +22,9 @@ typedef enum{ //系统运行时配置 typedef union { struct{ -uint8_t fire_mos_sw : 2;//起爆mos开关选择 0 内部 1 外部 (默认0) -uint8_t vbus_rx_sg : 2;//接收数据信号 1 vbuss_rxh 2 vbuss_rxl 3 vbusd_rx (默认 3) -uint8_t vbus_mode : 2;//通讯类型判断 01 差分 10 单端。00 11 根据总线电压判断 (默认 01) +uint8_t fire_mos_sw : 2;//起爆mos开关选择 0 内部 1 外部 (默认0) +uint8_t vbus_rx_sg : 2;//接收数据信号 1 vbuss_rxh 2 vbuss_rxl 3 vbusd_rx (默认 3) +uint8_t vbus_mode : 2;//通讯类型判断 01 差分 10 单端。00 11 根据总线电压判断 (默认 01) uint8_t reserve01 : 2;//保留 uint8_t reset_run_step : 3;//打点周期 0 不打点 1 5ms 2 10ms 3 20ms 4 50ms 5 100ms 6 150ms 7 200ms(默认 0) uint8_t uid_len : 3;//uid长度 uid_len + 7(默认 1) @@ -122,6 +122,14 @@ volatile struct #define EW_BOOTLOADER_RUN 61 //运行bootloader #define EW_RA_REGISTER 62 //读MTP #define EW_WA_REGISTER 63 //写MTP + + +extern uint16_t EW_FreeBack_MaxCur,EW_FreeBack_MinCur; +extern uint16_t EW_FreeBack_MaxTime,EW_FreeBack_MinTime; + +//通信监控变量初始化 +void EW_FreeBack_Prapare(void); + /* @brief 发送校准脉冲 @param cycle 周期 @@ -130,6 +138,15 @@ volatile struct */ void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count); + + +/* +@brief 差分模式读取为应答 +@param count 读取的数量 +@param 接收数据缓存 +*/ +void DMod_ReadInspect_Data(uint16_t count,uint8_t* buf); + /* @brief 单端第二版,差分接收数据 @param *buf 数据缓存指针 @@ -137,8 +154,6 @@ void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count); @param time_out 超时脉冲数(约1bit数据时间) @rtv 0 成功 否则失败 */ - - uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out); /* @@ -152,14 +167,6 @@ void DMod_SendBytes(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t rw_flag); void DMod_SendBytesXor(uint8_t* buf, uint8_t len, uint8_t rw_flag); uint8_t DMod_ReadBytesXor(uint8_t* buf, uint8_t len,uint16_t retry_times); - -/* -@brief 差分模式读取为应答 -@param count 读取的数量 -@param 接收数据缓存 -*/ -void DMod_ReadInspect_Data(uint16_t count,uint8_t* buf); - /* @breif 通信测试 */ @@ -210,7 +217,7 @@ uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg); @rtv 执行结果 */ -uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data); +uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len); /* @brief 快速分配通信地址 @param 通信地址 @@ -221,7 +228,7 @@ uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_ @rtv 执行结果 */ -uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data); +uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data); /* @brief 设置延时 @param addr 通信地址 @@ -342,7 +349,52 @@ uint8_t EW_AutoSetAddr(uint16_t max_addr,uint16_t fac_addr); @param UID数据 */ uint8_t EW_ReadUID(uint16_t addr,uint8_t* uid,uint8_t uid_len); - +/*******************************************************************************************/ +/* +@brief 充放电控制 +@param chg_flag 充电控制开关 1 充电 0 放电 +@rtv 0 执行成功 1失败 +*/ +uint8_t EWB_ChgCtrl(uint8_t chg_flag); +/* +@brief 擦除指定空间 +@param 起始地址 +@param 结束地址 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_EraseMTP(uint16_t bgaddr,uint16_t endaddr); +/* +@brief 擦除代码空间 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_EraseCode(void); +/* +@breif 获取Crc32 +@param 起始地址 +@param 结束地址 +@param *rt_crc32存储区域 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_CacluCrc32(uint16_t bgaddr,uint16_t endaddr, uint32_t* rt_crc32); +/* +@brief 读取MTP数据 +@param 起始地址 +@param 读取长度 +@param *read_buf 读取数据缓存 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_ReadMTP(uint16_t bgaddr,uint8_t read_len, uint8_t* read_buf); +/* +brief 强制跳转用户区 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_RunApp(void); +/* +@brief 擦除指定空间 +@param 起始地址 +@param 写入数据缓存 +@param 写入数据长度 +@rtv 返回值 0 成功 1 失败 +*/ +uint8_t EWB_WriteMTP(uint16_t bgaddr,const uint8_t* w_buf,uint8_t len); #endif - - diff --git a/source/elec_det/driver/history/EWDriver.c b/source/elec_det/driver/history/EWDriver.c new file mode 100644 index 0000000..c347fa2 --- /dev/null +++ b/source/elec_det/driver/history/EWDriver.c @@ -0,0 +1,1562 @@ +#include "EWDriver.h" +#include "base/delay.h" +#include "base/utility.h" +#include "hardware/gpio_cfg.h" +#include "base/utility.h" +#include "hardware/adc_cfg.h" +#include "hardware/power.h" +#include "ewdriver.h" +#include "hardware/timer_cfg.h" +#include "debug.h" + +static volatile EWBus_Mod_en bus_mod = OFF_MOD; +static volatile CurrentSample_Range_eu buscurrent_range = Current_Max; +#define FB_Read_AD_Sample_C 30 +#if FIREBUS_ADC_BUF_LEN < FB_Read_AD_Sample_C +#error "EWDriver ADC define error" +#endif + +#define SMod_Read_Idle_Filter 90 +#define DMod_Read_Idle_Filter 50 + +volatile uint16_t* EW_Read_AD_V = FireBus_ADC_Buf; +static volatile uint16_t SMod_Read_Idle_C; +static uint16_t firebus_idle_diff = SMod_Read_Idle_Filter; + +const static uint16_t data2bit_signal[]={200,234,275,323,380,446}; +volatile static uint16_t datapulus[6][2]; +//发送起始信号 +#define SMod_Begin_Plus() SMod_2Bit_Plus(4) +//发送结束信号 +#define SMod_End_Plus() SMod_2Bit_Plus(5) +volatile uint8_t EW_CommBuf[EW_DMODE_FRAME_SIZE]; +volatile uint16_t EW_DMOD_Peroid = 300; +volatile uint16_t EW_DMOD_READ_Timeout = 6000; +//发送唤醒信号 +static void SMod_Wake_Plus(void) +{ + EW_SINGLE_MOD_M; + delay_us(200); + EW_SINGLE_MOD_H; + delay_us(600); + +} +//发送2Bit数据信号 +static void SMod_2Bit_Plus(uint8_t data) +{ + if(data > 5) + return; + EW_SINGLE_MOD_M; + delay_us(datapulus[data][0]); + EW_SINGLE_MOD_H; + delay_us(datapulus[data][1]); +} + +//读取1bit数据 +static uint8_t SMod_ReadBit(uint16_t wait_us) +{ + uint32_t ul_temp = 0; + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + EW_SINGLE_MOD_M; + delay_us(wait_us); + while(ul_temp < FB_Read_AD_Sample_C) + { + EW_Read_AD_V[ul_temp++] = ADC_GetCurADCFast(); + } + EW_SINGLE_MOD_H; + Bubble_Sort_u16((uint16_t*)EW_Read_AD_V,FB_Read_AD_Sample_C); + ul_temp = EW_Read_AD_V[FB_Read_AD_Sample_C - 6]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 7]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 8]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 9]; + ul_temp >>= 2; + if(ul_temp > SMod_Read_Idle_C) + { + LED1_Out_On; + return 1; + } + LED1_Out_Off; + return 0; +} + +static uint8_t DMod_ReadBit(uint16_t wait_us) +{ + uint32_t ul_temp = 0; + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + EW_DIFF_MOD_M; + delay_us(wait_us); + while(ul_temp < FB_Read_AD_Sample_C) + { + EW_Read_AD_V[ul_temp++] = ADC_GetCurADCFast(); + } + EW_DIFF_MOD_L; + Bubble_Sort_u16((uint16_t*)EW_Read_AD_V,FB_Read_AD_Sample_C); + ul_temp = EW_Read_AD_V[FB_Read_AD_Sample_C - 6]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 7]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 8]; + ul_temp += EW_Read_AD_V[FB_Read_AD_Sample_C - 9]; + ul_temp >>= 2; + if(ul_temp > SMod_Read_Idle_C) + { + LED1_Out_On ; + return 1; + } + LED1_Out_Off; + return 0; +} +/* +@brief 读取模块ACK +@param 超时 0.1ms +*/ +static uint8_t DMod_ReadAck(uint16_t time_out) +{ + uint32_t ul_temp = 0; + uint32_t ul_temp2 = 0; + uint16_t us_count = 0; + ul_temp = time_out*10; + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + EW_DIFF_MOD_M; + Get10usCount(); + while((ul_temp2 < ul_temp) && (us_count < 10)) + { + if(ADC_GetCurADCFast() > SMod_Read_Idle_C) + { + us_count++; + }else{ + us_count = 0; + } + ul_temp2 += Get10usCount(); + } + if(us_count < 10) + { + EW_DIFF_MOD_H; + return 0; + } + delay_ms(20); + EW_DIFF_MOD_H + return 1; + +} + +//从AD采样缓存总,计算空闲电流 +static uint16_t FireBus_UpdataIdeV(void) +{ + SMod_Read_Idle_C = 0; + SMod_Read_Idle_C = (uint32_t)(EW_Read_AD_V[FB_Read_AD_Sample_C - 6]); + SMod_Read_Idle_C += (uint32_t)(EW_Read_AD_V[FB_Read_AD_Sample_C - 7]*3); + SMod_Read_Idle_C += (uint32_t)(EW_Read_AD_V[FB_Read_AD_Sample_C - 8]*4); + SMod_Read_Idle_C += (uint32_t)(EW_Read_AD_V[FB_Read_AD_Sample_C - 9]*2); + SMod_Read_Idle_C /= 10; + SMod_Read_Idle_C += firebus_idle_diff; + return SMod_Read_Idle_C; +} +//采集空闲电流 +static uint16_t SMod_GetIdleV(void) +{ + firebus_idle_diff = SMod_Read_Idle_Filter; + SMod_ReadBit(80);//获取采样电流 + return FireBus_UpdataIdeV(); +} +static uint16_t DMod_GetIdleV(void) +{ + firebus_idle_diff = DMod_Read_Idle_Filter; + DMod_ReadBit(300);//获取采样电流 + return FireBus_UpdataIdeV(); +} +static uint16_t SMod_GetIdle2V(void) +{ + uint32_t ul_temp = 0; + firebus_idle_diff = SMod_Read_Idle_Filter; + while(ul_temp < FB_Read_AD_Sample_C) + { + EW_Read_AD_V[ul_temp++] = ADC_GetCurADCFast(); + } + return FireBus_UpdataIdeV(); +} + +static uint16_t DMod_GetIdle2V(void) +{ + uint32_t ul_temp = 0; + firebus_idle_diff = DMod_Read_Idle_Filter; + while(ul_temp < FB_Read_AD_Sample_C) + { + EW_Read_AD_V[ul_temp++] = ADC_GetCurADCFast(); + } + return FireBus_UpdataIdeV(); +} + + + +//采集到应答信号返0 否则返1 +static uint8_t SMod_WaitAck(uint16_t time_out) +{ + + while(time_out > 0) + { + time_out--; + if(SMod_ReadBit(80) > 0) + { + delay_us(350); + return 0; + } + delay_us(350); + } + return 1; + +} + + +void EW_BusDef_Init(void) +{ + uint16_t us_temp = 80; + uint8_t count = 0; + for(count = 0; count < 6;count++) + { + datapulus[count][0] = us_temp; + datapulus[count][1] = data2bit_signal[count] - us_temp-12;//-4为延时偏移,实测。 + } +} + + +/* +@brief 单端发送4Bytes 数据 +@param *buf 4字节数据缓存指针 +@param type 数据帧类型 +@param bg_count 起始信号个数 +@param end_count 结束信号个数 +*/ +void SMod_FireBusSend4BytesFrame(uint8_t* buf,EW_SINGLE_FRAME_TYPE_en type ,uint8_t bg_count,uint8_t end_count) +{ + uint8_t uc_plus_type[17]; + uint8_t uc_data; + uint32_t ul_count1 = 0; + uint32_t ul_count2 = 0; + uc_plus_type[ul_count1++] = (uint8_t)type; + while(ul_count1 < 17) + { + ul_count2 = 0; + uc_data = *buf; + while(ul_count2 < 4) + { + uc_plus_type[ul_count1++] = (uc_data & 0xC0)>>6; + uc_data <<= 2; + ul_count2++; + } + buf++; + } + SMod_Wake_Plus(); + /******************/ + while(bg_count > 0) + { + bg_count --; + SMod_Begin_Plus(); + } + for(ul_count1 = 0; ul_count1 < 17; ul_count1++) + { + SMod_2Bit_Plus(uc_plus_type[ul_count1]); + } + while(end_count > 0) + { + end_count --; + SMod_End_Plus(); + } +} +/* +@brief 单端模式发送数据 +@param *buf 数据缓存指针 +@param bg_count 起始信号个数 +@param end_count 结束信号个数 +*/ +uint8_t SMod_SendData(uint8_t* buf, uint16_t len,uint8_t bg_count,uint8_t end_count) +{ + uint16_t us_count = 0; + uint8_t* databuf = (uint8_t*)rt_malloc(len+4); + uint8_t crc = 0; + if(databuf == RT_NULL) + { + + return 1; + } + len--; + rt_memcpy(databuf,buf,len); + while((len % 4) != 3) + { + databuf[len++] = 0; + } + databuf[len] = CheckXOR_8(databuf,len); + len++; + if(len == 4) + { + SMod_FireBusSend4BytesFrame(databuf,COMPLETE_FRAME,bg_count,end_count); + goto SMod_Data_Send_End; + } + SMod_FireBusSend4BytesFrame(databuf,BEGIN_FRAME,bg_count,end_count); + us_count += 4; + while(us_count < (len-4)) + { + delay_ms(40); + SMod_FireBusSend4BytesFrame(databuf+us_count,DATA_FRAME,bg_count,end_count); + us_count += 4; + } + delay_ms(40); + SMod_FireBusSend4BytesFrame(databuf+us_count,END_FRAME,bg_count,end_count); +SMod_Data_Send_End: + rt_free(databuf); + return 0; +} + +/* +@brief 单端接收数据 +@param *buf 数据缓存指针 +@param len 读取数据长度 +@param time_out 应答信号超时个数 +*/ +uint8_t SMod_FireBusReadDatas(uint8_t* buf, uint8_t len, uint16_t time_out) +{ + uint32_t ul_temp = 0; + uint8_t uc_data; + CurrentSample_Range_eu range = buscurrent_range;//档位保存 + Power_SetSampleCurrentRange(R10_2mA_30mA_MC); + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + delay_ms(1); + + //采集空闲电流 + SMod_GetIdleV(); + delay_us(350); + SMod_GetIdleV(); + delay_us(350); + if(SMod_WaitAck(time_out) > 0) + { + Power_SetSampleCurrentRange(range); + return 1; + } + while(len > 0) + { + ul_temp = 0; + uc_data = 0; + len--; + while(ul_temp < 8) + { + uc_data <<= 1; + uc_data += SMod_ReadBit(80); + delay_us(500); + ul_temp++; + } + *buf = uc_data; + buf++; + } + Power_SetSampleCurrentRange(range); + return 0; +} + +/* +@brief 获取巡检数据 +@param count 巡检脉冲数 +@param buf 数据缓存区 +@rtv 无 +*/ +void FireBus_ReadInspect_Data(uint16_t count,uint8_t* buf) +{ + uint16_t index; + uint8_t data; + CurrentSample_Range_eu range = buscurrent_range;//档位保存 + Power_SetSampleCurrentRange(R10_2mA_30mA_MC);//采样电阻全开,快速放电 + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_MIDLE); + //delay_us(500); + //总线跳转到中电平 + EW_SINGLE_MOD_M; + //延时等待电流稳定 + //COM_PH2_Out = 0; + delay_us(240); + //获取中电平电流 + SMod_GetIdle2V(); + EW_SINGLE_MOD_H + delay_us(700); + rt_memset(buf,0,((count+7 ) >> 3)); + index = 0; + while(index < count) + { + data = *(buf+(index >> 3)); + if( SMod_ReadBit(80) > 0) + { + data |= (0x01 << (index & 0x07)); + }; + EW_SINGLE_MOD_H + delay_us(800); + *(buf+(index >> 3)) = data; + index++; + } + Power_SetSampleCurrentRange(range); +} + +/*************************************************************/ +#define DMOD_READ_AD_FILTER_COUNT 4 +static uint8_t SMod_FireBusReadPlus(uint16_t* plus_h, uint16_t* plus_t,uint16_t time_out,uint16_t ad_line,uint16_t* max_ad) +{ + uint32_t ul_ad_sample; + uint32_t ul_index = 0; + uint16_t us_adc_buf[DMOD_READ_AD_FILTER_COUNT+1]; + uint32_t ul_count = 0; + uint32_t uc_step = 0; + uint32_t ul_h_count = 0,ul_l_count = 0; + *max_ad = 0; + for(ul_count =0; ul_count < DMOD_READ_AD_FILTER_COUNT; ul_count++) + { + us_adc_buf[ul_count++] = ADC_GetCurADCFast(); + } + //数据发送时,以高脉冲在先,然后是低电平, + do{ + time_out--; + ul_ad_sample = ADC_GetCurADCFast(); + if(ul_ad_sample > *max_ad) + *max_ad = ul_ad_sample; +// if(ul_ad_sample > ad_line) +// { +// PBout(I2IC_SCL_Pin_Nu) = 1 ; +// }else{ +// PBout(I2IC_SCL_Pin_Nu) = 0; +// } + us_adc_buf[ul_count++] = ul_ad_sample; + ul_count %= DMOD_READ_AD_FILTER_COUNT; + ul_h_count = 0; + ul_l_count = 0; + for(ul_index =0; ul_index < DMOD_READ_AD_FILTER_COUNT; ul_index++) + { + if(us_adc_buf[ul_index] > ad_line) + { + ul_h_count++; + }else{ + ul_l_count++; + } + } + if(uc_step == 0 && ul_h_count >(DMOD_READ_AD_FILTER_COUNT-1))//启动周期计数 + { + (*plus_h)++; + (*plus_t)++; + uc_step = 1; + }else if(uc_step == 0){ + continue;//未启动 + } + if(uc_step == 1) + { + if(ul_h_count > (DMOD_READ_AD_FILTER_COUNT-1)) + { + PBout(I2IC_SCL_Pin_Nu) = 1 ; + (*plus_h)++; + uc_step = 1; + }else if(ul_l_count > (DMOD_READ_AD_FILTER_COUNT-1)) //由高变低 + { + PBout(I2IC_SCL_Pin_Nu) = 0; + uc_step = 2; + } + } + else if(uc_step == 2 && ul_h_count > (DMOD_READ_AD_FILTER_COUNT-1))//由低变高 + { + PBout(I2IC_SCL_Pin_Nu) = 1 ; + break; + } + (*plus_t)++; + + }while(time_out > 0); + if(time_out < 1)//等待起始信号超时 + { + return 1; + } + return 0; +} +/* +@brief 单端第二版,差分接收数据 +@param *buf 数据缓存指针 +@param len 读取数据长度 +@param time_out 超时脉冲数(约1bit数据时间) +@rtv 0 成功 否则失败 +*/ +static uint16_t us_plus_H,us_plus_H2;//高电平采用次数 +static uint16_t us_plus_T,us_plus_T2;//采样周期 +uint16_t idle_line = 0; +typedef struct{ + uint16_t cur_idle; + uint16_t cur_idle_ad; + uint16_t cur_high_value; + uint16_t cur_idle_line; + uint16_t cur_max; +}firebus_def; +uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out) +{ + uint32_t ul_ad_sample; + uint32_t ul_check_falg; //奇校验 + uint32_t us_time_out = time_out; + uint32_t ul_data = 0; + uint32_t us_dataT_Or;//数据周期 + uint32_t us_temp1,us_temp2; + uint16_t ad_max = 0,ad_max_temp = 0; + firebus_def fire_dat={0}; + uint8_t ret=0; + CurrentSample_Range_eu range = buscurrent_range;//档位保存 + Power_SetSampleCurrentRange(R10_2mA_30mA_MC); + ADC_CurChnnelSet(AN_MAL_CH,ADC_SPEED_HFAST); + delay_us(2000); + //总线跳转到中电平 + EW_DIFF_MOD_M; + //延时等待电流稳定 + delay_us(800); + //COM_PH2_Out = 0; + PBout(I2IC_SCL_Pin_Nu) = 0; + delay_us(200); + //获取中电平电流 + PBout(I2IC_SCL_Pin_Nu) = 1 ; + DMod_GetIdle2V(); + fire_dat.cur_idle=SMod_Read_Idle_C; + fire_dat.cur_idle_ad=ADC_GetCurADCFast(); + PBout(I2IC_SCL_Pin_Nu) = 0 ; + //读取指定长度数据 + //读取单字节数据 + ul_data = 0; + //等待起始信号唤醒信号 + us_plus_H = 0; + us_plus_T = 0; + us_time_out = 2000 + time_out; + do{ + + ul_ad_sample = ADC_GetCurADCFast(); + if(ad_max < ul_ad_sample) + ad_max = ul_ad_sample; + if(ul_ad_sample > SMod_Read_Idle_C) + { + if(ul_ad_sample-SMod_Read_Idle_C>50){ + us_plus_H++; + fire_dat.cur_high_value=fire_dat.cur_high_value/2+ul_ad_sample/2; + }else{ + SMod_Read_Idle_C=ul_ad_sample; + } + }else{ + us_plus_H = 0; + fire_dat.cur_high_value=0; + } + delay_us(2); + us_time_out--; + } + while((us_plus_H < 4) && (us_time_out > 0)); + fire_dat.cur_max=ad_max; + if(us_time_out < 1)//等待起始信号超时 + { + ret=1; + goto end; + } + + // 空闲判线以最高电平为基准 + SMod_Read_Idle_C=(SMod_Read_Idle_C+fire_dat.cur_high_value)/2; + fire_dat.cur_idle_line=SMod_Read_Idle_C; + + while(len > 0) + { + //等待数据帧起始信号 + us_time_out = 10; + us_plus_T2 = 0xFFFF; + us_plus_H2 = 0; + while(us_time_out > 0) + { + us_plus_H = 0; + us_plus_T = 0; + idle_line = SMod_Read_Idle_C; +// idle_line = ad_max - SMod_Read_Idle_C; +// idle_line = (idle_line>>1)+ (idle_line>>4)+ SMod_Read_Idle_C; + if(SMod_FireBusReadPlus(&us_plus_H,&us_plus_T,time_out,idle_line,&ad_max_temp ) > 0) + { + ret=2; + goto end; + } + if(us_plus_H2 > (us_plus_T2- us_plus_H2)) + { + us_temp1 = us_plus_T << 1; //2倍 + us_temp2 = us_plus_T + (us_plus_T >> 1);//1.5倍 + if((us_plus_T2 > us_temp2) && (us_plus_T2 < us_temp1)) + { + break; + } + } + us_plus_T2 = us_plus_T; + us_plus_H2 = us_plus_H; + us_time_out--; + } + //采集8bit数据+1位校验 + ul_data = 0; + ul_check_falg = 0; + us_time_out = 0; + us_plus_T2 = 0; + us_dataT_Or = us_plus_T;//保存数据周期 + do{ + ul_data <<= 1; + if(us_plus_H > (us_plus_T- us_plus_H)) //高电平时间大于低电平 1 + { + ul_data |= 0x01; + ul_check_falg ^= 0x01; + }else{//检测是否是结束信号 0 + us_temp1 = us_plus_T2 << 1; //2倍 + us_temp2 = us_plus_T2 + (us_plus_T2 >> 1);//1.5倍 + if((us_plus_T > us_temp2) && (us_plus_T < us_temp1)) + { + break; + } + } + //约束数据周期范围 +// if(((us_dataT_Or+4) < us_plus_T) +// || ((us_dataT_Or - 4) > us_plus_T)) +// { +// SetSampleCurrentRange(range); +// EW_SINGLE_MOD_H; +// return 3; +// } + us_plus_T2 = us_plus_T; + us_plus_H2 = us_plus_H; + us_plus_H = 0; + us_plus_T = 0; + //idle_line = ad_max - SMod_Read_Idle_C; + //idle_line = (idle_line>>1)+ (idle_line>>4)+ SMod_Read_Idle_C; + idle_line = SMod_Read_Idle_C; + if(SMod_FireBusReadPlus(&us_plus_H,&us_plus_T,time_out,idle_line,&ad_max_temp ) > 0) + { + ret=4; + goto end; + } + ad_max = (uint16_t)(ad_max * 0.7f + ad_max_temp*0.3f); + us_time_out++; + }while(us_time_out < 13); + if(ul_check_falg == 0) + { + ret=5; + goto end; + } + if(us_time_out != 9) + { + ret=6; + goto end; + } + ul_data >>= 2; + *buf = (uint8_t)ul_data; + buf++; + len--; + } + //delay_us(time_out >> 1); + + end: + EW_DIFF_MOD_H; + Power_SetSampleCurrentRange(range); + if(ret){ + DBG_LOG("cur_idle=%d,high_value=%d,idle_line=%d.",fire_dat.cur_idle, fire_dat.cur_high_value,fire_dat.cur_idle_line); + DBG_LOG("cur_max=%d,cur_idle_ad=%d",fire_dat.cur_max,fire_dat.cur_idle_ad); + } + return ret; +} + + +/* +@brief 差分模式数据发送 +@param buf 发送数据缓存 +@param len 发送长度 +@param pre 数据脉冲周期 + +*/ +static void DMod_SendBytesSelf(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t rw_flag, + uint8_t (*crc_fun)(uint8_t *,uint16_t)) +{ + uint16_t us_count = 0; + uint8_t uc_checkc_flag = 0; + uint8_t uc_datatemp = 0; + uint16_t beg_send_pre,beg_H_plus,end_H_plus,data1_H_plus,data0_H_plus; + beg_send_pre = pre+(pre >> 1)+(pre >> 2);//1.75倍数据周期 + beg_H_plus = (uint16_t)(beg_send_pre * 0.65f)+1; + end_H_plus = (uint16_t)(beg_send_pre * 0.35f)+1; + data1_H_plus = (uint16_t)(pre * 0.65f); + data0_H_plus = (uint16_t)(pre * 0.35f); + //buf[len] = CheckCRC_8(buf,len); + buf[len] = crc_fun(buf,len); + len++; + /* + 1.发送3个结束信号用作芯片唤醒 + 2.循环发送缓存数据中的数据 + 2-1 发送1个起始信号 + 2-2 发送8bit数据信号 + 2-3 发送1bit校验信号 + 2-4 发送1个结束信号 + 2-5 调整循环变量,满足循环从2-1再次执行,否则退出 + 3 补发送一个结束信号 + */ + //发送唤醒脉冲 + __disable_irq(); + while(us_count < 3) + { + EW_DIFF_MOD_L; + delay_us( beg_send_pre - end_H_plus); + EW_DIFF_MOD_H; + delay_us(end_H_plus); + us_count++; + } + while(len > 0) + { + us_count = 0; + uc_checkc_flag = 0; + len--; + //发送起始信号 + EW_DIFF_MOD_L; + delay_us(beg_H_plus); + EW_DIFF_MOD_H; + delay_us( beg_send_pre - beg_H_plus); + uc_datatemp = *buf; + //8bit数据信号+1bit校验 + while(us_count < 9) + { + if((uc_datatemp & 0x80) > 0) + { + EW_DIFF_MOD_L; + delay_us(data1_H_plus); + EW_DIFF_MOD_H; + delay_us( pre - data1_H_plus); + uc_checkc_flag ^= 0x01; + }else{ + EW_DIFF_MOD_L; + delay_us(data0_H_plus); + EW_DIFF_MOD_H; + delay_us( pre - data0_H_plus); + } + uc_datatemp <<= 1; + us_count++; + if(us_count == 8) + { + uc_checkc_flag ^= 0x01; + uc_datatemp &= 0x7F; + uc_datatemp |= (uc_checkc_flag << 7); + } + } + buf++; + //发结束始信号 + EW_DIFF_MOD_L; + delay_us(end_H_plus); + EW_DIFF_MOD_H; + delay_us( beg_send_pre - end_H_plus); + } + //补发结束信号 + EW_DIFF_MOD_L; + delay_us(end_H_plus); + EW_DIFF_MOD_H; + delay_us( beg_send_pre - end_H_plus); + if(rw_flag > 0) + { + EW_DIFF_MOD_L; + } + __enable_irq(); + delay_ms(5);//保障芯片总线空闲监听退出 +} + + + +void DMod_SendBytes(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t rw_flag) +{ + DMod_SendBytesSelf(buf,len,pre,rw_flag,CheckCRC_8); +} + + +/* +* 函数会在 buf[len] 的位置添加一个校验数据 +* 所以传入的buf的实际长度要求至少比len长1 +*/ +void DMod_SendBytesXor(uint8_t* buf, uint8_t len, uint8_t rw_flag) +{ + //DMod_SendBytesSelf(buf,len,EW_DMOD_Peroid,rw_flag,CheckXOR_8); + DMod_SendBytesSelf(buf,len,200,rw_flag,CheckXOR_8); +} + + +uint8_t DMod_ReadBytesXor(uint8_t* buf, uint8_t len,uint16_t retry_times) +{ + uint8_t ret; +// for(int i=0;i> 3)); + index = 0; + while(index < count) + { + data = *(buf+(index >> 3)); + if( DMod_ReadBit(400) > 0) + { + data |= (0x01 << (index & 0x07)); + } + delay_us(1200); + *(buf+(index >> 3)) = data; + index++; + } + Power_SetSampleCurrentRange(range); + delay_ms(1); + EW_DIFF_MOD_H; +} + + +/***********************************************************/ + + +volatile uint8_t EW_Trim_Flag = 0; +static void EW_TrimPlusCallback(uint8_t flag) +{ + if(flag == 1) + { + EW_DIFF_MOD_L; + }else if(flag > 1){ + EW_DIFF_MOD_H; + } + EW_Trim_Flag = flag; +} +/* +@brief 发送校准脉冲 +@param cycle 周期 +@param duty 总线高电平时间 +@param count 脉冲个数 + +*/ +void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count) +{ + FireBus_ClkAmend(cycle,duty,count,EW_TrimPlusCallback); + EW_Trim_Flag = 0; + while(EW_Trim_Flag != 3) + { + delay_ms(20); + } + delay_ms(1); + EW_DIFF_MOD_H +} + +/* +@breif 通信测试 +*/ +uint8_t EW_CommTest(uint8_t* buf,uint16_t len,uint16_t cycle) +{ + uint8_t auc_buf[16]; + uint16_t us_head = 1; + us_head = (us_head << 6)& 0xFFC0; + us_head += EW_COMM_TEST; + auc_buf[0] = us_head & 0xFF; + auc_buf[1] = (us_head >> 8) & 0xFF; + if(len > 13) + { + len = 13; + } + memcpy(auc_buf+2,buf,len); + len += 2; + DMod_SendBytes(auc_buf,len,cycle,1); + memset(buf,0,len); + delay_ms(2); + return DMod_FireBusReadDatasV2(buf,len+1,500); +} +/* +@brief 使能MTP写 +@param addr 通信地址 +@param 使能开关 +@rtv 执行结果 +*/ +uint8_t EW_EnWriteMTP(uint16_t addr ,uint8_t en_flag) +{ + uint8_t uc_ack = 0; + uint8_t uc_readflag = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 40; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = en_flag; + DMod_SendBytes((uint8_t*)EW_CommBuf,3,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} +/* +@brief 读MTP +@param addr 通信地址 +@param mtpaddr MTP地址/4 +@param buf 写入数据的缓存 +@param len 数据长度 +*/ +uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) +{ + uint8_t uc_ack = 0; + uint8_t uc_readflag = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 63; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = mtpaddr; + if(len > 10) + { + len = 10; + } + EW_CommBuf[3] = len; + memcpy((void*)(EW_CommBuf+4),buf,len); + DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + len = (len>>2)*8+4; + delay_ms(len); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)(EW_CommBuf+2),2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} +/* +@brief 读MTP +@param addr 通信地址 +@param mtpaddr MTP地址/4 +@param buf 读出数据的缓存 +@param len 数据长度 +*/ +uint8_t EW_ReadMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len) +{ + uint8_t uc_ack = 0; + uint8_t uc_readflag = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 62; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = mtpaddr; + if(len > 10) + { + len = 10; + } + EW_CommBuf[3] = len; + memcpy((void*)(EW_CommBuf+4),buf,len); + DMod_SendBytes((uint8_t*)EW_CommBuf,len+4,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 1; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)buf,len+1,EW_DMOD_READ_Timeout); + if(buf[len] != CheckCRC_8(buf,len)) + { + return 1; + } + return uc_ack; +} +/* +@brief 运行BootLoader程序 +@param addr 通信地址 +@param reboot 仅重启标准 1 有效 +@rtv 返回执行结果 0 成功 +*/ +uint8_t EW_RunBootLoader(uint16_t addr,uint8_t reboot) +{ + uint32_t ul_bootflag = 0x55AA6699; + addr<<=6; + addr = (addr & 0xFFC0) | 61; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + if(reboot == 1) + { + ul_bootflag = 0x9966AA55; + } + memcpy((void*)(EW_CommBuf+2),&ul_bootflag,4); + DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,0); + return 0; +} +/* +@brief 写运行配置,写入MTP中 +@param addr 通信地址 +@param runcfg 配置结构体 +@rtv 返回执行结果 +*/ +uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 20; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),&runcfg,3); + DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(4); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} + +/* +@brief 快速分配通信地址 +@param 通信地址 +@param UID +@param uid_len UID长度 +@param ack_data 应答数据 包括2bytes延时和2bytes状态 +@rtv 执行结果 +*/ + +uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 21; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),uid,uid_len); + DMod_SendBytes((uint8_t*)EW_CommBuf,uid_len+2,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} + + +/* +@brief 快速分配通信地址 +@param 通信地址 +@param 设置延时 +@param UID +@param UID长度 +@param 应答数据 包括2bytes延时和2bytes状态 +@rtv 执行结果 +*/ + +uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 22; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = pwd_flag; + memcpy((void*)(EW_CommBuf+3),&delay,2); + memcpy((void*)(EW_CommBuf+5),uid,uid_len); + uid_len +=5; + DMod_SendBytes(((uint8_t*)(EW_CommBuf)),uid_len,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2(ack_data,5,EW_DMOD_READ_Timeout); + if(ack_data[4] != CheckCRC_8(ack_data,4)) + { + return 1; + } + return uc_ack; +} + + +/* +@brief 设置延时 +@param addr 通信地址 +@param 延期时间 +@rtv 返回执行结果 +*/ +uint8_t EW_SetDelay(uint16_t addr,uint16_t delay) +{ + uint8_t uc_ack; + addr<<=6; + addr = (addr & 0xFFC0) | 23; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),&delay,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} + +/* +@brief 密码验证 +@param addr 通信地址 +@param 密码数据 +@param 密码长度 +@rtv 返回执行结果 +*/ +uint8_t EW_VerfyPWD(uint16_t addr,uint8_t* pwd,uint8_t pwd_len) +{ + + addr<<=6; + addr = (addr & 0xFFC0) | 24; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),pwd,pwd_len); + pwd_len += 2; + DMod_SendBytes((uint8_t*)EW_CommBuf,pwd_len,EW_DMOD_Peroid,0); + return 0; +} + +/* +@brief 密码验证 +@param addr 通信地址 +@param 延迟起爆时间*50ms +@rtv 返回执行结果 +*/ +uint8_t EW_Boom(uint16_t addr,uint8_t delay_count) +{ + + addr<<=6; + addr = (addr & 0xFFC0) | 25; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = delay_count; + DMod_SendBytes((uint8_t*)EW_CommBuf,3,EW_DMOD_Peroid,0); + return 0; +} + + +/* +@brief 分组充电 +@param addr 通信地址 +@param 充电挡位 0:直通 1 :16V 2:20V 3:2.5V +@param 分组挡位 addr = group*4 大于addr的可以充电 +@rtv 返回执行结果 +*/ +uint8_t EW_Charge(uint16_t addr,uint8_t chg_class,uint8_t group) +{ + + addr<<=6; + addr = (addr & 0xFFC0) | 26; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = chg_class; + EW_CommBuf[3] = group; + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); + return 0; +} + + +/* +@brief 放电 +@param addr 通信地址 +*/ +uint8_t EW_DisCharge(uint16_t addr) +{ + + addr<<=6; + addr = (addr & 0xFFC0) | 27; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,0); + return 0; +} + +/* +@brief 读状态信息 +@param addr 通信地址 +@param *state 返回状态码 +@param len 数据长度 +*/ +uint8_t EW_ReadState(uint16_t addr,uint8_t* state) +{ + uint8_t uc_ack = 0; + uint8_t uc_readflag = 0; + if(addr == 0) + { + return 1; + } + uc_readflag = 1; + addr<<=6; + addr = (addr & 0xFFC0) | 28; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 1; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,5,EW_DMOD_READ_Timeout); + if(EW_CommBuf[5] != CheckCRC_8((uint8_t*)EW_CommBuf,5)) + { + return 1; + }else{ + memcpy(state,((uint8_t*)EW_CommBuf),4); + } + return uc_ack; +} + +/* +@brief 校准地址 +@param addr 通信地址 +@param cycle 校准周期 us +@param plus_count 脉冲个数 +*/ +uint8_t EW_ClkAmend(uint16_t addr ,uint16_t cycle,uint16_t plus_count) +{ + addr<<=6; + addr = (addr & 0xFFC0) | 29; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,0); + delay_ms(5); + EW_SendTrimSquare(cycle,cycle>>1,plus_count); + return 0; +} + +/* +@brief 巡检 +@param addr 通信地址 +@param cycle 校准周期 us +@param plus_count 脉冲个数 +*/ +uint8_t EW_Inspect(uint16_t bgaddr ,uint16_t endaddr,uint16_t state,uint8_t* buf) +{ + + uint16_t addr = 0; + addr<<=6; + addr = (addr & 0xFFC0) | 30; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((uint8_t*)&EW_CommBuf[2],&bgaddr,2); + memcpy((uint8_t*)&EW_CommBuf[4],&endaddr,2); + memcpy((uint8_t*)&EW_CommBuf[6],&state,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,8,EW_DMOD_Peroid,1); + delay_ms(5); + DMod_ReadInspect_Data(endaddr-bgaddr,buf); + return 0; +} + +/* +@brief 配置验证 +@param addr 通信地址 +@param cfg_mask 源掩码信息 +@param 比较信息 (EW_Cfg & cfg_mask) == cfg_state +@param 反码状态 0 比较通过不反码 1 比较通过反码 +@param +*/ +uint8_t EW_CheckRunCfg(uint16_t addr,uint32_t cfg_mask ,uint32_t cfg_state,uint8_t* rtv) +{ + addr<<=6; + addr = (addr & 0xFFC0) | 31; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((uint8_t*)&EW_CommBuf[2],&cfg_mask,3); + memcpy((uint8_t*)&EW_CommBuf[5],&cfg_state,3); + EW_CommBuf[8] = *rtv; + DMod_SendBytes((uint8_t*)EW_CommBuf,9,EW_DMOD_Peroid,1); + delay_ms(5); + *rtv = DMod_ReadAck(50); + return 0; +} + +/* +@brief 配置验证 +@param addr 通信地址 +@param check_class 检测模式 0 基本自检 1 起爆开关检测 2 电容检测 4 读电容检测时间 +@param *buf 读出测试结果 +*/ +uint8_t EW_ChecSelf(uint16_t addr,uint8_t check_class,uint8_t* buf) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(check_class == 4) + { + uc_readflag = 1; + } + if(buf == NULL && check_class ==4) + { + return 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 32; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = check_class; + DMod_SendBytes((uint8_t*)EW_CommBuf,9,EW_DMOD_Peroid,uc_readflag); + if( uc_readflag == 0) + { + return 0; + } + delay_ms(5); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,5,EW_DMOD_READ_Timeout); + if(EW_CommBuf[4] == CheckCRC_8((uint8_t*)EW_CommBuf,4)) + { + memcpy(buf,(uint8_t*)EW_CommBuf,4); + }else{ + uc_ack = 1; + } + return uc_ack; +} + +/* +@brief 保持起爆配置信息和使能起爆 +*/ +uint8_t EW_SaveFireInfo(uint16_t addr) +{ + addr<<=6; + addr = (addr & 0xFFC0) | 33; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,0); + return 0; +} + +/* +@brief 读延时和状态值 +@param addr 通信地址 +@param delay 返回延时 +*/ +uint8_t EW_ReadDelay(uint16_t addr,uint16_t* delay) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 34; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,3,EW_DMOD_READ_Timeout); + if(EW_CommBuf[2] == CheckCRC_8((uint8_t*)EW_CommBuf,2)) + { + memcpy(delay,(uint8_t*)EW_CommBuf,2); + }else{ + uc_ack = 1; + } + + return uc_ack; +} + +/* +@brief 通信反码配置 +@param addr 通信地址 +@param speed 通信挡位 0:10K 1:7K 2:5K 3:4.5K 4: 4K 4+n:4-0.5*n +@param cur 电流挡位 0:1mA 1:2mA 2:4mA 3:8mA +*/ +uint8_t EW_SetReportCfg(uint8_t speed,uint8_t cur) +{ + uint16_t addr = 0; + addr<<=6; + addr = (addr & 0xFFC0) | 35; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + EW_CommBuf[2] = speed; + EW_CommBuf[3] = cur; + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,0); + return 0; +} + +/* +@brief 更新网络地址 +@param addr 通信地址 +@param new_addr 新地址 +*/ +uint8_t EW_UpdateCommAddr(uint8_t addr,uint16_t new_addr) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 36; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((void*)(EW_CommBuf+2),&new_addr,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,4,EW_DMOD_Peroid,uc_readflag); + if(uc_readflag == 0) + { + return 0; + } + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf+2,2,EW_DMOD_READ_Timeout); + if(EW_CommBuf[0] != EW_CommBuf[2] || EW_CommBuf[1] != EW_CommBuf[3]) + { + return 1; + } + return uc_ack; +} +/* +@brief 读校准值 +@param addr 通信地址 +@param clk_amend 校准信息 +*/ +uint8_t EW_ReadClkAmend(uint16_t addr,uint32_t* clk_amend) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 37; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,5,EW_DMOD_READ_Timeout); + if(EW_CommBuf[4] == CheckCRC_8((uint8_t*)EW_CommBuf,4)) + { + memcpy(clk_amend,(uint8_t*)EW_CommBuf,4); + }else{ + uc_ack = 1; + } + + return uc_ack; +} +/* +@brief 读校准值 +@param addr 通信地址 +@param clk_amend 校准信息 +*/ +uint8_t EW_ReadRunCfgVersion(uint16_t addr,uint8_t* run_cfg,uint16_t* version) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 38; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,6,EW_DMOD_READ_Timeout); + if(EW_CommBuf[5] == CheckCRC_8((uint8_t*)EW_CommBuf,5)) + { + memcpy(run_cfg,(uint8_t*)EW_CommBuf,3); + memcpy(version,(uint8_t*)EW_CommBuf+3,2); + }else{ + uc_ack = 1; + } + return uc_ack; +} + +/* +@brief 自动分配地址 +@param max_addr 分配的最大地址 +@param fac_addr 分配因子 +*/ +uint8_t EW_AutoSetAddr(uint16_t max_addr,uint16_t fac_addr) +{ + uint16_t addr = 0; + addr<<=6; + addr = (addr & 0xFFC0) | 39; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + memcpy((uint8_t*)EW_CommBuf+2,&max_addr,2); + memcpy((uint8_t*)EW_CommBuf+4,&max_addr,2); + DMod_SendBytes((uint8_t*)EW_CommBuf,6,EW_DMOD_Peroid,0); + return 0; +} +/* +@brief 读校准值 +@param addr 通信地址 +@param UID数据 +*/ +uint8_t EW_ReadUID(uint16_t addr,uint8_t* uid,uint8_t uid_len) +{ + uint8_t uc_readflag = 0; + uint8_t uc_ack = 0; + if(addr > 0) + { + uc_readflag = 1; + } + addr<<=6; + addr = (addr & 0xFFC0) | 41; + EW_CommBuf[0] = addr&0xFF; + EW_CommBuf[1] = (addr >> 8)&0xFF; + DMod_SendBytes((uint8_t*)EW_CommBuf,2,EW_DMOD_Peroid,uc_readflag); + delay_ms(2); + uc_ack = DMod_FireBusReadDatasV2((uint8_t*)EW_CommBuf,uid_len+1,EW_DMOD_READ_Timeout); + if(EW_CommBuf[uid_len] == CheckCRC_8((uint8_t*)EW_CommBuf,uid_len)) + { + memcpy(uid,(uint8_t*)EW_CommBuf,uid_len); + }else{ + uc_ack = 1; + } + return uc_ack; +} + + diff --git a/source/elec_det/driver/history/EWDriver.h b/source/elec_det/driver/history/EWDriver.h new file mode 100644 index 0000000..7cf1ff9 --- /dev/null +++ b/source/elec_det/driver/history/EWDriver.h @@ -0,0 +1,348 @@ +#ifndef EWDRIVER_H +#define EWDRIVER_H +#include "base/define.h" + +#define EW_DMODE_FRAME_SIZE 16 + +# +typedef enum { + SINGLE_MOD = (uint8_t)0, + DIFF_MOD = (uint8_t)1, + OFF_MOD = (uint8_t)2, +} EWBus_Mod_en; + + +typedef enum{ + BEGIN_FRAME = (uint8_t)0, + END_FRAME = (uint8_t)1, + DATA_FRAME = (uint8_t)2, + COMPLETE_FRAME = (uint8_t)3, +}EW_SINGLE_FRAME_TYPE_en; +#pragma pack(1) +//系统运行时配置 +typedef union { +struct{ +uint8_t fire_mos_sw : 2;//起爆mos开关选择 0 内部 1 外部 (默认0) +uint8_t vbus_rx_sg : 2;//接收数据信号 1 vbuss_rxh 2 vbuss_rxl 3 vbusd_rx (默认 3) +uint8_t vbus_mode : 2;//通讯类型判断 01 差分 10 单端。00 11 根据总线电压判断 (默认 01) +uint8_t reserve01 : 2;//保留 +uint8_t reset_run_step : 3;//打点周期 0 不打点 1 5ms 2 10ms 3 20ms 4 50ms 5 100ms 6 150ms 7 200ms(默认 0) +uint8_t uid_len : 3;//uid长度 uid_len + 7(默认 1) +uint8_t pwd_len : 2;//密码长度 pwd_len + 4(默认0) +uint8_t version : 5;//模块版本 +uint8_t reserve02 : 3;//保留 +uint8_t crc8 : 8;//校验位 +} runcfg_st; +uint32_t run_param; +uint8_t run_cfg_buf[4]; +}RunCfg_un; + +typedef union{ +//系统状态标志结构体 +volatile struct +{ + + uint8_t timeramend_flag : 1; //时钟校准标志 0 + uint8_t saveinfo_flag : 1; //保存延时设置信息 1 + uint8_t pswd_flag : 1; //密码验证完成标志 2 + uint8_t delay_time : 1; //延时设置完成标志 3 + + uint8_t addr_set : 1; //网络地址已设置 + uint8_t set_super_t : 1; //开启软件复位 5 + uint8_t erprom_error : 1; //系统存储错误 6 + uint8_t sys_error : 1; //系统运行异常 7 + + + uint8_t charge_8v : 1; //充电电压大于8V 8 + uint8_t charge_16V : 1; //充电电压大于16V标志 9 + uint8_t charge_20v : 1; //充电电压大于20V 10 + uint8_t fireline_flag : 1; //桥丝检测 11 + + + uint8_t charge_ctrl_flag : 1; //充放电开关检测 12 + uint8_t mosfet_flag : 1; //MOS开关检测标志 13 + uint8_t charge_cmd : 1; //已经发送充电命令 14 + uint8_t fire_flag : 1; //已点火 15 + + + uint8_t comm_frame : 1; //通讯帧结束标志 + uint8_t factory_check : 1; //工厂自检 + uint8_t comm_mode : 1; //通讯模式 + uint8_t vbusd_invert : 1; //VBUSD 的极性 + + + uint8_t comm_timeout : 1; //通信超时 + uint8_t reserve10 : 1; + uint8_t reserve09 : 1; + uint8_t reserve08 : 1; + + uint8_t reserve07 : 1; + uint8_t reserve06 : 1; + uint8_t reserve05 : 1; + uint8_t reserve04 : 1; + + uint8_t reserve03 : 1; + uint8_t reserve02 : 1; + uint8_t reserve01 : 1; + uint8_t reserve00 : 1; +} State_st; + + + volatile uint32_t data; + volatile uint16_t us_data[2]; + volatile uint8_t datas[4]; +}System_State_un; + +#pragma pack() + +#define EW_WA_CFG_WRITE 20 //写配置寄存器(掉电不保存) +#define EW_WA_SET_COMMADDR 21 //设置网络地址 +#define EW_WA_FAST_CFG 22 //快速配置地址,延时,密码验证 +#define EW_WA_SET_DELAY 23 //设置延时 +#define EW_RA_VERIFY_PWD 24 //密码验证 +#define EW_W_ON_FIRE 25 //起爆 +#define EW_W_CHARGE 26 //充电 +#define EW_W_DISCHARGE 27 //放电 +#define EW_RA_GET_STATE 28 //读状态 +#define EW_W_AMEND 29 //时钟校准 +#define EW_RA_INSPECT 30 //巡检 +#define EW_RA_CHECK_CFG 31 //配置区验证 +#define EW_R_ELECT_TEST 32 //电性能检测 +#define EW_W_SAVE_FIRE_SET 33 //保存起爆测试 +#define EW_RA_READ_DELAY 34 //读延时 +#define EW_R_TX_CFG 35 //反码配置 +#define EW_WR_UPDATE_ADDR 36 //更新网络地址 +#define EW_RA_AMEND_VALUE 37 //读校准值 +#define EW_RA_CFG_INFO 38 //读配置信息 +#define EW_W_AUTO_ADDR 39 //自动分配地址 +#define EW_EN_MTP 40 //使失能MTP +#define EW_RA_UID 41 //读UID + +#define EW_COMM_TEST 60 //通信测试没问题 +#define EW_BOOTLOADER_RUN 61 //运行bootloader +#define EW_RA_REGISTER 62 //读MTP +#define EW_WA_REGISTER 63 //写MTP +/* +@brief 发送校准脉冲 +@param cycle 周期 +@param duty 总线高电平时间 +@param count 脉冲个数 + +*/ +void EW_SendTrimSquare(uint16_t cycle,uint16_t duty, uint32_t count); +/* +@brief 单端第二版,差分接收数据 +@param *buf 数据缓存指针 +@param len 读取数据长度 +@param time_out 超时脉冲数(约1bit数据时间) +@rtv 0 成功 否则失败 +*/ + + +uint8_t DMod_FireBusReadDatasV2(uint8_t* buf, uint8_t len, uint32_t time_out); + +/* +@brief 差分模式数据发送 +@param buf 发送数据缓存 +@param len 发送长度 +@param pre 数据脉冲周期 + +*/ +void DMod_SendBytes(uint8_t* buf, uint8_t len, uint16_t pre,uint8_t rw_flag); +void DMod_SendBytesXor(uint8_t* buf, uint8_t len, uint8_t rw_flag); +uint8_t DMod_ReadBytesXor(uint8_t* buf, uint8_t len,uint16_t retry_times); + + +/* +@brief 差分模式读取为应答 +@param count 读取的数量 +@param 接收数据缓存 +*/ +void DMod_ReadInspect_Data(uint16_t count,uint8_t* buf); + +/* +@breif 通信测试 +*/ +uint8_t EW_CommTest(uint8_t* buf,uint16_t len,uint16_t cycle); +/* +@brief 使能MTP写 +@param addr 通信地址 +@param 使能开关 +@rtv 执行结果 +*/ +uint8_t EW_EnWriteMTP(uint16_t addr ,uint8_t en_flag); +/* +@brief 读MTP +@param addr 通信地址 +@param mtpaddr MTP地址/4 +@param buf 写入数据的缓存 +@param len 数据长度 +*/ +uint8_t EW_WriteMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len); +/* +@brief 读MTP +@param addr 通信地址 +@param mtpaddr MTP地址/4 +@param buf 读出数据的缓存 +@param len 数据长度 +*/ +uint8_t EW_ReadMTP(uint16_t addr,uint8_t mtpaddr,uint8_t* buf,uint8_t len); +/* +@brief 运行BootLoader程序 +@param addr 通信地址 +@param reboot 仅重启标准 1 有效 +@rtv 返回执行结果 0 成功 +*/ +uint8_t EW_RunBootLoader(uint16_t addr,uint8_t reboot); +/* +@brief 写运行配置,写入MTP中 +@param addr 通信地址 +@param runcfg 配置结构体 +@rtv 返回执行结果 +*/ +uint8_t EW_WriteRunCfg(uint16_t addr,RunCfg_un* runcfg); +/* +@brief 快速分配通信地址 +@param 通信地址 +@param UID +@param uid_len UID长度 +@param ack_data 应答数据 包括2bytes延时和2bytes状态 +@rtv 执行结果 +*/ + +uint8_t EW_SetAddrByUID(uint16_t addr,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data); +/* +@brief 快速分配通信地址 +@param 通信地址 +@param 设置延时 +@param UID +@param UID长度 +@param 应答数据 包括2bytes延时和2bytes状态 +@rtv 执行结果 +*/ + +uint8_t EW_FastSetByUID(uint16_t addr,uint16_t delay, uint8_t pwd_flag,uint8_t* uid,uint8_t uid_len,uint8_t* ack_data); +/* +@brief 设置延时 +@param addr 通信地址 +@param 延期时间 +@rtv 返回执行结果 +*/ +uint8_t EW_SetDelay(uint16_t addr,uint16_t delay); +/* +@brief 密码验证 +@param addr 通信地址 +@param 密码数据 +@param 密码长度 +@rtv 返回执行结果 +*/ +uint8_t EW_VerfyPWD(uint16_t addr,uint8_t* pwd,uint8_t pwd_len); +/* +@brief 密码验证 +@param addr 通信地址 +@param 延迟起爆时间*50ms +@rtv 返回执行结果 +*/ +uint8_t EW_Boom(uint16_t addr,uint8_t delay_count); +/* +@brief 分组充电 +@param addr 通信地址 +@param 充电挡位 0:直通 1 :16V 2:20V 3:2.5V +@param 分组挡位 addr = group*4 大于addr的可以充电 +@rtv 返回执行结果 +*/ +uint8_t EW_Charge(uint16_t addr,uint8_t chg_class,uint8_t group); +/* +@brief 放电 +@param addr 通信地址 +*/ +uint8_t EW_DisCharge(uint16_t addr); +/* +@brief 读状态信息 +@param addr 通信地址 +@param *delay 返回延时数据 +@param *state 返回状态码 +@param len 数据长度 +*/ +uint8_t EW_ReadState(uint16_t addr,uint8_t* state); +/* +@brief 校准地址 +@param addr 通信地址 +@param cycle 校准周期 us +@param plus_count 脉冲个数 +*/ +uint8_t EW_ClkAmend(uint16_t addr ,uint16_t cycle,uint16_t plus_count); +/* +@brief 巡检 +@param addr 通信地址 +@param cycle 校准周期 us +@param plus_count 脉冲个数 +*/ +uint8_t EW_Inspect(uint16_t bgaddr ,uint16_t endaddr,uint16_t state,uint8_t* buf); +/* +@brief 配置验证 +@param addr 通信地址 +@param cfg_mask 源掩码信息 +@param 比较信息 (EW_Cfg & cfg_mask) == cfg_state +@param 反码状态 0 比较通过不反码 1 比较通过反码 +@param +*/ +uint8_t EW_CheckRunCfg(uint16_t addr,uint32_t cfg_mask ,uint32_t cfg_state,uint8_t* rtv); +/* +@brief 配置验证 +@param addr 通信地址 +@param check_class 检测模式 0 基本自检 1 起爆开关检测 2 电容检测 4 读电容检测时间 +@param *buf 读出测试结果 +*/ +uint8_t EW_ChecSelf(uint16_t addr,uint8_t check_class,uint8_t* buf); +/* +@brief 保持起爆配置信息和使能起爆 +*/ +uint8_t EW_SaveFireInfo(uint16_t addr); +/* +@brief 读延时和状态值 +@param addr 通信地址 +@param delay 返回延时 +*/ +uint8_t EW_ReadDelay(uint16_t addr,uint16_t* delay); +/* +@brief 通信反码配置 +@param addr 通信地址 +@param speed 通信挡位 0:10K 1:7K 2:5K 3:4.5K 4: 4K 4+n:4-0.5*n +@param cur 电流挡位 0:1mA 1:2mA 2:4mA 3:8mA +*/ +uint8_t EW_SetReportCfg(uint8_t speed,uint8_t cur); +/* +@brief 更新网络地址 +@param addr 通信地址 +@param new_addr 新地址 +*/ +uint8_t EW_UpdateCommAddr(uint8_t addr,uint16_t new_addr); +/* +@brief 读校准值 +@param addr 通信地址 +@param clk_amend 校准信息 +*/ +uint8_t EW_ReadClkAmend(uint16_t addr,uint32_t* clk_amend); +/* +@brief 读校准值 +@param addr 通信地址 +@param clk_amend 校准信息 +*/ +uint8_t EW_ReadRunCfgVersion(uint16_t addr,uint8_t* run_cfg,uint16_t* version); +/* +@brief 自动分配地址 +@param max_addr 分配的最大地址 +@param fac_addr 分配因子 +*/ +uint8_t EW_AutoSetAddr(uint16_t max_addr,uint16_t fac_addr); +/* +@brief 读校准值 +@param addr 通信地址 +@param UID数据 +*/ +uint8_t EW_ReadUID(uint16_t addr,uint8_t* uid,uint8_t uid_len); + +#endif + + diff --git a/source/elec_det/elec_det.c b/source/elec_det/elec_det.c index daee64f..b458811 100644 --- a/source/elec_det/elec_det.c +++ b/source/elec_det/elec_det.c @@ -441,7 +441,9 @@ array_def *elec_check_with_scheme(array_def *uid_psw) } elec_judge_def *e=malloc(sizeof(elec_judge_def)); - elec_judge(e,checker_runcfg.rtv_index,checker_runcfg.Task_Result,(uint8_t *)checker_runcfg.Test_Rtv); + elec_judge(e,checker_runcfg.rtv_index,checker_runcfg.Task_Result, + checker_runcfg.Task_Excute, + (uint8_t *)checker_runcfg.Test_Rtv,0,0); free(e); arr_append(r,0); arr_appends(r,checker_runcfg.Task_Result,8); diff --git a/source/elec_det/elec_judge.c b/source/elec_det/elec_judge.c index 39e3420..403df2f 100644 --- a/source/elec_det/elec_judge.c +++ b/source/elec_det/elec_judge.c @@ -37,12 +37,14 @@ else{\ e->judge_flag[index/8]|=(1<<(index%8));}}\ // 任务执行结果校验 -#define EXE_FLAG_CHECK(index)\ - (e->exe_flag[index/8]&(1<<(index%8)))?1:0 +#define EXE_ACK_CHECK(index)\ + (e->exe_ack[index/8]&(1<<(index%8)))?1:0 // 取任务结果的第index位 #define GET_RET_DATA(i)\ (data[i*2]|(data[i*2+1]<<8)) - +// 获取第i位是否置位 +#define BIT_CHECK(d,i)\ + ((d)[i/8]&(1<<(i%8)))?1:0 // 添加错误代码 @@ -88,7 +90,7 @@ static void elec_task_judge(elec_judge_def *e,int index,uint8_t *data) TASK_FLAG_CHECK(index); const scheme_task_def *task=&e->scheme->task[index]; uint16_t temp; - if(EXE_FLAG_CHECK(index)){ + if(EXE_ACK_CHECK(index)){ elec_add_errcode(e,task->err); } for(int i=0;iitem_num;i++){ @@ -101,35 +103,6 @@ static void elec_task_judge(elec_judge_def *e,int index,uint8_t *data) -// 电源准备 -static void elec_power_on(elec_judge_def *e,int index,uint8_t *data) -{ - INDEX_CHECK(index); - TASK_FLAG_CHECK(index); - const scheme_task_def *task=&e->scheme->task[index]; - uint16_t temp; - if(EXE_FLAG_CHECK(index)){ - elec_add_errcode(e,1); - } -} - - -// 上电充能 -static void elec_charge(elec_judge_def *e,int index,uint8_t *data) -{ - INDEX_CHECK(index); - TASK_FLAG_CHECK(index); - const scheme_task_def *task=&e->scheme->task[index]; - uint16_t temp; - temp=GET_RET_DATA(0); - if(temprange[0].min||temp>task->range[0].max){ - elec_add_errcode(e,1); - } - temp=GET_RET_DATA(1); - if(temprange[1].min||temp>task->range[1].max){ - elec_add_errcode(e,task->range[1].err); - } -} @@ -176,8 +149,8 @@ static void elec_current(elec_judge_def *e,int index,uint8_t *data) const static elec_judge_fun g_jq_judge_table[]={ -elec_power_on, //0 电源准备 -elec_charge, //1 上电充能 +elec_task_judge, //0 电源准备 +elec_task_judge, //1 上电充能 elec_task_judge, //2 设置总线电压 elec_current, //3 获取总线电流 elec_task_judge, //4 扫描UID @@ -218,8 +191,8 @@ elec_task_judge, //36 验证缓存数据 const static elec_judge_fun g_xt_judge_table[]={ -elec_power_on, //0 电源准备 -elec_charge, //1 上电充能 +elec_task_judge, //0 电源准备 +elec_task_judge, //1 上电充能 elec_task_judge, //2 设置总线电压 elec_current, //3 获取总线电流 elec_task_judge, //4 扫描UID @@ -263,8 +236,8 @@ elec_task_judge, //38 验证管壳码 const static elec_judge_fun g_ew_judge_table[]={ -elec_power_on, //0 电源准备 -elec_charge, //1 上电充能 +elec_task_judge, //0 电源准备 +elec_task_judge, //1 上电充能 elec_task_judge, //2 设置总线电压 elec_current, //3 获取总线电流 elec_task_judge, //4 扫描UID @@ -353,28 +326,29 @@ int elec_err_classify(int err) return err; } -// 根据优先级报错 +// 找到异常代码序号 int elec_report_err(elec_judge_def *e) { - static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,0}; - uint8_t err=0; + static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,20,0}; + uint8_t index=0; for (int i=0;ierr_list[j]==pro_table[i]) - return pro_table[i]; - if((err==0)&&(e->err_list[j]!=0)){ - err=e->err_list[j]; + if(e->marerr_list[j]==pro_table[i]) + return j; + if((index==0)&&(e->marerr_list[j]!=0)){ + index=j; } } } - return err; + return index; } // 异常判断 // task_num,要判断的任务数 -void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_flag,uint8_t *data) +void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_ack, + uint8_t *exe_flag,uint8_t *data,uint8_t *marerr,uint8_t *suberr) { const scheme_task_def *task; memset(e,0,sizeof(elec_judge_def)); @@ -383,31 +357,38 @@ void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_flag,uint8_t *data) e->judge_fun_num=elec_calc_judge_fun_num(e->judge_fun_table); e->short_circuited=1500; e->open_circuited=80; - e->exe_flag=exe_flag; + e->exe_ack=exe_ack; if(task_num>e->scheme->task_num) task_num=e->scheme->task_num; for(int i=0;ischeme->task[i]; - if(task->taskidjudge_fun_num){ - e->judge_fun_table[i](e,i,data); - }else{ - elec_add_errcode(e,6); + // 只判定已执行的任务 + if(BIT_CHECK(exe_flag,i)){ + task=&e->scheme->task[i]; + if(task->taskidjudge_fun_num){ + e->judge_fun_table[task->taskid](e,i,data); + }else{ + elec_add_errcode(e,6); + } } data+=task->item_num*2; } - DBG_LOG("err_table:%02x %02x %02x %02x %02x %02x %02x %02x", + DBG_LOG("err_table:%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", e->err_list[0],e->err_list[1],e->err_list[2],e->err_list[3],e->err_list[4], e->err_list[5],e->err_list[6],e->err_list[7],e->err_list[8],e->err_list[9] ); for(int i=0;ierr_list[i]=elec_err_classify(e->err_list[i]); + e->marerr_list[i]=elec_err_classify(e->err_list[i]); } - DBG_LOG("err_table2:%02x %02x %02x %02x %02x %02x %02x %02x", + DBG_LOG("err_table2:%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", e->err_list[0],e->err_list[1],e->err_list[2],e->err_list[3],e->err_list[4], e->err_list[5],e->err_list[6],e->err_list[7],e->err_list[8],e->err_list[9] ); - DBG_LOG("err report=%d",elec_report_err(e)); + int index=elec_report_err(e); + DBG_LOG("marerr report=%d",e->marerr_list[index]); + DBG_LOG("suberr report=%d",e->err_list[index]); + if(marerr) *marerr=e->marerr_list[index]; + if(suberr) *suberr=e->err_list[index]; } diff --git a/source/elec_det/elec_judge.h b/source/elec_det/elec_judge.h index e3b0d8c..a7ed89d 100644 --- a/source/elec_det/elec_judge.h +++ b/source/elec_det/elec_judge.h @@ -17,8 +17,9 @@ typedef struct _elec_judge_def{ const scheme_def *scheme; uint8_t judge_fun_num; uint8_t judge_flag[8]; - uint8_t *exe_flag; + uint8_t *exe_ack; uint8_t err_list[ERR_LIST_LEN]; + uint8_t marerr_list[ERR_LIST_LEN]; uint16_t short_circuited; uint16_t open_circuited; const elec_judge_fun *judge_fun_table; @@ -27,7 +28,8 @@ typedef struct _elec_judge_def{ -void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_flag,uint8_t *data); +void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_ack, + uint8_t *exe_flag,uint8_t *data,uint8_t *marerr,uint8_t *suberr); diff --git a/source/elec_det/hardware/adc_cfg.c b/source/elec_det/hardware/adc_cfg.c index 5d3a4cb..ecfa992 100644 --- a/source/elec_det/hardware/adc_cfg.c +++ b/source/elec_det/hardware/adc_cfg.c @@ -633,3 +633,54 @@ uint16_t AD_SampleCap(uint16_t delay) Gpio_CAPSwitch(0); return ul_ad; } + +/* +@brief 获取总线电流上升时间 +@param0 采样判线AD值 +@param1 采样超时 单位0.01ms +@rtv 等待时间 +*/ +uint16_t AD_GetBusCurUp(uint16_t ad_line ,uint16_t time_out) +{ + uint16_t aus_adc_v[5]; + uint16_t us_count = 0; + uint16_t us_index = 0; + uint8_t uc_start = 0; + Get10usCount(); + ADC_ClearFlag(ADC_CURR_DE,ADC_FLAG_EOC);//清除转换结束标志 + ADC_SoftwareStartConvCmd(ADC_CURR_DE, ENABLE); //启动转换 + while(GetCountTimerCnt() < time_out) + { + time_out = 2000; + while((time_out > 0) && ( ADC_GetFlagStatus(ADC_CURR_DE,ADC_FLAG_EOC) == RESET)) + { + time_out--; + } + aus_adc_v[us_count] = ADC_GetConversionValue(ADC_CURR_DE) & 0x0FFF; + ADC_ClearFlag(ADC_CURR_DE,ADC_FLAG_EOC);//清除转换结束标志 + ADC_SoftwareStartConvCmd(ADC_CURR_DE, ENABLE); //启动转换 + if(us_count == 4) + { + uc_start = 1; + } + us_count++; + us_count %= 5; + if(uc_start == 0) + { + continue; + } + for(us_index = 0; us_index < 5; us_index++) + { + if(ad_line < aus_adc_v[us_index]) + { + break; + } + } + if(us_index == 5) + { + return GetCountTimerCnt(); + } + + } + return 0; +} diff --git a/source/elec_det/hardware/adc_cfg.h b/source/elec_det/hardware/adc_cfg.h index 6561504..98ef43a 100644 --- a/source/elec_det/hardware/adc_cfg.h +++ b/source/elec_det/hardware/adc_cfg.h @@ -57,7 +57,7 @@ uint32_t GetADC2_Fast(void); uint32_t GetADC1_Fast(void); uint32_t GetADC2_Value(uint32_t channel); -#define ADC_GetCurADC(chnnel) GetADC2_Value(channel) +#define ADC_GetCurADC(channel) GetADC2_Value(channel) void GetADC1_Value(uint32_t channel,uint16_t* buf,uint16_t len); float Get_Temperature(void); @@ -94,4 +94,11 @@ uint16_t GetADC_Fast(ADC_TypeDef* adc_periph); void AD_SampleResistor(uint16_t* channels_re); /*测量电容电压*/ uint16_t AD_SampleCap(uint16_t delay); +/* +@brief 获取总线电流上升时间 +@param0 采样判线AD值 +@param1 采样超时 单位0.01ms +@rtv 等待时间 +*/ +uint16_t AD_GetBusCurUp(uint16_t ad_line ,uint16_t time_out); #endif diff --git a/source/elec_det/hardware/gpio_cfg.h b/source/elec_det/hardware/gpio_cfg.h index 9e16831..6b72734 100644 --- a/source/elec_det/hardware/gpio_cfg.h +++ b/source/elec_det/hardware/gpio_cfg.h @@ -279,6 +279,7 @@ #define EW_DIFF_MOD_H HMOS_SWITCH_W_1 #define EW_DIFF_MOD_L HMOS_SWITCH_W_0 #define EW_BUS_OFF HMOS_SWITCH_OFF +#define EW_BUS_ON HMOS_SWITCH_ON void CtrlGpio_DefInit(void); diff --git a/source/elec_det/hardware/power.h b/source/elec_det/hardware/power.h index 23a3948..e549640 100644 --- a/source/elec_det/hardware/power.h +++ b/source/elec_det/hardware/power.h @@ -73,9 +73,11 @@ CurrentSample_Range_eu Power_SetSampleRange_Seep(CurrentSample_Range_eu range , #define JQChecker_ChgEnger_Sample_R R100_0p2mA_3mA_MC #define XTChecker_ChgEnger_Sample_R R10_2mA_30mA_MC +#define EWChecker_ChgEnger_Sample_R R100_0p2mA_3mA_MC //模块通信采样电阻 #define XTDriver_Sample_R R10_2mA_30mA_MC #define JQDriver_Sample_R R10_2mA_30mA_MC +#define EWDriver_Sample_R R10_2mA_30mA_MC //电压调节的关系为线性函数 diff --git a/source/elec_det/interface/BaseChecker.h b/source/elec_det/interface/BaseChecker.h index a7871ba..5bad6b5 100644 --- a/source/elec_det/interface/BaseChecker.h +++ b/source/elec_det/interface/BaseChecker.h @@ -37,11 +37,11 @@ uint8_t Task_Excute[8];//保存执行序列号 uint16_t netid;//电子模块最新的网络ID uint8_t user_otp[4];//用户区OTP数据 uint8_t writeuid[13];//注码uid -uint8_t writepwd[8];//注码密码 -uint8_t uid_len;//密码长度 XT 7 JQ 8 -uint8_t pwd_len;//密码长度 XT 4 JQ 4 -uint8_t uid_pwd_bind_flag; -uint8_t code_bind_check_flag;//三码绑定检测一起执行 +uint8_t writepwd[8];//注码密码 +uint8_t uid_len;//密码长度 XT 7 JQ 8 +uint8_t pwd_len;//密码长度 XT 4 JQ 4 +uint8_t uid_pwd_bind_flag; +uint8_t code_bind_check_flag;//三码绑定检测一起执行 }Checker_RunCfg_st ; #pragma pack() diff --git a/source/elec_det/interface/EWChecker.c b/source/elec_det/interface/EWChecker.c index 8ffc850..7f1f371 100644 --- a/source/elec_det/interface/EWChecker.c +++ b/source/elec_det/interface/EWChecker.c @@ -22,6 +22,13 @@ #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) { @@ -29,7 +36,7 @@ static uint8_t EW_bootErease(void) uint8_t read[4]={0}; uint8_t ret=0; DMod_SendBytesXor(data,2,1); - delay_ms(10); + 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; @@ -305,6 +312,780 @@ void EW_Updata(void) +/* +@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; @@ -332,81 +1113,39 @@ void EW_Empty(void) -void EW_Test_SetBusV(void) -{ - Checker_RunCfg_st *cfg=&checker_runcfg; - uint8_t uc_rtv = 0; - uint16_t us_h_v,us_m_v; - uint16_t power_old; - us_h_v = cfg->params[0]; - power_old=us_h_v; - if(us_h_v < 55) - { - uc_rtv = 1; - - }else{ - us_m_v = 55; - uc_rtv |= PowerCalibration_set(us_h_v,us_m_v); - XTBUS_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); - } - if(uc_rtv){ - DBG_WARN("bus power init failed.h"); - } - if((us_h_vpower_old+10)){ - DBG_WARN("power set fialed,want=%d,reality=%d.",power_old,us_h_v); - } - Checker_MaskResult(uc_rtv,cfg->task_info.runindex); - -} CheckerTask ewtaskArray[CHECKER_MAXID_COUNT] ={ -Checker_PowerPrapare, //0 电源准备 -EW_Empty, //1 上电充能 -EW_Test_SetBusV, //2 设置总线电压 -EW_Empty, //3 获取总线电流 -EW_Empty, //4 扫描UID -EW_Empty, //5 写配置参数 -EW_Empty, //6 验证配置 -EW_Empty, //7 模拟注码 -EW_Empty, //8 充能统计 -EW_Empty, //9 写现场值 网络id 延时 -EW_Empty, //10比对现场值 -EW_Empty, //11 桥丝通断检测 -EW_Empty, //12 电容容量统计 -EW_Empty, //13 延时等待 -EW_Empty, //14 写管壳号/工厂信息 -EW_Empty, //15 写UID -EW_Empty, //16 写密码 -EW_Empty, //17 写入/检测备份区标志 -EW_Empty, //18 读取备份区数据 -EW_Empty, //19 校准 -EW_Empty, //20 使能通讯末电流采集 -EW_Empty, //21 获取通讯末电流 -EW_Empty, //22 放电 -EW_Empty, //23 在线检测 -EW_Empty, //24 状态检测 -EW_Empty, //25 起爆 -EW_Empty, //26 复位 -EW_Test_PowerOFF, //27 关总线 -EW_Empty, //28 芯片锁存 -EW_Empty, //29 使能赋码设备 -EW_Empty, //30 在线检测 -EW_Empty, //31 密码验证 -EW_Empty, //32 加载芯片配置 -EW_Empty, //33 电容压差测试 -Checker_ResistorSample,//34 桥丝电阻测试 -EW_Empty, //35 检测过程中注码 -EW_Empty, //36 验证注码 -EW_Empty, //37 模块在线检测 -EW_Updata, //38 升级 -(void*)0 //数组结束 +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 //数组结束 }; diff --git a/source/elec_det/test/EWCheckerTest.c b/source/elec_det/test/EWCheckerTest.c index e86a242..a5face3 100644 --- a/source/elec_det/test/EWCheckerTest.c +++ b/source/elec_det/test/EWCheckerTest.c @@ -231,13 +231,13 @@ static void EWDriverTest(int argc, char**argv) }else if(!rt_strcmp(argv[1], "SetAddr")){ puc_buf = (uint8_t*)us_array; memcpy(argv[3],puc_buf,strlen(argv[3])); - us_temp = EW_SetAddrByUID(checker_runcfg.params[0],puc_buf,strlen(argv[3])-1,(uint8_t*)checker_runcfg.Test_Rtv); + us_temp = EW_SetAddrByUID(checker_runcfg.params[0],puc_buf,strlen(argv[3])-1); printf("SetAddr Excute %d delay %d state %04X\n",us_temp,checker_runcfg.Test_Rtv[0],checker_runcfg.Test_Rtv[1]); }else if(!rt_strcmp(argv[1], "FastSet")){ puc_buf = (uint8_t*)us_array; memcpy(argv[5],puc_buf,strlen(argv[5])); - us_temp = EW_FastSetByUID(checker_runcfg.params[0],checker_runcfg.params[1],checker_runcfg.params[2],puc_buf,strlen(argv[5])-1,(uint8_t*)checker_runcfg.Test_Rtv); - printf("FastSet Excute %d delay %d state %04X\n",us_temp,checker_runcfg.Test_Rtv[0],checker_runcfg.Test_Rtv[1]); + us_temp = EW_FastSetByUID(checker_runcfg.params[0],checker_runcfg.params[1],puc_buf,strlen(argv[5])-1,(uint8_t*)checker_runcfg.Test_Rtv); + printf("FastSet Excute %d delay %d\n",us_temp,checker_runcfg.Test_Rtv[0]); }else if(!rt_strcmp(argv[1], "SetDelay")){ us_temp = EW_SetDelay(checker_runcfg.params[0],checker_runcfg.params[1]); printf("SetDelay Excute %d \n",us_temp); @@ -377,3 +377,112 @@ static void EWDriverTest(int argc, char**argv) } } MSH_CMD_EXPORT_ALIAS(EWDriverTest ,EW, EWPro Driver ); + + +static void EWBDriverTest(int argc, char**argv) +{ + uint16_t us_array[20]; + uint8_t* puc_buf; + uint16_t us_temp; + uint32_t ul_temp; + rt_memset(&checker_runcfg.params,0,sizeof(checker_runcfg.params)); + rt_memset(&checker_runcfg.Task_Result,0,sizeof(checker_runcfg.Task_Result)); + checker_runcfg.excue_rtv = 0; + checker_runcfg.param_count = 0; + checker_runcfg.rtv_count = 0; + checker_runcfg.rtv_index = 0; + checker_runcfg.task_info.runindex = 0; + if(argc > 2) + { + checker_runcfg.param_count = argc-2; + us_temp = 0; + while(us_temp < checker_runcfg.param_count) + { + checker_runcfg.params[us_temp] = atoi(argv[us_temp+2]); + us_temp++; + } + } + if (argc < 2) + { + goto EW_help_label_; + }else if(!rt_strcmp(argv[1], "BUS_H")){ + EW_DIFF_MOD_H + }else if(!rt_strcmp(argv[1], "BUS_L")){ + + EW_DIFF_MOD_L + + }else if(!rt_strcmp(argv[1], "BUS_M")){ + EW_DIFF_MOD_M + + }else if(!rt_strcmp(argv[1], "BUS_OFF")){ + HMOS_SWITCH_OFF + + }else if(!rt_strcmp(argv[1], "BUS_ON")){ + HMOS_SWITCH_ON + + } + else if(!rt_strcmp(argv[1], "BUS_CUR")){ + printf("BUS_CUR %d \r\n",Power_GetCurrent()); + } + else if(!rt_strcmp(argv[1], "SetV")){ + us_temp = PowerCalibration_set(checker_runcfg.params[0],checker_runcfg.params[1]); + printf("SetV Excute %d\n",us_temp); + } + else if(!rt_strcmp(argv[1], "ChgCtrl")){ + us_temp = EWB_ChgCtrl(checker_runcfg.params[0]); + printf("ChgCtrl Excute %d \n",us_temp); + }else if(!rt_strcmp(argv[1], "EraseMTP")){ + us_temp = EWB_EraseMTP(checker_runcfg.params[0],checker_runcfg.params[1]); + printf("EraseMTP Excute %d\n",us_temp); + }else if(!rt_strcmp(argv[1], "EraseCode")){ + us_temp = EWB_EraseCode(); + printf("EraseCode Excute %d\n",us_temp); + }else if(!rt_strcmp(argv[1], "ReadMTP")){ + puc_buf = (uint8_t*)us_array; + memset(us_array,0,checker_runcfg.params[1]+1); + us_temp = EWB_ReadMTP(checker_runcfg.params[0],checker_runcfg.params[1],puc_buf); + printf("ReadMTP Excute %d \n",us_temp); + for(us_temp = 0; us_temp < checker_runcfg.params[1]; us_temp++) + { + printf("%02X ",puc_buf[us_temp]); + if((us_temp + 1) %8 == 0) + { + printf("\n"); + } + } + if((us_temp + 1) %8 != 0) + { + printf("\n"); + } + }else if(!rt_strcmp(argv[1], "CacluCrc32")){ + us_temp = EWB_CacluCrc32(checker_runcfg.params[0],checker_runcfg.params[1],&ul_temp); + printf("CacluCrc32 Excute %d %08X\n",us_temp,ul_temp); + }else if(!rt_strcmp(argv[1], "RunApp")){ + us_temp = EWB_RunApp(); + printf("RunApp Excute %d\n",us_temp); + }else if(!rt_strcmp(argv[1], "WriteMTP")){ + HexStrings2Byte(argv+4,argc-4,(uint8_t*)us_array,sizeof(us_array)); + us_temp = EWB_WriteMTP(checker_runcfg.params[0],(const uint8_t*)us_array,checker_runcfg.params[1]); + printf("WriteMTP Excute %d\n",us_temp); + } + else{ + EW_help_label_: + rt_kprintf("BUS_H Out High Voltage"); + rt_kprintf("BUS_M Out Midle Voltage\n"); + rt_kprintf("BUS_L Out High Voltage other side\n"); + rt_kprintf("BUS_OFF Close Bus\n"); + rt_kprintf("BUS_ON Open Bus\n"); + rt_kprintf("BUS_CUR Get Bus Current\n"); + rt_kprintf("SetV [Hight_V] [Midle_V]\n"); + rt_kprintf("ChgCtrl [Chg_SW] \n"); + rt_kprintf("EraseMTP [bgaddr][endaddr]\n"); + rt_kprintf("EraseCode \n"); + rt_kprintf("ReadMTP [bgaddr][read_len] \n"); + rt_kprintf("CacluCrc32 [bgaddr][endaddr] \n"); + rt_kprintf("RunApp \n"); + rt_kprintf("WriteMTP [MTP Addr][w_len] [hex data]\n"); + + } +} +MSH_CMD_EXPORT_ALIAS(EWBDriverTest ,EWB, EW BootLoader Driver ); + diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index 4ce92d4..0c56131 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-10-30 18:23:29" +#define BUILD_DATE "2023-10-31 16:54:55" #define SOFT_VERSION "2.03"