Files
checker_slave/source/elec_det/interface/XTChecker.c

1429 lines
34 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "base/delay.h"
#include "hardware/adc_cfg.h"
#include "base/utility.h"
#include "hardware/power.h"
#include "driver/XTDriver.h"
#include "XTChecker.h"
#include "hardware/timer_cfg.h"
#define XT_CHECKER_RUN_BUF 56
uint8_t XT_Test_UID[13]="123456789ACDE";
uint8_t XT_Test_PWD[8]="FBCDabcd";
uint8_t XT_RunBuf[XT_CHECKER_RUN_BUF];
/*
@brief 注码检测
@rtv 0 已经注码1 不能注码 2 需要注码
*/
static uint8_t XT_Test_CheckeThreeCode(void);
/*
@brief 三码绑定验证
*/
static uint8_t XT_Test_UID_PWD_Verify_(void);
/*
@brief 统计模块的上电充能,具有电压设置功能,采集档位 R10_0p1mA_1p6mA_UC
@param0 总线电压
@param1 超时时间 0.1ms
@param2 充电结束时的AD值
@rtv1 返回总线电流低于设置AD值的时间
*/
void XT_Test_PowerOn(void)
{
uint8_t uc_rtv = 0;
uint16_t us_rsult[2];
uint16_t us_max;
uint16_t us_shake;
XTBUS_OFF;
uc_rtv = PowerCalibration_set(checker_runcfg.params[0],checker_runcfg.params[0]-1);
Power_SetSampleRange_Seep(Checker_PowerOn_Sample_R,ADC_SPEED_HIGH);
//POWER_ON
delay_os_ms(100);
XTBUS_ON;
delay_us(20);
us_rsult[1] = AD_GetChgEnergy(checker_runcfg.params[1],checker_runcfg.params[2], &us_max,&us_shake);
delay_os_ms(100);
us_rsult[0] = Power_GetBousV();
Checker_SetRtv(us_rsult,checker_runcfg.rtv_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
XT_Init(0x78);
}
/*
@brief 设置总线电压
@param1 总线电压
@rtv1 总线电压
*/
void XT_Test_SetBusV(void)
{
uint8_t uc_rtv = 0;
uint16_t us_h_v,us_m_v;
us_h_v = checker_runcfg.params[0];
if(us_h_v < 55)
{
uc_rtv = 1;
}else{
us_m_v = 50;
uc_rtv |= PowerCalibration_set(us_h_v,us_m_v);
XTBUS_ON
// if(checker_runcfg.params[1] == 0)
// {
// XTBUS_ON;
// }else{
// HMOS_SWITCH_RW_1;
// }
us_m_v = ((us_h_v/80)+2)*60;
delay_ms(us_m_v);
us_h_v = Power_GetBousV();
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 测量总线基本电压
@rtv1 返回总线电流 单位0.01uA
*/
void XT_Test_BaseCur(void)
{
uint16_t ul_cur[2];
XTBUS_W_1
delay_ms(200);
ul_cur[0] = ADC_GetBaseStableCur();
XTBUS_W_0
delay_ms(100);
ul_cur[1] = ADC_GetBaseStableCur();
XTBUS_W_1
delay_ms(50);
// if(ul_cur[0] < 100 || ul_cur[1] < 100)
// {
// __disable_irq();
// while(1){};
// }
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(ul_cur,checker_runcfg.rtv_count);
}
/*
@brief 扫描总线上的电子模块 1发
@param0 UID长度
@param1 使能或失能 UID对比
*/
void XT_Test_ScanUID(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
uint16_t us_temp[12];
XT_Clear_Read();
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[0] == 0)
{
checker_runcfg.params[0] = checker_runcfg.uid_len;
if(checker_runcfg.params[0] == 0)
{
checker_runcfg.params[0] = 7;
}
}
uc_rtv = XT_Read_Uid(XT_RunBuf,checker_runcfg.params[0]);
if(checker_runcfg.params[1] > 0)
{
for(uc_count = 0; uc_count < checker_runcfg.params[0];uc_count++)
{
if(checker_runcfg.writeuid[uc_count] != XT_RunBuf[uc_count])
{
uc_rtv |= 0x01;
}
}
}
uc_count = 0;
if(uc_rtv == 0)
{
checker_runcfg.uid_len = checker_runcfg.params[0];
memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len);
uc_count = (checker_runcfg.params[0]+8+1)/2;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
memcpy(us_temp,XT_RunBuf,24);
Checker_SetRtv(us_temp,checker_runcfg.rtv_count);
}
/*
@brief 写芯片配置
@param0 UID长度
@param1 密码长度
@param2 反馈电流挡位
@param4 版本标识
*/
void XT_Test_WriteChipCfg(void)
{
uint8_t uc_rtv = 0;
XT_RunBuf[0] = (((checker_runcfg.params[0] & 0x0F)-7) << 4) & 0xF0;
XT_RunBuf[0] += ((checker_runcfg.params[1] - 4) & 0x0F) ;
XT_RunBuf[1] = 0x8C;//((checker_runcfg.params[2] & 0x0F) << 2) & 0xF0;
XT_RunBuf[2] = checker_runcfg.params[3];
uc_rtv = XT_Write_Config(XT_RunBuf);
checker_runcfg.uid_len = (uint8_t)checker_runcfg.params[0];
checker_runcfg.pwd_len = (uint8_t)checker_runcfg.params[1];
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 芯片配置并比对
@param0 UID长度
@param1 密码长度
@param2 反馈电流挡位
@param4 版本标识
*/
void XT_Test_CheckChipCfg(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
memset(XT_RunBuf,0,10);
XT_RunBuf[0] = (((checker_runcfg.params[0] & 0x0F)-7) << 4) & 0xF0;
XT_RunBuf[0] += ((checker_runcfg.params[1] - 4) & 0x0F) ;
XT_RunBuf[1] = 0x8C;//((checker_runcfg.params[2] & 0x0F) << 2) & 0xF0;
XT_RunBuf[2] = checker_runcfg.params[3];
uc_rtv = XT_Read_Config(XT_RunBuf+5);
for(uc_count = 0; uc_count < 3; uc_count++)
{
if(XT_RunBuf[uc_count] != XT_RunBuf[6+uc_count])
{
uc_rtv |= 0x01;
}
}
XT_RunBuf[1] = XT_RunBuf[2];//验证密码/UID 和版本号
if(XT_Check_Config(XT_RunBuf) == 0)
{
checker_runcfg.uid_len = (uint8_t)checker_runcfg.params[0];
checker_runcfg.pwd_len = (uint8_t)checker_runcfg.params[1];
}else{
uc_rtv |= 0x01;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 模拟注码,优先写入配置项
*/
void XT_Test_BindTestCode(void)
{
uint8_t uc_rtv = 0;
if(checker_runcfg.uid_len == 0)
{
checker_runcfg.uid_len = 7;
}
memcpy(XT_RunBuf,XT_Test_UID,checker_runcfg.uid_len);
uc_rtv = XT_Write_Uid(XT_RunBuf, checker_runcfg.uid_len);
if(uc_rtv == 0)
{
memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len);
}
if(checker_runcfg.pwd_len == 0)
{
checker_runcfg.pwd_len = 7;
}
memcpy(XT_RunBuf,XT_Test_PWD,checker_runcfg.pwd_len);
uc_rtv |= XT_Write_Bmid(XT_RunBuf, checker_runcfg.pwd_len);
if(uc_rtv == 0)
{
memcpy(checker_runcfg.writepwd,XT_RunBuf,checker_runcfg.pwd_len);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 充能统计
@param0 充电挡位
@param1 充电电流判线值,AD值
@param2 充电末电流结束值单位0.1uA
@param3 充电最长时间,单位100ms
@param4 充电高压保持时间单位0.1s
@rtv0 充能值 单位0.1ms
@rtv1 充末电流 单位0.1uA
@rtv2 充电最大电流 单位0.1Ma
@rtv3 充电抖动幅值 adv
*/
void XT_Test_ChgEnergy(void)
{
uint8_t uc_charge_class = checker_runcfg.params[0];
uint16_t us_sample_timeout = checker_runcfg.params[1];
uint16_t us_adend = checker_runcfg.params[2];
uint16_t us_chgend_cur = checker_runcfg.params[3];
uint16_t us_timeout = checker_runcfg.params[4];
uint32_t ul_holdtime = checker_runcfg.params[5];
uint16_t us_array[4];
uint16_t us_energy = 0;
uint16_t us_end_cur = 2000;
uint16_t us_max_cur = 0;
uint16_t us_shake = 65535;
uint32_t ul_temp;
uint8_t uc_rtv = 0;
XT_Init(0x78);
XT_Charge_All(uc_charge_class);
if(us_adend > 10)
{
Power_SetSampleRange_Seep(XTChecker_ChgEnger_Sample_R,ADC_SPEED_HIGH);
delay_ms(1);
us_energy = AD_GetChgEnergy(us_sample_timeout,us_adend,&us_max_cur,&us_shake);
us_max_cur = ( Power_ConvCur(us_max_cur,XTChecker_ChgEnger_Sample_R) /100+5)/10;
ADC_CurChnnelSet(AN_MAL_CH, ADC_SPEED_MIDLE);
ul_temp = AD_CurMonitor(ul_holdtime*1000);
if(ul_temp > us_shake)
{
us_shake = ul_temp;
}
}else{
us_shake = 0;
us_max_cur = 0;
us_energy = 0;
}
us_timeout++;
us_array[0] = ADC_GetBaseStableCur();
us_array[1] = ADC_GetBaseStableCur();
us_array[2] = ADC_GetBaseStableCur();
while(us_timeout > 0)
{
us_array[3] = ADC_GetBaseStableCur();
Bubble_Sort_u16(us_array,3);
us_end_cur = us_array[0];
if(us_end_cur < us_chgend_cur )
{
break;
}
us_timeout--;
}
// if(us_end_cur > us_chgend_cur)
// {
// uc_rtv = 1;
// }
CurrentSampleR_Def;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
us_array[0] = us_energy;
us_array[1] = us_end_cur;
us_array[2] = us_max_cur;
us_array[3] = us_shake;
Checker_SetRtv(us_array,checker_runcfg.rtv_count);
}
/*
@brief 写现场值,如果UID已经写入会将现场值读取进行比对
@param 0 编号
@param 1 延时
@param 2 孔号
*/
void XT_Test_WriteRunField(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
XT_RunBuf[0] = 0xFF & (checker_runcfg.params[0] >> 8);
XT_RunBuf[1] = 0xFF & (checker_runcfg.params[0]);
XT_RunBuf[2] = 0;
XT_RunBuf[3] = 0xFF & (checker_runcfg.params[1] >> 8);
XT_RunBuf[4] = 0xFF & (checker_runcfg.params[1]);
XT_RunBuf[5] = 0xFF & (checker_runcfg.params[2] >> 8);
XT_RunBuf[6] = 0xFF & (checker_runcfg.params[2]);
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Write_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
delay_os_ms(40);
uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+10);
for(uc_count = 0; uc_count < 7; uc_count++)
{
if(XT_RunBuf[uc_count] != XT_RunBuf[uc_count+10])
{
uc_rtv |= 0x01;
}
}
}else{
uc_rtv = XT_Write_Field_All(XT_RunBuf);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 比对现场值
@param0 比对网络号
@param1 比对延时
@param2 比对孔位
@param3 1使能或 0失能通信反码信息采集
@rtv1 最大反馈电流
@rtv2 最大反馈时间
@rtv3 最小反馈电流
@rtv4 最小反馈时间
*/
void XT_Test_CheckRunField(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
uint16_t aus_temp[4];
uint32_t ul_temp;
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
XT_RunBuf[0] = 0xFF & (checker_runcfg.params[0] >> 8);
XT_RunBuf[1] = 0xFF & (checker_runcfg.params[0]);
XT_RunBuf[2] = 0;
XT_RunBuf[3] = 0xFF & (checker_runcfg.params[1] >> 8);
XT_RunBuf[4] = 0xFF & (checker_runcfg.params[1]);
XT_RunBuf[5] = 0xFF & (checker_runcfg.params[2] >> 8);
XT_RunBuf[6] = 0xFF & (checker_runcfg.params[2]);
if(checker_runcfg.uid_len == 0)
{
memset(aus_temp,0,8);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(aus_temp,checker_runcfg.rtv_count);
return;
}
if(checker_runcfg.params[3] > 0)
{
XT_FreeBack_Prapare(1);
}
uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+10);
ul_temp = Power_ConvCur(XT_FreeBackMaxCur, XTDriver_Sample_R); //通信电流
ul_temp = (ul_temp / 10+4)/10;//0.01mA
aus_temp[0] = ul_temp ;
aus_temp[1] = (uint16_t)((((XT_ADC_SAMPLE_TIME*1000)*XT_FreeBackMaxTime)/XT_Read_AD_Sample_C+400)/1000) ;
ul_temp = Power_ConvCur(XT_FreeBackMinCur, XTDriver_Sample_R); //通信电流
ul_temp = (ul_temp / 10+4)/10;//0.01mA
aus_temp[2] = ul_temp;
aus_temp[3] = (uint16_t)((((XT_ADC_SAMPLE_TIME*1000)*XT_FreeBackMinTime)/XT_Read_AD_Sample_C+400)/1000) ;
if(uc_rtv == 0)
{
for(uc_count = 0; uc_count < 7; uc_count++)
{
if(XT_RunBuf[uc_count] != XT_RunBuf[10+uc_count])
{
uc_rtv |= 0x01;
}
}
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(aus_temp,checker_runcfg.rtv_count);
}
/*
@brief 桥丝通断检测,如果测试器有uid将采用uid方式通信
*/
void XT_Test_Resister(void)
{
uint16_t us_rtv = 0;
if(checker_runcfg.uid_len > 0)
{
us_rtv = XT_Get_UID_R(checker_runcfg.writeuid,checker_runcfg.uid_len);
}else{
us_rtv = XT_Get_R();
}
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_rtv,checker_runcfg.rtv_count);
}
/*
@brief 电容容量检测,如果测试器有uid将采用uid方式通信
@param0 检测电压参数
@param1 超时时间
@rtv0 电容容量 0.1uF
*/
void XT_Test_Cap(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp;
uint32_t ul_time_out = checker_runcfg.params[1] ;
float f_cap = 0.0f;
if(checker_runcfg.params[0] == 0)
{
checker_runcfg.params[0] = 0x11;//默认1V挡位
}
if(ul_time_out == 0)
{
ul_time_out = XTSingleCollectAckTimerOverflowCnt;
}
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Get_UID_C(checker_runcfg.writeuid,checker_runcfg.uid_len,checker_runcfg.params[0],ul_time_out,&f_cap);
}else{
uc_rtv = XT_Get_C(checker_runcfg.params[0],ul_time_out,&f_cap);
}
XT_Charge_All(0x00);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
us_temp = (uint16_t)(f_cap*10);
Checker_SetRtv(&us_temp,checker_runcfg.rtv_count);
}
/*
@brief 写管壳码 如果测试器有uid将采用uid方式通信
@param 命令缓存参数的起始
@param 写入数据长度
*/
void XT_Test_WriteShell(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
if(0 != Checker_FacBufCheck())
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
//管壳号最长 13个字节
if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF) || checker_runcfg.params[1] > 13)
{
uc_rtv = 2;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]);
uc_rtv |= XT_Write_Shell(XT_RunBuf);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 写UID
@param 命令缓存参数的起始
@param 写入数据长度
*/
void XT_Test_WriteUID(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF))
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
if(CheckCRC_8(&Checker_FacBuf[2],Checker_FacBuf[0]) != Checker_FacBuf[1])
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[1] > 13)
{
checker_runcfg.params[1] = 13;
}
memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]);
uc_rtv = XT_Write_Uid(XT_RunBuf,checker_runcfg.params[1]);
XT_Clear_Read();
uc_rtv |= XT_Read_Uid(XT_RunBuf+16,checker_runcfg.params[1]);
if(uc_rtv == 0)
{
for(uc_count = 0; uc_count < checker_runcfg.params[1];uc_count++)
{
if(XT_RunBuf[uc_count] != XT_RunBuf[16+uc_count])
{
uc_rtv |= 0x01;
}
}
}
if(uc_rtv == 0)
{
checker_runcfg.uid_len = checker_runcfg.params[1];
memcpy(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 写密码
@param 命令缓存参数的起始
@param 写入数据长度
*/
void XT_Test_WritePWD(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_state;
if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF))
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
if(CheckCRC_8(&Checker_FacBuf[2],Checker_FacBuf[0]) != Checker_FacBuf[1])
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[1] > 13)
{
checker_runcfg.params[1] = 13;
}
memcpy(XT_RunBuf,&Checker_FacBuf[2]+checker_runcfg.params[0],checker_runcfg.params[1]);
uc_rtv = XT_Write_Bmid(XT_RunBuf,checker_runcfg.params[1]);
uc_rtv |= XT_Check_Bmid(XT_RunBuf,checker_runcfg.params[1]);
if(checker_runcfg.uid_len > 0)
{
memset(XT_RunBuf+16,0,8);
uc_rtv |= XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf+16);
uc_state = XT_RunBuf[16+7];
if( (uc_state & 0x20) == 0)
{
uc_rtv = 0x01;
}
}
if(uc_rtv == 0)
{
checker_runcfg.pwd_len = checker_runcfg.params[1];
memcpy(checker_runcfg.writepwd,XT_RunBuf,checker_runcfg.pwd_len);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 备份区标记检测,备份区用于存储检测标记
@param0 0备份区标记 或 1比对
@param1 备份区数据掩码 1Bytes
@param1 备份区写入数据 1Bytes
*/
void XT_Test_CheckBackFlag(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp1;
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Read_Param(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
}else{
uc_rtv = XT_Read_Param_All(XT_RunBuf);
}
if(uc_rtv != 0)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
us_temp1 = XT_RunBuf[1];
if(checker_runcfg.params[0] == 0)
{
us_temp1 &= (~checker_runcfg.params[1]);
us_temp1 |= checker_runcfg.params[2];
XT_RunBuf[1] = 0x0FF & us_temp1;
uc_rtv |= XT_Write_Param(XT_RunBuf);
}
else{
us_temp1 = us_temp1 & checker_runcfg.params[1] ;
if(us_temp1 != checker_runcfg.params[2])
{
uc_rtv = 1;
}
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 读取备份区数据
@rtv0 备份区2字节
@rtv0 备份区2字节
*/
void XT_Test_ReadBackFlag(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp[2];
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Read_Param(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
}else{
uc_rtv = XT_Read_Param_All(XT_RunBuf);
}
memcpy(us_temp,XT_RunBuf,4);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(us_temp,checker_runcfg.rtv_count);
}
/*
@brief 时钟校准
@param0 校准模式 1 快速 0 全
@param1 校准周期
@param2 校准时长
*/
void XT_Test_Trim(void)
{
uint8_t uc_rtv = 0;
if(checker_runcfg.params[0] > 0)
{
XT_Trim_Faset_Cycle(checker_runcfg.params[1],checker_runcfg.params[1]>>1);
}else{
XT_Trim_Complete_Cycle(checker_runcfg.params[1],checker_runcfg.params[1]>>1,checker_runcfg.params[2]);
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 放电
*/
void XT_Test_Discharge(void)
{
uint8_t uc_rtv = 0;
XT_Charge_All(0x00);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 失能通信末电流采集
*/
void XT_Test_EnCommEndCur(void)
{
XT_CommEndMaxCur = 0;
XT_CommEnd_CurEn = 1;
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief 获取通信末电流
*/
void XT_Test_GetCommEndCur(void)
{
XT_CommEnd_CurEn = 0;
Checker_SetRtv((uint16_t *)&XT_CommEndMaxCur,checker_runcfg.rtv_count);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief 在线检测
@param 检测网络号
*/
void XT_Test_OneLineCheck(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_temp;
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
uc_rtv = XT_Check_Online(400,XT_RunBuf);
if(checker_runcfg.params[0] > 400)
{
checker_runcfg.params[0] = 400;
}
if(checker_runcfg.params[1] > 400)
{
checker_runcfg.params[1] = 400;
}
if(checker_runcfg.params[0] > 0)
checker_runcfg.params[0]--;
uc_temp = checker_runcfg.params[0] >> 3;
uc_temp = XT_RunBuf[uc_temp] << (checker_runcfg.params[0] & 0x07);
if(uc_temp != 0x80)
{
uc_rtv = 0x01;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 状态检测,如果UID已经存在使用UID读取。否则通过扫描的方式
@param0 状态比较掩码
@rtv0 与掩码后的状态值
*/
void XT_Test_CheckState(void)
{
uint8_t uc_rtv = 0;
uint16_t us_state = 0;
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.uid_len > 0)
{
uc_rtv = XT_Read_Field(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
us_state = XT_RunBuf[7];
if((us_state & checker_runcfg.params[0]) != checker_runcfg.params[1])
{
uc_rtv = 1;
}
}else{
uc_rtv = 1;
us_state = 0;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_state,checker_runcfg.rtv_count);
}
/*
@brief 起爆
@param 起爆超时
@param 巡检脉冲个数
*/
void XT_Test_Boom(void)
{
uint8_t uc_rtv,uc_temp;
uint16_t us_index = 0;
uint16_t us_count = 0;
uint16_t us_res[2];
uint32_t ul_maxdelay = checker_runcfg.params[0];
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[1] == 0)
{
checker_runcfg.params[1] = 400;
}
uc_rtv = XT_Check_Fire_Each(checker_runcfg.params[1],XT_RunBuf);
for(us_index = 0; us_index < XT_CHECKER_RUN_BUF;us_index++)
{
if(XT_RunBuf[us_index] != 0)
{
uc_temp = XT_RunBuf[us_index];
us_res[1] = us_index*8;
while(uc_temp > 0)
{
us_res[1]++;
if((uc_temp & 0x80) > 0)
{
us_count++;
}
uc_temp <<= 1;
}
}
}
if(us_count != 1)
{
uc_rtv = 1;
}
uc_rtv |= XT_Check_Fire_All();
uc_rtv |= XT_MeasureFire(&ul_maxdelay);
us_res[0] = (uint16_t)ul_maxdelay;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(us_res,checker_runcfg.rtv_count);
}
/*
@brief 复位
*/
void XT_Test_Reset(void)
{
uint8_t uc_rtv = 0;
XT_Reset();
delay_os_ms(40);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 关总线
*/
void XT_Test_PowerOFF(void)
{
uint8_t uc_rtv = 0;
XT_Charge_All(0x00);
delay_os_ms(100);
XTBUS_OFF;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 芯片锁存
*/
void XT_Test_LockCmdC(void)
{
uint8_t uc_rtv = 0;
XT_Lock();
delay_ms(20);
XT_Clear_Read();
if(0 != XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len))
{
uc_rtv = 0x01;
}
else{
if((XT_RunBuf[checker_runcfg.uid_len+7] & 0x80) != 0x80)//锁存后是bit7 = 1;
{
uc_rtv = 0x01;
}
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 赋码设备失能
*/
void XT_Test_CodeBindEn(void)
{
uint8_t uc_rtv = 0;
checker_runcfg.uid_pwd_bind_flag = 0xAA;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
static uint8_t XT_Test_InputChek_(uint16_t us_count )
{
uint8_t uc_rtv = 0;
uint8_t uc_flag = 0;
uint32_t ul_timeout,ul_time;
Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE);
ul_timeout = us_count;
ul_timeout *= 100;
ul_time = 0;
Get10usCount();
while(ul_time <= ul_timeout )
{
ul_time += Get10usCount();
if(ADC_GetCurADCFast() > 25)
{
uc_flag++;
if(uc_flag > 50)
{
if( ADC_GetBaseStableCur() > 120)
{
Power_SetSampleCurrentRange(Current_Max) ;
delay_ms(2);
ul_time += Get10usCount();
XT_Clear_Read();
if( 0 == XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len))
{
break;
}else{
ul_time += 250000;
Get10usCount();//XT通信超时定时器也是使用tim2产生通信后需要请您
Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE);
delay_ms(1);
}
}else{
Power_SetSampleRange_Seep(Checker_OnLine_Sample_R,ADC_SPEED_MIDLE);
delay_ms(1);
}
}else{
delay_ms(1);
}
continue;
}else{
delay_ms(1);
}
uc_flag = 0;
}
uc_rtv = 1;
if(uc_flag > 50)
{
uc_rtv = 0;
}
return uc_rtv;
}
/*
@brief 接入检测
@param0 上电电压
@param1 超时次数
*/
void XT_Test_InputCheck(void)
{
uint8_t uc_rtv = 0;
uint16_t us_h_v = checker_runcfg.params[0];
uint16_t us_count = checker_runcfg.params[1];
us_h_v = checker_runcfg.params[0];
if(us_h_v < 55)
{
uc_rtv = 1;
}else{
uc_rtv |= PowerCalibration_set(us_h_v,50);
XTBUS_ON;
delay_ms(100);
us_h_v = Power_GetBousV();
}
uc_rtv = XT_Test_InputChek_(us_count);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
/*
@brief 密码验证
*/
void XT_Test_CheckPWD(void)
{
uint8_t uc_rtv = 0;
if(checker_runcfg.pwd_len == 0)
{
checker_runcfg.pwd_len = 7;
}
uc_rtv = XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 加载配置参数
@rtv UID长度
@rtv 密码长度
@rtv 版本号
@rtv 反码数据
*/
void XT_Test_LoadChipCfg(void)
{
uint8_t uc_rtv = 0;
uint16_t us_temp[4];
memset(XT_RunBuf,0,10);
memset(us_temp,0,8);
uc_rtv = XT_Read_Config(XT_RunBuf);
if(uc_rtv == 0)
{
us_temp[0] = ((XT_RunBuf[1] >> 4) & 0x0F)+7;
us_temp[1] = (XT_RunBuf[1] & 0x0F)+4;
us_temp[2] = XT_RunBuf[3];
us_temp[3] = (XT_RunBuf[2] >> 2) & 0x0F;
checker_runcfg.uid_len = us_temp[0];
checker_runcfg.pwd_len = us_temp[1];
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(us_temp,checker_runcfg.rtv_count);
}
/*
@breif 测量电容电压差
@param0 两次测量间隔 0.1s
@rtv0 电压差值
*/
void XT_Test_CapVoltage(void)
{
uint16_t us_capv1;
POWER_OFF;
Power_SetSampleCurrentRange(Checker_OnLine_Sample_R);
HMOS_FAST_DISCHG;
HMOS_SWITCH_GND;
delay_os_ms(1000);
us_capv1 = AD_SampleCap(checker_runcfg.params[0]);
POWER_ON;
delay_os_ms(500);
XTBUS_ON
Power_SetSampleCurrentRange(Current_Max);
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_capv1,checker_runcfg.rtv_count);
}
/*
@brief 注码检测
@rtv 0 已经注码1 不能注码 2 需要注码
*/
static uint8_t XT_Test_CheckeThreeCode(void)
{
uint8_t uc_index;
/*
已经注码验证
*/
XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);//密码验证
XT_Clear_Read();
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len);//扫描UID
uc_index = XT_RunBuf[checker_runcfg.uid_len+7];
if((uc_index & 0x80) == 0x80)//已经上锁
{
if((uc_index & 0xA0) != 0xA0)//已经上锁,密码验证失败
{
return 0x01;
}
//已经上锁但UID比对错误
if(rt_memcmp(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len) != 0)
{
return 0x01;
}
//已经上锁,比对成功
XTBUS_OFF;
return 0;
}
return 2;
}
/*
@brief 写入三码数据
*/
void XT_Test_UID_PWD_Bind(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_ack;
uint8_t uc_count = 0;
uint8_t uc_optbuf[16];
uint32_t ul_write_mask = 0;
if(JQXT_Test_IsNeedBind() == 0)
{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
uc_rtv = XT_Test_CheckeThreeCode();
if(uc_rtv != 2)
{
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
uc_rtv = XT_Write_Uid(checker_runcfg.writeuid,checker_runcfg.uid_len);
delay_ms(40);
uc_rtv |= XT_Write_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@brief 三码绑定验证
@rtv 0 验证通过 1 UID验证不通过 2 密码验证不通过
*/
static uint8_t XT_Test_UID_PWD_Verify_(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_state;
XT_Check_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);
XT_Clear_Read();
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len);
uc_rtv = rt_memcmp(checker_runcfg.writeuid , XT_RunBuf,checker_runcfg.uid_len);
if(uc_rtv != 0)
{
return 0x01;
}
uc_state = XT_RunBuf[checker_runcfg.uid_len+7];
if((uc_state & 0x20) == 0)
{
uc_rtv = 0x02;
}
return uc_rtv;
}
/*
@brief 三码绑定验证
*/
void XT_Test_UID_PWD_Verify(void)
{
uint8_t uc_rtv = XT_Test_UID_PWD_Verify_();
if(uc_rtv != 0)
{
uc_rtv = 0x01;
}
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
}
/*
@breif 在线检测 并扫描通信
@param0 总线电压
@param1 超时时间1ms 最大6S
@param2 UID长度
*/
void XT_OnLine_SCAN(void)
{
uint16_t us_h_v;
uint8_t uc_rtv = 0;
PowerCalibration_set(checker_runcfg.params[0],50);
XTBUS_ON;
delay_os_ms(100);
us_h_v = Power_GetBousV();
if((us_h_v > (checker_runcfg.params[0]+5)) || (us_h_v < (checker_runcfg.params[0]-5)))
{
XTBUS_OFF;
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
if(0 != XT_Test_InputChek_(checker_runcfg.params[1]))
{
XTBUS_OFF;
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
delay_ms(10);
XT_Init(0x78);
XT_Clear_Read();
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.params[2] == 0)
{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
return;
}
uc_rtv = XT_Read_Uid(XT_RunBuf,checker_runcfg.params[2]);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(&us_h_v,checker_runcfg.rtv_count);
}
/*
@brief 芯片离线检测
@param0 超时时间 1ms
@param1 离线电流 0.1uA
@param2 稳定次数
*/
void XT_OFFLine_SCAN(void)
{
uint32_t ul_timeout = checker_runcfg.params[0];
uint16_t us_cur = checker_runcfg.params[1];
uint16_t us_count = checker_runcfg.params[2];
uint16_t us_temp = 0,ul_time = 0;
ul_timeout *= 1000;
Get1usCount();
while((us_temp < us_count) && (ul_time < ul_timeout))
{
ul_time += Get1usCount();
if(us_cur >= ADC_GetBaseStableCur())
{
us_temp++;
continue;
}
us_temp = 0;
}
if(us_temp >= us_count)
{
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
Checker_MaskResult(1,checker_runcfg.task_info.runindex);
}
/*
@brief 芯片离线检测
@param0 充电使能
@param1 采样周期 10ms
@param2 采样次数
*/
void XT_CurMonitor(void)
{
uint16_t us_charge_en = checker_runcfg.params[0];
uint32_t ul_timeout = checker_runcfg.params[1];
uint16_t us_count = checker_runcfg.params[2];
uint16_t us_temp = 0,ul_time = 0;
uint32_t ul_runTimer = 0,ul_cur,ul_1sCount;
ul_timeout *= 1000;
if(us_charge_en > 0)
{
XT_Charge_All(us_charge_en);
}
while(us_count > 0)
{
Get1usCount();
// ul_cur = Power_GetCurrent();
ul_cur = (uint32_t) (Get_Temperature()*100);
printf("CurM %d\r\n",ul_cur);
ul_runTimer= Get1usCount();
if((ul_runTimer+5) > ul_timeout)
{
continue;
}
ul_runTimer = ul_timeout - ul_timeout -5;
ul_1sCount = ul_runTimer / 1000000;
ul_runTimer = ul_runTimer - ul_1sCount*1000000;
while(ul_1sCount > 0)
{
delay_us(1000000);
}
delay_us(ul_runTimer);
}
Checker_MaskResult(0,checker_runcfg.task_info.runindex);
}
/*
@brief 验证壳码 如果测试器有uid将采用uid方式通信
@param 命令缓存参数的起始
@param 验证数据长度
*/
void XT_Test_VerfyShell(void)
{
uint8_t uc_rtv = 0;
uint8_t uc_count = 0;
uint8_t uc_index = 0;
uint16_t us_temp[7];
if(0 != Checker_FacBufCheck())
{
uc_rtv = 1;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
//管壳号最长 13个字节
if((checker_runcfg.params[0] + checker_runcfg.params[1] > CHECKER_WRITE_BUF) || checker_runcfg.params[1] > 13)
{
uc_rtv = 2;
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
return;
}
memset(XT_RunBuf,0,XT_CHECKER_RUN_BUF);
if(checker_runcfg.uid_len > 0)
{
uc_rtv=XT_Read_Shell(checker_runcfg.writeuid,checker_runcfg.uid_len,XT_RunBuf);
if(uc_rtv) uc_rtv =3;
}else{
uc_rtv=XT_Read_Shell_All(XT_RunBuf);
if(uc_rtv) uc_rtv =4;
}
uc_index = checker_runcfg.params[0]+2;
for(uc_count = 0; uc_count < checker_runcfg.params[1];uc_count++)
{
if(Checker_FacBuf[uc_index++] != XT_RunBuf[uc_count])
{
uc_rtv =5;
break;
}
}
if(checker_runcfg.rtv_count > 7)
{
checker_runcfg.rtv_count = 7;
}
memcpy(us_temp,XT_RunBuf,checker_runcfg.rtv_count<<1);
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
Checker_SetRtv(us_temp,checker_runcfg.rtv_count);
}
CheckerTask xttaskArray[CHECKER_MAXID_COUNT] ={
Checker_PowerPrapare, //0 电源准备
XT_Test_PowerOn, //1 上电充能
XT_Test_SetBusV, //2 设置总线电压
XT_Test_BaseCur, //3 获取总线电流
XT_Test_ScanUID, //4 扫描UID
XT_Test_WriteChipCfg, //5 写配置参数
XT_Test_CheckChipCfg, //6 验证配置
XT_Test_BindTestCode, //7 模拟注码
XT_Test_ChgEnergy, //8 充能统计
XT_Test_WriteRunField,//9 写现场值 网络id 延时
XT_Test_CheckRunField,//10比对现场值
XT_Test_Resister ,//11 桥丝通断检测
XT_Test_Cap ,//12 电容容量统计
Checker_WaitDelay ,//13 延时等待
XT_Test_WriteShell ,//14 写管壳号/工厂信息
XT_Test_WriteUID ,//15 写UID
XT_Test_WritePWD ,//16 写密码
XT_Test_CheckBackFlag ,//17 写入/检测备份区标志
XT_Test_ReadBackFlag ,//18 读取备份区数据
XT_Test_Trim ,//19 校准
XT_Test_EnCommEndCur ,//20 使能通讯末电流采集
XT_Test_GetCommEndCur ,//21 获取通讯末电流
XT_Test_Discharge ,//22 放电
XT_Test_OneLineCheck ,//23 在线检测
XT_Test_CheckState ,//24 状态检测
XT_Test_Boom ,//25 起爆
XT_Test_Reset ,//26 复位
XT_Test_PowerOFF ,//27 关总线
XT_Test_LockCmdC ,//28 芯片锁存
XT_Test_CodeBindEn ,//29 使能赋码设备
XT_Test_InputCheck ,//30 在线检测
XT_Test_CheckPWD ,//31 密码验证
XT_Test_LoadChipCfg ,//32 加载芯片配置
XT_Test_CapVoltage ,//33 电容压差测试
Checker_ResistorSample,//34 桥丝电阻测试
XT_Test_UID_PWD_Bind ,//35 检测过程中注码
XT_Test_UID_PWD_Verify,//36 验证注码
XT_OnLine_SCAN ,//37 模块在线检测
XT_Test_VerfyShell ,//38 验证管壳码
(void*)0 //数组结束
};
/*
@brief 三码写入
@rtv 0 执行成功
1 电压设置失败
3 UID写入失败
4 密码写入失败
5 获取UID失败
6 UID写入失败
7 锁存失败
8 等待接入超时
9 已经其他数据
*/
uint8_t XT_UID_PWD_Bind(void)
{
uint16_t us_h_v;
uint8_t uc_index = 0, uc_rtv = 0;
// 雷管厂代码为0时不锁定
uint8_t lock=checker_runcfg.writeuid[1];
uint8_t stat_check=0x20;
ThreeBindResult_flag = 0x00;
if(checker_runcfg.uid_pwd_bind_flag != 0xAA)
{
PowerCalibration_set(Checker_First_Set_Voltage,50);
XTBUS_ON;
delay_os_ms(100);
us_h_v = Power_GetBousV();
if((us_h_v > (Checker_First_Set_Voltage+5)) || (us_h_v < (Checker_First_Set_Voltage-5)))
{
XTBUS_OFF;
return 1;
}
if(0 != XT_Test_InputChek_(2000))
{
XTBUS_OFF;
return 8;
}
delay_ms(10);
XT_Init(0x78);
delay_ms(10);
}
/*
已经注码验证
*/
uc_rtv = XT_Test_CheckeThreeCode();
if(uc_rtv == 0)
{
XTBUS_OFF;
ThreeBindResult_flag = 0x55;
return 0x55;
}
else if(uc_rtv == 1)
{
XTBUS_OFF;
return 0x09;
}
XT_Write_Uid(checker_runcfg.writeuid,checker_runcfg.uid_len);
delay_ms(40);
XT_Write_Bmid(checker_runcfg.writepwd,checker_runcfg.pwd_len);
delay_ms(40);
uc_rtv = XT_Test_UID_PWD_Verify_();
if(uc_rtv == 0x01)
{
XTBUS_OFF;
return 2;
}else if(uc_rtv == 0x02)
{
XTBUS_OFF;
return 4;
}
if(lock){
//设置电流挡位0x11 1档。锁定前必须执行该命令
XT_Set_Current(0x11);
delay_ms(30);
XT_Lock();
delay_ms(40);
stat_check=0xa0;//锁存后是0xa0
}
XT_Clear_Read();
if(0 != XT_Read_Uid(XT_RunBuf,checker_runcfg.uid_len))
{
XTBUS_OFF;
return 5;//扫描UID不存在
}
uc_rtv = rt_memcmp(checker_runcfg.writeuid,XT_RunBuf,checker_runcfg.uid_len);
if(uc_rtv != 0)
{
XTBUS_OFF;
return 6;
}
uc_index = XT_RunBuf[checker_runcfg.uid_len+7];
if((uc_index & stat_check) != stat_check)
{
XTBUS_OFF;
return 7;
}
ThreeBindResult_flag = 0x55;
XTBUS_OFF;
return 0x55;
}