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"