chore: 更新调试宏定义并关闭默认打印

1.  更新chrg_north.h中的调试宏命名规范,拆分原有DEBUG_NORTH为多个细分调试开关
2.  注释掉mb_crc16函数中默认的串口打印调试代码
3.  新增南向命令发送时的调试打印开关
4.  统一各模块调试宏的默认关闭状态
5.  新增大量.codex-*目录下的NuGet中间生成文件
This commit is contained in:
wrh
2026-07-30 11:39:16 +08:00
parent 79c63f7b8e
commit f21492fa50
180 changed files with 82212 additions and 376 deletions
+22 -4
View File
@@ -586,7 +586,7 @@ eMBException funcReadHoldingRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen,
} else {
*resLen = 3+cntReg * 2;
}
rt_kprintf("------COM READ addr=%d count=%d-------\n", regAddress, cntReg);
// rt_kprintf("------COM READ addr=%d count=%d-------\n", regAddress, cntReg);
return eStatus;
}
@@ -628,7 +628,9 @@ eMBException funcReadInputRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen,
*resLen = 3+cntReg*2;
}
rt_kprintf("------COM READ INPUT addr=%d count=%d-------\n", regAddress, cntReg);
#if COMM_DEBUG
rt_kprintf("COM read input: addr=%d count=%d\n", regAddress, cntReg);
#endif
return eStatus;
}
@@ -1133,7 +1135,9 @@ eMBException funcWriteMultipleHoldingRegister (rt_uint8_t *reqFrame, rt_uint16_t
pSW->source.set_volt = sou_value;
pSW->sink.loadv = sou_value;
chrg_set_sou_reg(ch, sout_reg, sou_value);
#if COMM_DEBUG
rt_kprintf("voltage=%d", sou_value);
#endif
break;
case REG_CURRENT_OUT + 1:
pSW->source.set_curr = sou_value;
@@ -1144,7 +1148,9 @@ eMBException funcWriteMultipleHoldingRegister (rt_uint8_t *reqFrame, rt_uint16_t
rt_kprintf("THE SOUT_REG=%d", sout_reg);
break;
}
#if COMM_DEBUG
rt_kprintf("ch=:%d,reg=%02x,value=%02x", ch, sout_reg, sou_value);
#endif
}
#else
// 正常产品模式:分区地址逻辑
@@ -1231,7 +1237,10 @@ eMBException funcTrimELoad (rt_uint8_t *reqFrame, rt_uint16_t reqLen,
rt_uint8_t enable_flag = (reqFrame[2]>>4)&0x0F;
regAddress = reqFrame[3];
RegCount = u8v_to_u16(&reqFrame[4]);
rt_kprintf("ch=%d,enable=%d,reg=0x%02x,count=%d\n",ch+1,enable_flag,regAddress,RegCount);
#if COMM_TRIM_DEBUG
rt_kprintf("trim ch=%d enable=%d reg=0x%02x count=%d\n",
ch + 1, enable_flag, regAddress, RegCount);
#endif
if(ch >= TOTAL_SOU_CHS){
rt_kprintf("CH ERROR");
return MB_EX_ILLEGAL_DATA_VALUE;
@@ -1292,7 +1301,10 @@ eMBException funcTrimELoad (rt_uint8_t *reqFrame, rt_uint16_t reqLen,
break;
}
//寄存器操作
rt_kprintf("com ch=:%d,reg=%02x,value=%d\n",ch,Curr_reg_addr,Curr_write_value);
#if COMM_TRIM_DEBUG
rt_kprintf("trim ch=%d reg=%02x value=%d\n",
ch, Curr_reg_addr, Curr_write_value);
#endif
}
if (pTrim->trim_mode == 0) {
return MB_EX_ILLEGAL_DATA_ADDRESS;
@@ -1528,6 +1540,9 @@ static int chrg_comm_parse_msg (struct chrg_comm_t *pCOMM)
u16_to_u8v_com(crc, &pCOMM->tx_buf[pCOMM->tx_len]);
pCOMM->tx_len += 2;
#if COMM_FRAME_DEBUG
LOG_HEX("sendC", 32, pCOMM->tx_buf, pCOMM->tx_len);
#endif
ret = chrg_tty_send(pCOMM->tty, pCOMM->tx_buf, pCOMM->tx_len);
}
@@ -2055,6 +2070,9 @@ void chrg_comm_thread_entry (void *data)
pCOMM->rx_len = len;
pCOMM->tx_len = 0;
#if COMM_FRAME_DEBUG
LOG_HEX("recvC", 32, pCOMM->rx_buf, pCOMM->rx_len);
#endif
chrg_comm_parse_msg(pCOMM);
}
}
+33 -37
View File
@@ -201,8 +201,8 @@ void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
pSW->VZ = ((frame_data[14] << 8) | frame_data[15]);
pSW->VF = ((frame_data[16] << 8) | frame_data[17]);
#if DEBUG_NORTH
// LOG_D("Sink[%d] real volt: %d mV", idx, volt_mv);
#if NORTH_SINK_DEBUG
LOG_D("Sink[%d] real volt: %d mV", idx, volt_mv);
#endif
if(pSW->sink.On_work == 1 && pSW->sink.test.test_mode == 0) {
@@ -243,32 +243,6 @@ void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
chrg_sink_work(idx,pSW);
}
/*****************************************************************
函数名称: chrg_north_handle_Seting_Volt
函数描述: 根据当前通道角色分发21字节电压电流回码
输入参数: frame_data:完整北向回码 frame_len:回码长度
输出参数: 调用Source或Sink解析函数更新当前通道状态
返回说明: -
其它说明: 当前通道由chrgnorth.idx确定,角色由pSW->id确定
*****************************************************************/
rt_uint8_t change_number = 0;
static void chrg_north_handle_Seting_Volt(rt_uint8_t *frame_data, rt_uint16_t frame_len)
{
// 提取电压/电流值
struct chrg_north_t *pNOR = &chrgnorth;
rt_uint16_t idx = pNOR->idx;
struct chrg_switch_t *pSW = &chrgnorth.sw[idx];
static uint8_t number = 0;
//电源部分
if(pSW->id==ID_SOURCE){
chrg_source_parse(frame_data,(eIDX_SOU_CH)idx, pSW, pNOR);
}
else{
chrg_sink_parse(frame_data,(eIDX_SOU_CH)idx, pSW, pNOR);
}
}
struct chrg_north_t chrgnorth = {
.devname = DEV_NAME_NORTH, // 设备名
.tty = RT_NULL, // 串口句柄初始为空
@@ -373,7 +347,7 @@ int chrg_north_send (rt_uint8_t *data, rt_size_t length)
struct chrg_tty_t *pTTY = chrgnorth.tty;
if (RT_NULL != pTTY) {
#if DEBUG_NORTH //是否打印
#if NORTH_FRAME_DEBUG
LOG_HEX("sendN", 32, data, length);
#endif
ret = chrg_tty_send(pTTY, data, length);
@@ -544,22 +518,44 @@ static int chrg_north_frame_append(struct rt_ringbuffer *rb,
/*****************************************************************
函数名称: chrg_north_frame_dispatch
函数描述: 分发已经组装完成的北向数据帧
函数描述: 校验并分发已经组装完成的北向数据帧
输入参数: pFrame:包含完整pMB消息的帧接收上下文
输出参数: 21字节回码进入电压解析,同时完整消息发送到北向轮询邮箱
输出参数: 合法完整帧发送到北向轮询邮箱
返回说明: -
其它说明: 消息所有权移交邮箱后只复位上下文,不在此处释放pMB
其它说明: 本函数只负责帧结构和CRC校验,不执行Source/Sink业务解析;
校验失败时释放消息,校验成功后将消息所有权移交北向轮询线程
*****************************************************************/
static void chrg_north_frame_dispatch(struct pickup_info_t *pFrame)
{
struct mb_msg_t *pMB = pFrame->pMB;
struct mb_msg_t *pMB;
rt_uint8_t crc_calc;
rt_uint8_t crc_recv;
if (pMB->length == 21) {
chrg_north_handle_Seting_Volt(pMB->payload, pMB->length);
if (pFrame == RT_NULL) {
return;
}
pMB = pFrame->pMB;
if ((pMB == RT_NULL) || (pMB->payload == RT_NULL) ||
(pMB->length < MIN_FRAME_LENGTH) ||
(pMB->length > 0xFFU) ||
(pMB->payload[0] != (rt_uint8_t)pMB->length) ||
(pMB->payload[1] != 0x00U)) {
LOG_E("invalid north frame: len=%d", pMB ? pMB->length : 0);
chrg_north_frame_reset(pFrame, RT_TRUE);
return;
}
crc_calc = calc_crc8(pMB->payload, (rt_uint8_t)(pMB->length - 1U));
crc_recv = pMB->payload[pMB->length - 1U];
if (crc_calc != crc_recv) {
LOG_E("north crc failed: len=%d calc=%02x recv=%02x",
pMB->length, crc_calc, crc_recv);
chrg_north_frame_reset(pFrame, RT_TRUE);
return;
}
chrg_north_frame_reset(pFrame, RT_FALSE);
chrg_thread_mb_send(IDX_THR_NORTH, pMB);
(void)chrg_thread_mb_send(IDX_THR_NORTH, pMB);
}
static int chrg_north_pickup_frame (struct rt_ringbuffer *rb,
@@ -701,7 +697,7 @@ void chrg_north_thread_entry (void *data)
chrg_north_frame_reset(&pNOR->frame, RT_TRUE);
continue;
}
#if DEBUG_NORTH
#if NORTH_FRAME_DEBUG
LOG_HEX("recvN", 32, pNOR->rx_buf, len);
#endif
chrg_north_pickup_frame(pNOR->rb, &pNOR->frame, pNOR->idx);
+34 -4
View File
@@ -19,15 +19,20 @@
#define THR_NAME_NORTH "thr.nor"
#define DEV_NAME_NORTH "uart3"
#define LEN_FRAME_HEAD (3) // [帧长, 0x00, id]
#define LEN_FRAME_HEAD (4) // [帧长, 0x00, id, 命令]
#define MIN_FRAME_LENGTH (5) // 帧最短5字节
#define WORK_MIN_VOLT 3000 // 工作电压下限,单位mV
#define DEBUG_NORTH 0x01 // 0 = 关闭,1 = 开启
#define NORTH_FRAME_DEBUG 0x01 // 北向UART原始收发帧
#define NORTH_SOURCE_DEBUG 0x00 // Source协议解析及组帧
#define NORTH_SINK_DEBUG 0x00 // Sink协议解析及组帧
#define SOUTH_FRAME_DEBUG 0x00 // 南向UART原始收发帧
#define SOUTH_COMMAND_DEBUG 0x00 // 南向寄存器写命令
#define COMM_FRAME_DEBUG 0x00 // COM UART原始收发帧
#define COMM_DEBUG 0x00 // COM寄存器读写过程
#define COMM_TRIM_DEBUG 0x00 // COM校准参数解析
#define LCD_OPEN 0x01 // 0为关闭屏幕显示 1为打开
#define TRIM_NORTH 0x00 // 0 = 关闭, 1 = 开启
#define SINK_TEST_DEBUG 0x00 // 0 = 关闭,1 = 开启
#define PRO_TEST_DEBUG 0x00 //
#define DEBUG_SOUTH 0x00 // 0 = 关闭,1 = 开启
// 北向4通路索引 U14 ->
typedef enum {
IDX_NOR_CH1 = IDX_CH1, // J3
@@ -104,6 +109,7 @@ struct chrg_north_t {
struct chrg_tty_t *tty;
struct rt_ringbuffer *rb;
struct pickup_info_t frame;
rt_uint32_t config_version[TOTAL_NOR_CHS]; // COM config generation
struct chrg_trim trim[TOTAL_NOR_CHS];
rt_uint8_t rx_buf[SIZE_BUF_TTY];
rt_uint8_t free_flag;
@@ -115,6 +121,30 @@ struct chrg_north_t {
extern struct chrg_north_t chrgnorth;
/*****************************************************************
函数名称: chrg_source_parse
函数描述: 解析Source的0x20电压电流回码并驱动电源状态机
输入参数: frame_data:已通过CRC校验的完整回码 idx:对应通道
pSW:通道控制结构体 pNOR:北向控制结构体
输出参数: 更新Source目标电压、电流和工作状态
返回说明: -
其它说明: 仅由北向轮询线程在确认回码角色、命令和通道匹配后调用
*****************************************************************/
extern void chrg_source_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
struct chrg_switch_t *pSW, struct chrg_north_t *pNOR);
/*****************************************************************
函数名称: chrg_sink_parse
函数描述: 解析Sink的0x20电压电流回码并驱动负载状态机
输入参数: frame_data:已通过CRC校验的完整回码 idx:对应通道
pSW:通道控制结构体 pNOR:北向控制结构体
输出参数: 更新Sink协议量测值和工作状态
返回说明: -
其它说明: 仅由北向轮询线程在确认回码角色、命令和通道匹配后调用
*****************************************************************/
extern void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
struct chrg_switch_t *pSW, struct chrg_north_t *pNOR);
/*****************************************************************
函数名称: chrg_north_switch
函数描述: 北向通道选择
+118 -83
View File
@@ -68,7 +68,7 @@ int sink_fill_pd_buf(rt_uint8_t group,rt_uint8_t pd_val, rt_uint16_t pd_volt, rt
case 0xF2: // FCP协议
buf[0] = pd_volt / 100; // 第5字节=电压(0.1V)
buf[1] = 0x00;//pd_curr / 100; // 第6字节=电流(0.1A)
#if PRO_TEST_DEBUG
#if NORTH_SINK_DEBUG
rt_kprintf("type: %02X, Voltage(0.1V)=%d\n", pd_val, pd_volt/100);
rt_kprintf("type: %02x, Curr(0.1A)=%d\n",pd_curr,pd_curr/100);
#endif
@@ -82,7 +82,7 @@ int sink_fill_pd_buf(rt_uint8_t group,rt_uint8_t pd_val, rt_uint16_t pd_volt, rt
buf[2] = pd_volt & 0xFF; // 第7字节=电压低8位(mV)
buf[3] = (pd_curr >> 8) & 0xFF; // 第8字节=电流高8位(mA)
buf[4] = pd_curr & 0xFF; // 第9字节=电流低8位(mA)
#if PRO_TEST_DEBUG
#if NORTH_SINK_DEBUG
rt_kprintf("type: %02X, Group=0, Voltage=%d mV, Current=%d mA\n", pd_val, pd_volt, pd_curr);
#endif
break;
@@ -95,7 +95,7 @@ int sink_fill_pd_buf(rt_uint8_t group,rt_uint8_t pd_val, rt_uint16_t pd_volt, rt
buf[2] = pd_volt & 0xFF; // 第7字节=电压低8位(mV)
buf[3] = (pd_curr >> 8) & 0xFF; // 第8字节=电流高8位(mA)
buf[4] = pd_curr & 0xFF; // 第9字节=电流低8位(mA)
#if PRO_TEST_DEBUG
#if NORTH_SINK_DEBUG
rt_kprintf("type: %02X, Group=0, Voltage=%d mV, Current=%d mA\n", pd_val, pd_volt, pd_curr);
#endif
break;
@@ -109,14 +109,14 @@ int sink_fill_pd_buf(rt_uint8_t group,rt_uint8_t pd_val, rt_uint16_t pd_volt, rt
buf[2] = (pd_curr >> 8) & 0xFF; // 第8字节=电流高8位(mA)
buf[3] = pd_curr & 0xFF; // 第9字节=电流低8位(mA)
buf[4] = 0;
#if PRO_TEST_DEBUG
#if NORTH_SINK_DEBUG
rt_kprintf("type: %02X, Voltage=%d mV, Current=%d mA\n", pd_val, pd_volt, pd_curr);
#endif
break;
// VOOC(无参数)
case 0xE2: // VOOC协议
#if PRO_TEST_DEBUG
#if NORTH_SINK_DEBUG
rt_kprintf("type: VOOC(0xE2), No parameters\n");
#endif
break;
@@ -129,7 +129,7 @@ int sink_fill_pd_buf(rt_uint8_t group,rt_uint8_t pd_val, rt_uint16_t pd_volt, rt
rt_uint8_t volt_v = pd_volt / 1000; // 转成V(5000mV→5V)
volt_hex = volt_v - 5; // 5V对应0,20V对应15(0xF)
} else {
#if PRO_TEST_DEBUG
#if NORTH_SINK_DEBUG
rt_kprintf("AFC VOLT ERROR VOLT=:%d mV Set 5000~20000\n", pd_volt);
#endif
return -1;
@@ -140,9 +140,11 @@ int sink_fill_pd_buf(rt_uint8_t group,rt_uint8_t pd_val, rt_uint16_t pd_volt, rt
if (pd_curr >= 750 && pd_curr <= 3000) { // 电流范围:0.75A(750mA)~3.0A(3000mA)
rt_uint16_t curr_ma_step = (pd_curr - 750) / 150; // 步长150mA(0.75→1.5→...→3.0)
curr_hex = curr_ma_step; // 0.75A对应0,3.0A对应15(0xF)
#if NORTH_SINK_DEBUG
rt_kprintf("curr_ma_step = %d",curr_ma_step);
#endif
} else {
#if PRO_TEST_DEBUG
#if NORTH_SINK_DEBUG
rt_kprintf("AFC CURR ERROR%d mA SET 750~3000 \n", pd_curr);
#endif
return -1;
@@ -150,8 +152,10 @@ int sink_fill_pd_buf(rt_uint8_t group,rt_uint8_t pd_val, rt_uint16_t pd_volt, rt
// 3. 合并电压Hex(高4位)和电流Hex(低4位)→ 填充第五字节
buf[0] = (volt_hex << 4) | curr_hex;
#if NORTH_SINK_DEBUG
rt_kprintf("type: AFC(0xF9), Voltage=%d V, Current=%.2f A, volaue=0x%X\n",
pd_volt/1000, pd_curr/1000.0, buf[0]);
#endif
}
break;
// 未知类型
@@ -191,7 +195,7 @@ void chrg_roll_nor_sink_pro_set(struct chrg_switch_t *pSW)
rt_uint8_t buf[6] = {0};
sink_fill_pd_buf(pSW->sink.Pro_Group,pSW->sink.protocol,pSW->sink.pro_loadv,pSW->sink.pro_loadc,buf);
sink_set_pd(pSW->sink.protocol,buf);
#if DEBUG_NORTH
#if NORTH_SINK_DEBUG
rt_kprintf("set_pro\r\n");
#endif
}
@@ -200,76 +204,104 @@ void chrg_roll_nor_sink_pro_set(struct chrg_switch_t *pSW)
void chrg_roll_nor_source_pro_set(struct chrg_switch_t *pSW){
source_set_pro(pSW->source.protocol,pSW);
}
static int chrg_roll_nor_parse (struct chrg_rollnor_t *pROLL, rt_uint8_t *data)
/*****************************************************************
函数名称: chrg_roll_nor_expected_cmd
函数描述: 根据当前角色和sub状态取得本次北向请求期望的回码命令
输入参数: pSW:当前通道控制结构体
输出参数: -
返回说明: 非0:期望命令码 0:当前状态没有可识别的北向请求
其它说明: 必须在chrg_roll_nor_set推进sub之前调用,确保设置命令的回码
能够与实际发送命令对应
*****************************************************************/
static rt_uint8_t chrg_roll_nor_expected_cmd(const struct chrg_switch_t *pSW)
{
if ((RT_NULL == pROLL)||(RT_NULL == data)) {
return -1;
if (pSW == RT_NULL) {
return 0;
}
chrg_north_switch(IDX_NOR_CH1);
// 读取北向全局结构体中当前通道的Source/Sink参数
struct chrg_switch_t *pSW = &chrgnorth.sw[pROLL->ch];
if (1 == pROLL->type) {
switch (pROLL->sub) {
case IDX_GET_SOURCE_VC: {
}
break;
case IDX_GET_SOURCE_PD: {
}
break;
case IDX_SET_SOURCE_PD: {
}
break;
case IDX_SET_SOURCE_CCLVL: {
}
break;
if (pSW->id == ID_SOURCE) {
switch (pSW->sub) {
case IDX_GET_SOURCE_VC:
return SRC_CMD_GET_VOLTAGE;
case IDX_GET_SOURCE_PD:
return SRC_CMD_GET_PROTOCOL;
case IDX_SET_SOURCE_PD:
return SRC_CMD_SET_PROTOCOL;
case IDX_SET_SOURCE_CC_SET:
return SRC_CMD_SET_CC_CHOOSE;
case IDX_SET_SOURCE_CCLVL:
return SRC_CMD_SET_CC_LEVEL;
default:
return -1;
break;
return 0;
}
}
} else if (0 == pROLL->type) {
chrg_roll_nor_sw_uart(IDX_NOR_CH1,ID_SINK);
switch (pROLL->sub) {
case IDX_GET_SINK_VC: {
sink_get_vc(pSW->sink.pro_loadv,pSW->sink.pro_loadc);
}
break;
case IDX_GET_SINK_PD: {
}
break;
case IDX_SET_SINK_PD: {
}
break;
case IDX_SET_SINK_CCLINE: {
}
break;
case IDX_SET_SINK_CCLVL: {
}
break;
if (pSW->id == ID_SINK) {
switch (pSW->sub) {
case IDX_GET_SINK_VC:
return SINK_CMD_GET_VOLTAGE;
case IDX_GET_SINK_PD:
return SINK_CMD_GET_PD;
case IDX_SET_SINK_PD:
return pSW->sink.protocol;
case IDX_SET_SINK_CCLINE:
return SINK_CMD_SET_CC;
case IDX_SET_SINK_CCLVL:
return SINK_CMD_SET_LEVEL;
default:
return -1;
return 0;
}
} else {
}
return 0;
}
/*****************************************************************
函数名称: chrg_roll_nor_handle_response
函数描述: 校验北向回码与当前请求的通道角色和命令是否匹配并分发业务解析
输入参数: pMB:已通过north.c结构及CRC校验的回码 expected_idx:请求通道
expected_id:请求角色 expected_cmd:请求命令
输出参数: 匹配的0x20量测回码会更新对应Source/Sink状态机
返回说明: 0:回码匹配并处理完成 <0:参数错误或回码与请求不匹配
其它说明: 设置命令回码只用于确认请求完成;只有21字节0x20回码进入业务解析
*****************************************************************/
static int chrg_roll_nor_handle_response(struct mb_msg_t *pMB,
rt_uint8_t expected_idx, eIDX_ID expected_id, rt_uint8_t expected_cmd)
{
struct chrg_north_t *pNOR = &chrgnorth;
struct chrg_switch_t *pSW;
if ((pMB == RT_NULL) || (pMB->payload == RT_NULL) ||
(pMB->length < MIN_FRAME_LENGTH) ||
(expected_idx >= TOTAL_NOR_CHS) || (expected_cmd == 0U)) {
return -1;
}
if ((pMB->payload[2] != (rt_uint8_t)expected_id) ||
(pMB->payload[3] != expected_cmd)) {
LOG_W("north response mismatch: ch=%d id=%02x/%02x cmd=%02x/%02x",
expected_idx + 1U, pMB->payload[2], expected_id,
pMB->payload[3], expected_cmd);
return -2;
}
if ((pMB->length != 21U) || (expected_cmd != SRC_CMD_GET_VOLTAGE)) {
return 0;
}
pSW = &pNOR->sw[expected_idx];
/* COM可能在等待回码期间切换角色;旧角色回码不得更新新角色状态。 */
if (pSW->id != expected_id) {
LOG_W("north response role changed: ch=%d old=%02x new=%02x",
expected_idx + 1U, expected_id, pSW->id);
return -3;
}
if (expected_id == ID_SOURCE) {
chrg_source_parse(pMB->payload, (eIDX_SOU_CH)expected_idx, pSW, pNOR);
} else if (expected_id == ID_SINK) {
chrg_sink_parse(pMB->payload, (eIDX_SOU_CH)expected_idx, pSW, pNOR);
}
return 0;
}
/*****************************************************************
@@ -311,7 +343,7 @@ void chrg_roll_nor_set(rt_uint8_t ch, struct chrg_switch_t *pSW,rt_uint8_t *enab
break;
case IDX_GET_SOURCE_VC:
source_get_vc(pSW->source.set_volt, pSW->source.set_curr);
pSW->sub = IDX_GET_SOURCE_PD;
//pSW->sub = IDX_GET_SOURCE_PD;
break;
case IDX_GET_SOURCE_PD:
source_get_pd();
@@ -359,7 +391,10 @@ void chrg_roll_nor_thread_entry (void *data)
}
rt_uint8_t index = 0, idx = 0, i = 0;
rt_uint8_t run = 0, crc = 0;
rt_uint8_t run = 0;
rt_uint8_t expected_idx = 0;
rt_uint8_t expected_cmd = 0;
eIDX_ID expected_id = ID_SINK;
rt_err_t ret = RT_EOK;
struct chrg_rollnor_t *pROLL = &chrgrollnor;
struct chrg_thread_t *pTN = &chrgthr[IDX_THR_NORTH];
@@ -371,6 +406,7 @@ void chrg_roll_nor_thread_entry (void *data)
}
while (1) {
chrg_wdt_feed();
expected_cmd = 0;
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
run = pROLL->run;
rt_mutex_release(pTHR->mutex);
@@ -404,6 +440,10 @@ void chrg_roll_nor_thread_entry (void *data)
chrgnorth.idx = idx;
pROLL->idx = idx;
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
/* sub会在发送函数中立即推进,因此必须在发送前保存请求上下文。 */
expected_idx = idx;
expected_id = pSW->id;
expected_cmd = chrg_roll_nor_expected_cmd(pSW);
chrg_roll_nor_set(pROLL->idx,pSW,&pNOR->enable[idx]);
rt_mutex_release(pTHR->mutex);
}
@@ -431,19 +471,16 @@ void chrg_roll_nor_thread_entry (void *data)
break;
}
ret = rt_mb_recv(pTN->mb, (rt_uint32_t *)&pMB_R, 200); // 超时 200ms
ret = rt_mb_recv(pTN->mb, (rt_uint32_t *)&pMB_R, 50); // 1kHz tick下超时约50ms
if ((RT_EOK == ret)&&(RT_NULL != pMB_R)) { // 存在返回数据
crc = calc_crc8(pMB_R->payload, pMB_R->length-1);
if (crc == pMB_R->payload[pMB_R->length-1]) { // 数据正确
if (RUN_AUTO != run) { // 恢复自动轮巡
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
pROLL->run = RUN_AUTO;
rt_mutex_release(pTHR->mutex);
} else {
chrg_roll_nor_parse(pROLL, pMB_R->payload);
}
/* north.c只会向邮箱提交已经通过结构和CRC校验的完整帧。 */
if (RUN_AUTO != run) { // 恢复自动轮巡
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
pROLL->run = RUN_AUTO;
rt_mutex_release(pTHR->mutex);
} else {
LOG_E("crc failed.");
(void)chrg_roll_nor_handle_response(pMB_R, expected_idx,
expected_id, expected_cmd);
}
if (RT_NULL != pMB_R->payload) {
@@ -456,7 +493,7 @@ void chrg_roll_nor_thread_entry (void *data)
pMB_R = RT_NULL;
}
rt_thread_mdelay(20); // 间隔 200ms
rt_thread_mdelay(10); // 相邻北向请求间隔50ms
} else {
if (RUN_AUTO != run) { // 非自动轮巡
rt_mutex_take(pTHR->mutex, RT_WAITING_FOREVER);
@@ -465,9 +502,7 @@ void chrg_roll_nor_thread_entry (void *data)
rt_mutex_release(pTHR->mutex);
}
}
}
}
#if 1
+8 -1
View File
@@ -159,6 +159,9 @@ int chrg_south_send (rt_uint8_t *data, rt_size_t length)
struct chrg_tty_t *pTTY = chrgsouth.tty;
if (RT_NULL != pTTY) {
#if SOUTH_FRAME_DEBUG
LOG_HEX("sendS", 32, data, length);
#endif
ret = chrg_tty_send(pTTY, data, length);
}
return ret;
@@ -185,7 +188,9 @@ static int chrg_south_frame_head (struct rt_ringbuffer *rb, rt_uint8_t *head, eI
len_rb = rt_ringbuffer_data_len(rb);
if (len_rb < MB_ACK_HEAD_SIZE) { // 帧头3字节
#if SOUTH_FRAME_DEBUG
rt_kprintf("len_rb=:%d",len_rb);
#endif
return -1;
}
@@ -456,7 +461,9 @@ void chrg_south_thread_entry (void *data)
continue;
}
//LOG_HEX("recvS", 32, pSOU->rx_buf, len);
#if SOUTH_FRAME_DEBUG
LOG_HEX("recvS", 32, pSOU->rx_buf, len);
#endif
chrg_south_pickup_frame(pSOU->rb, &pSOU->frame);
}
+6 -3
View File
@@ -150,9 +150,12 @@ int chrg_eload_read_regs (rt_uint8_t addr, rt_uint16_t reg, rt_uint16_t len)
u16_to_u8v(value, &buf[4]);
crc = mb_crc16(buf, 6);
u16_to_u8v(swap_u16(crc), &buf[6]);
rt_kprintf("addr = %d,reg = %02x,value = %02x\n",addr,reg,value);
return chrg_south_send(buf, 8);
}
#if SOUTH_COMMAND_DEBUG
rt_kprintf("south write: addr=%d reg=0x%04x value=0x%04x\n",
addr, reg, value);
#endif
return chrg_south_send(buf, 8);
}
/*****************************************************************
函数名称: chrg_eload_send_ymodem_data
@@ -76,7 +76,7 @@ int chrg_north_pkg_decode (rt_uint8_t *data, rt_uint16_t length, struct chrg_swi
struct get_vol_ack_t *pAck = (struct get_vol_ack_t *)data;
pS->vc.voltage = pAck->voltage;
pS->vc.version = pAck->version;
// ?
//
}
break;
+41 -22
View File
@@ -33,6 +33,9 @@ static int chrg_source_work_running(eIDX_SOU_CH idx,
int chrg_source_init_submit(rt_uint8_t idx, struct chrg_switch_t *pSW)
{
/* Source启动参数一次入队,最后发送WORK_START使功率板开始输出。 */
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
return -1;
}
rt_uint16_t regs[5] = {
REG_ELOAD,
REG_MODE,
@@ -48,9 +51,6 @@ int chrg_source_init_submit(rt_uint8_t idx, struct chrg_switch_t *pSW)
WORK_START
};
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
return -1;
}
return chrg_sou_com_batch_submit(idx, regs, vals, 5);
}
@@ -134,7 +134,8 @@ static int chrg_source_work_running(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
输入参数: idx:南向功率通道编号 pSW:当前通道控制结构体
输出参数: 清除目标电压、运行、使能和在线标志,关闭北向继电器
返回说明: 0:停止成功 非0:停止命令提交失败
其它说明: 先写电压0再发送WORK_STOP;只有整批命令入队成功后才清零set_volt
其它说明: 依次关闭功率板两路继电器、清零电压并发送WORK_STOP;
只有整批命令入队成功后才清零set_volt
*****************************************************************/
static int chrg_source_work_stop(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
{
@@ -142,11 +143,11 @@ static int chrg_source_work_stop(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
struct chrg_north_t *pNOR = &chrgnorth;
int ret;
rt_uint16_t regs[2] = {REG_VOLTAGE_OUT + 1, REG_WORK};
rt_uint16_t vals[2] = {0, WORK_STOP};
rt_uint16_t regs[3] = {REG_REL_ON, REG_VOLTAGE_OUT + 1, REG_WORK};
rt_uint16_t vals[3] = {ALL_REL_OFF, 0, WORK_STOP};
/* 电压清零与停止必须保持顺序,避免下次启动继承旧目标而产生过压。 */
ret = chrg_sou_com_batch_submit(idx, regs, vals, 2);
/* 先断开两路功率继电器,再清零输出并停止,避免关机瞬间继续向外供电。 */
ret = chrg_sou_com_batch_submit(idx, regs, vals, 3);
if (ret != 0) {
return ret;
}
@@ -304,11 +305,13 @@ int source_set_cc_choose (rt_uint8_t cc_set)
data[0] = cc_set;
chrg_north_pkg_encode(ID_SOURCE, SRC_CMD_SET_CC_CHOOSE, data, 1, frame, &len);
rt_kprintf("\n");
for(int i=0;i<len;i++){
rt_kprintf("%d ");
#if NORTH_SOURCE_DEBUG
rt_kprintf("source set cc frame:");
for (int i = 0; i < len; i++) {
rt_kprintf(" %02x", frame[i]);
}
rt_kprintf("\n");
#endif
return chrg_north_send(frame, len);
}
@@ -326,9 +329,13 @@ rt_uint8_t parse_mulit_gear_One(rt_uint16_t min_volt_mv,rt_uint16_t max_volt_mv,
Pro_Group_VCMM[0][4] = (max_volt_mv >> 8) & 0xFF; // vmax_H
Pro_Group_VCMM[0][5] = max_volt_mv & 0xFF; // vmax_L
Pro_Group_VCMM[0][6] = (max_curr_ma >> 8) & 0xFF; // cur_set_H
#if NORTH_SOURCE_DEBUG
rt_kprintf("H_C=%02x",Pro_Group_VCMM[0][6]);
#endif
Pro_Group_VCMM[0][7] = max_curr_ma & 0xFF; // cur_set_L
#if NORTH_SOURCE_DEBUG
rt_kprintf("L_C=%02x\n",Pro_Group_VCMM[0][7]);
#endif
return 0;
}
@@ -360,12 +367,12 @@ void parse_power_single_gear(rt_uint8_t protoCmd, rt_uint8_t *pData, rt_uint16_t
// rt_kprintf("%0x",pData[i]);
// }
// rt_kprintf("\n");
#if PRO_TEST_DEBUG
#if NORTH_SOURCE_DEBUG
rt_kprintf("one_gear");
rt_kprintf("min_volt_mv = %d\n",min_volt_mv);
rt_kprintf("max_volt_mv = %d\n",max_volt_mv);
rt_kprintf("prtect_curr= %04x",*protect_curr);
#endif
#endif
*pro_gear_idx = 1; // 单档协议固定1
// 按协议命令码赋值
switch (protoCmd)
@@ -472,7 +479,7 @@ void parse_pd_11group_pdo(rt_uint8_t *pdoData, rt_uint8_t pdo_group_num) {
// 电流/功率拆分
Pro_Group_VCMM[i][6] = (cur_power >> 8) & 0xFF; // cur_set_H
Pro_Group_VCMM[i][7] = cur_power & 0xFF; // cur_set_L
#if PRO_TEST_DEBUG
#if NORTH_SOURCE_DEBUG
// 调试打印
rt_kprintf("max_H=%d",Pro_Group_VCMM[i][4]);
rt_kprintf("max_L=%d",Pro_Group_VCMM[i][5]);
@@ -513,9 +520,13 @@ void parse_power_pdo_gear(rt_uint8_t protoCmd, rt_uint8_t *pData, rt_uint16_t re
rt_int16_t comp_volt_mv = 0; // 补偿电压(mV)
// 数据区索引:0=状态+通道,1=CC线,2=恒压恒流模式,3=PDO组数(bit12-15)
#if NORTH_SOURCE_DEBUG
rt_kprintf("pdata=%04x",pData[3]);
#endif
pdo_group_num = (pData[3] >> 4) & 0x0F; // Bit12-15提取组数
#if NORTH_SOURCE_DEBUG
rt_kprintf("num=%d\n",pdo_group_num);
#endif
*pro = PRO_PD0PSS;
*pro_gear_idx = pdo_group_num;
// 解析11组PDO(小端序,44字节)
@@ -524,9 +535,9 @@ void parse_power_pdo_gear(rt_uint8_t protoCmd, rt_uint8_t *pData, rt_uint16_t re
// 解析保留字段(20字节) + 保护电流 + 补偿电压
*protect_ma = u8v_to_u16(&pData[4 + 44 + 20]); // 67-68字节
comp_volt_mv = (rt_int16_t)u8v_to_u16(&pData[4 + 44 + 22]); // 69-70字节
// #if PRO_TEST_DEBUG
#if NORTH_SOURCE_DEBUG
rt_kprintf("project_curr=%d mA, add_volt=%d mV\n", *protect_ma, comp_volt_mv);
// #endif.
#endif
}
/*****************************************************************
@@ -614,7 +625,7 @@ rt_uint8_t parse_mulit_gear_more(rt_uint8_t *pData, rt_uint8_t gear_num) {
Pro_Group_VCMM[i][5] = vmax_mv & 0xFF; // vmax_L
Pro_Group_VCMM[i][6] = (cur_power >> 8) & 0xFF; // cur_set_H
Pro_Group_VCMM[i][7] = cur_power & 0xFF; // cur_set_L
#if PRO_TEST_DEBUG
#if NORTH_SOURCE_DEBUG
// 调试打印
rt_kprintf("parse_mulit_gear_pd0 PDO[%d]:rc=0x%02X, pps=0x%02X,V_Min=%dmV,V_MAX=%dmV,C/P=%d\n",
i, Pro_Group_VCMM[i][0], Pro_Group_VCMM[i][1], vmin_mv, vmax_mv, cur_power);
@@ -649,7 +660,9 @@ void parse_multi_gear_more(rt_uint8_t protoCmd, rt_uint8_t *pData, rt_uint16_t r
return;
}
*pro_gear_idx = gear_num;
#if NORTH_SOURCE_DEBUG
rt_kprintf("pro_gear_idx = %d\n",gear_num);
#endif
// 解析保护电流和补偿电压(不同协议偏移不同)
switch (protoCmd)
{
@@ -668,7 +681,7 @@ void parse_multi_gear_more(rt_uint8_t protoCmd, rt_uint8_t *pData, rt_uint16_t r
}
*protect_ma = u8v_to_u16(&pData[4 + 16]); // 19-20字节
comp_volt_mv = (rt_int16_t)u8v_to_u16(&pData[4 + 18]);
#if PRO_TEST_DEBUG
#if NORTH_SOURCE_DEBUG
for(int i = 0;i<30;i++){
rt_kprintf("data[%d]=%02x",i,pData[i]);
}
@@ -730,7 +743,7 @@ rt_uint8_t parse_ufcs_gear_more(rt_uint8_t *pData, rt_uint8_t gear_num) {
Pro_Group_VCMM[i][5] = vmax_mv & 0xFF;
Pro_Group_VCMM[i][6] = (cur_ma >> 8) & 0xFF;
Pro_Group_VCMM[i][7] = cur_ma & 0xFF;
#if PRO_TEST_DEBUG
#if NORTH_SOURCE_DEBUG
// ================= 打印格式 =================
rt_kprintf("parse_ufcs_gear_more PDO[%d]:PPS/AVS,V_Min=%dmV,V_MAX=%dmV,Max_Current=%dmA\n",
i, vmin_mv, vmax_mv, cur_ma);
@@ -774,10 +787,10 @@ void parse_power_ufcs(rt_uint8_t *pData, rt_uint16_t reqLen, uint8_t *pro_gear_i
// rt_kprintf("data[%d]=%02x",i,pData[i]);
// }
comp_volt_mv = 0;//(rt_int16_t)u8v_to_u16(&pData[3 + 14]);
//#if PRO_TEST_DEBUG
#if NORTH_SOURCE_DEBUG
rt_kprintf("parse_power_ufcs:gear=%d,protect=%dmA,comp=%dmV\n",
gear_num,*protect_ma, comp_volt_mv);
//#endif
#endif
// 调用下面的循环解析
parse_ufcs_gear_more(&pData[4], gear_num);
@@ -1094,7 +1107,13 @@ int source_set_pro(rt_uint8_t pro, struct chrg_switch_t *pSW)
idx += fill_len;
send_len = idx; // 总填充字节数
chrg_north_pkg_encode(ID_SOURCE, SRC_CMD_SET_PROTOCOL, data, send_len, frame, &len);
rt_kprintf("idx = %d ",idx);
#if NORTH_SOURCE_DEBUG
rt_kprintf("source protocol frame:");
for (rt_uint16_t i = 0; i < len; i++) {
rt_kprintf(" %02x", frame[i]);
}
rt_kprintf("\n");
#endif
// for(rt_uint8_t i=0;i<idx;i++){
// rt_kprintf("%02x",data[i]);
// }
+6 -6
View File
@@ -75,12 +75,12 @@ rt_uint16_t mb_crc16 (rt_uint8_t *pucFrame, rt_uint16_t usLen)
rt_uint8_t ucCRCLo = 0xFF;
int iIndex;
if(usLen==8){
for(int i = 0;i<usLen;i++){
rt_kprintf("%02x ",pucFrame[i]);
}
rt_kprintf("\n");
}
// if(usLen==8){
// for(int i = 0;i<usLen;i++){
// rt_kprintf("%02x ",pucFrame[i]);
// }
// rt_kprintf("\n");
// }
while ( usLen-- ) {
iIndex = ucCRCLo ^ *(pucFrame++);
+5 -5
View File
@@ -443,16 +443,16 @@
<Group>
<GroupName>Applications/thread</GroupName>
<Files>
<File>
<FileName>chrg_roll_nor.c</FileName>
<FileType>1</FileType>
<FilePath>applications\thread\chrg_roll_nor.c</FilePath>
</File>
<File>
<FileName>chrg_north.c</FileName>
<FileType>1</FileType>
<FilePath>applications\thread\chrg_north.c</FilePath>
</File>
<File>
<FileName>chrg_roll_nor.c</FileName>
<FileType>1</FileType>
<FilePath>applications\thread\chrg_roll_nor.c</FilePath>
</File>
<File>
<FileName>chrg_south.c</FileName>
<FileType>1</FileType>
+21
View File
@@ -0,0 +1,21 @@
*** Using Compiler 'V6.16', folder: 'D:\keil mdk 2\ARM\ARMCLANG\Bin'
Build target 'chrg'
compiling chrg_vcom.c...
compiling chrg_north_pkg.c...
compiling chrg_thread.c...
compiling chrg_lcd.c...
compiling chrg_sink.c...
compiling chrg_rel.c...
compiling chrg_eload.c...
compiling chrg_south.c...
compiling chrg_roll_nor.c...
compiling chrg_north.c...
compiling chrg_source.c...
compiling chrg_roll_sou.c...
compiling chrg_comm.c...
linking...
Program Size: Code=142248 RO-data=15232 RW-data=9304 ZI-data=16016
FromELF: creating hex file...
After Build - User command #1: fromelf --bin .\build\keil\Obj\chrg.axf -o build/chrg.bin
".\build\keil\Obj\chrg.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:01