更新EW模块驱动
This commit is contained in:
@@ -232,3 +232,6 @@
|
||||
添加 HARD_VERSION 宏,根据硬件版本不同来确定power参数
|
||||
2023.10.30
|
||||
添加通用的异常判断算法
|
||||
2023.10.31
|
||||
添加通用的异常判定算法,已验证
|
||||
更新EW模块驱动
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
|
||||
|
1562
source/elec_det/driver/history/EWDriver.c
Normal file
1562
source/elec_det/driver/history/EWDriver.c
Normal file
File diff suppressed because it is too large
Load Diff
348
source/elec_det/driver/history/EWDriver.h
Normal file
348
source/elec_det/driver/history/EWDriver.h
Normal file
@@ -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
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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;i<task->item_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(temp<task->range[0].min||temp>task->range[0].max){
|
||||
elec_add_errcode(e,1);
|
||||
}
|
||||
temp=GET_RET_DATA(1);
|
||||
if(temp<task->range[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;i<sizeof(pro_table);i++){
|
||||
for(int j=0;j<ERR_LIST_LEN;j++){
|
||||
if(e->err_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;i<task_num;i++)
|
||||
{
|
||||
task=&e->scheme->task[i];
|
||||
if(task->taskid<e->judge_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->taskid<e->judge_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;i<ERR_LIST_LEN;i++){
|
||||
e->err_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];
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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);
|
||||
|
||||
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
||||
|
||||
//电压调节的关系为线性函数
|
||||
|
@@ -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()
|
||||
|
@@ -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_v<power_old-10)||(us_h_v>power_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 //数组结束
|
||||
};
|
||||
|
||||
|
||||
|
@@ -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 );
|
||||
|
||||
|
@@ -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"
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user