diff --git a/apps/chrg/applications/thread/chrg_comm.c b/apps/chrg/applications/thread/chrg_comm.c index 9f46ba8..9fbce17 100644 --- a/apps/chrg/applications/thread/chrg_comm.c +++ b/apps/chrg/applications/thread/chrg_comm.c @@ -221,6 +221,16 @@ static eMBException mb_error (eMBErrorCode eErrorCode) } //extern eMBErrorCode Modbus_Protocal_Set(rt_uint16_t Role_value,rt_uint16_t src,rt_uint16_t pps,rt_uint16_t pro_value,rt_uint16_t volt_value,rt_uint16_t curr_value); +/***************************************************************** +函数名称: mb_reg_input_cb +函数描述: Modbus输入寄存器读取回调函数 +输入参数: pucRegBuffer:输入寄存器返回数据缓冲区 + usAddress:输入寄存器起始地址 + usNRegs:需要读取的输入寄存器数量 +输出参数: pucRegBuffer:按Modbus高字节在前格式填充寄存器数据 +返回说明: MB_ENOERR:读取成功 MB_ENOREG:地址范围错误 +其它说明: 只读usRegInBuf,不处理写操作;每个输入寄存器转换为两个字节 +*****************************************************************/ eMBErrorCode mb_reg_input_cb (rt_uint8_t *pucRegBuffer, rt_uint16_t usAddress, rt_uint16_t usNRegs) { eMBErrorCode eStatus = MB_ENOERR; @@ -566,11 +576,12 @@ eMBException funcReadHoldingRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen, /***************************************************************** 函数名称: funcReadInputRegister -函数描述: 读输入寄存器 +函数描述: 处理Modbus功能码0x04,读取输入寄存器 输入参数: reqFrame: 请求数据 reqLen: 请求长度 resFrame:响应数据 resLen:响应长度 -输出参数: - -返回说明: - -其它说明: - +输出参数: resFrame:输入寄存器响应帧 resLen:响应帧长度 +返回说明: MB_EX_NONE:读取成功 其他:Modbus异常码 +其它说明: 请求地址和数量校验方式与功能码0x03保持一致;输入寄存器 + 数据从usRegInBuf读取,响应数据按高字节在前返回 *****************************************************************/ eMBException funcReadInputRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen, rt_uint8_t *resFrame, rt_uint16_t *resLen) @@ -594,13 +605,14 @@ eMBException funcReadInputRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen, resFrame[1] = MB_READ_INPUT_REGISTER; resFrame[2] = cntReg * 2; - eRegStatus = mb_reg_discrete_cb(&resFrame[3], regAddress, cntReg); + eRegStatus = mb_reg_input_cb(&resFrame[3], regAddress, cntReg); if (eRegStatus != MB_ENOERR) { eStatus = mb_error(eRegStatus); } else { *resLen = 3+cntReg*2; } + rt_kprintf("------COM READ INPUT addr=%d count=%d-------\n", regAddress, cntReg); return eStatus; } @@ -801,6 +813,7 @@ typedef struct { } SrcProtoMap_t; static const SrcProtoMap_t src_proto_map[] = { + {0x20, PRO_NONE}, // 标准协议(无快充) {0x2A, PRO_PD0PSS}, // PD {0x22, PRO_FCP}, // FCP {0x23, PRO_SCPB}, // SCPB diff --git a/apps/chrg/applications/thread/chrg_north.c b/apps/chrg/applications/thread/chrg_north.c index ea4f291..68b78b0 100644 --- a/apps/chrg/applications/thread/chrg_north.c +++ b/apps/chrg/applications/thread/chrg_north.c @@ -28,100 +28,133 @@ #define SOURCE_VOLT_RETRY_FRAMES 3U /***************************************************************** -函数名称: chrg_source_standard_output -功能描述: 南向功率源标准输出控制函数 -函数描述: 根据CV标志位,分别设置电源输出电压或输出电流,实现标准模式下的恒压/恒流输出 -输入参数: - idx :功率通道编号 - pSW :北向通道控制结构体指针,包含电压/电流设定值、CV控制标志等参数 -输出参数: - pSW :更新CV控制标志位 -返回说明: 无返回值 +函数名称: chrg_source_voltage_control +函数描述: 统一处理Source目标电压、误差判断和状态机切换 +输入参数: idx:当前通道 pSW:通道控制结构体 volt_mv:目标电压(mV) + curr_ma:目标电流(mA) +输出参数: 更新source.vc及source.work_mode +返回说明: 0:状态处理成功 <0:参数错误或命令提交失败 +其它说明: 目标电压变化时立即进入RUNING;实际电压与目标值的绝对误差 + 小于等于200mV时进入WAIT;连续3次超过误差范围时重发 *****************************************************************/ -void chrg_source_standard_output(eIDX_SOU_CH idx, struct chrg_switch_t *pSW) +static int chrg_source_voltage_control(eIDX_SOU_CH idx, + struct chrg_switch_t *pSW, + rt_uint16_t volt_mv, + rt_uint16_t curr_ma) { - if(pSW->source.Set_CV_Flag) { - chrg_set_sou_reg((eIDX_SOU_CH)idx, REG_VOLTAGE_OUT+1, pSW->source.max_vol); -#if DEBUG_NORTH - rt_kprintf("Volt_Set%d\r\n",pSW->source.vc.set_voltage); -#endif - pSW->source.Set_CV_Flag = 1; - pSW->change_flag = 0; - } -} - -/***************************************************************** -函数名称: chrg_source_parse -函数描述: 解析北向电源板电压电流回码并驱动Source状态机 -输入参数: frame_data:完整北向回码 idx:当前通道 pSW:通道控制结构体 - pNOR:北向总控结构体 -输出参数: 更新电压、电流、source.work_mode及电压重试计数 -返回说明: - -其它说明: frame_data[4~7]为实测值,[8~11]为协议协商目标值; - 新目标立即进入RUNING;实际误差连续3帧超过200mV时重发 -*****************************************************************/ -void chrg_source_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx, - struct chrg_switch_t *pSW, struct chrg_north_t *pNOR) -{ - rt_uint16_t volt_mv; - rt_uint16_t curr_ma; rt_uint16_t volt_error; static rt_uint16_t last_volt_mv[TOTAL_SOU_CHS] = {0}; static rt_uint8_t last_volt_valid[TOTAL_SOU_CHS] = {0}; + static rt_uint8_t last_protocol[TOTAL_SOU_CHS] = {0}; static rt_uint8_t volt_retry_count[TOTAL_SOU_CHS] = {0}; rt_bool_t need_set = RT_FALSE; int ret; - if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL) || - (frame_data == RT_NULL)) { - return; + if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) { + return -1; } - volt_mv = (frame_data[8] << 8) | frame_data[9]; - curr_ma = (frame_data[10] << 8) | frame_data[11]; - /* 保存北向协议板返回的实测值和协商目标值。 */ + + /* 保存本次目标值,RUNING状态只使用其中的目标电压下发命令。 */ pSW->source.vc.set_voltage = volt_mv; pSW->source.vc.set_current = curr_ma; if (!pSW->source.On_Flag) { - /* 关机后清除历史值,确保下次启动至少下发一次目标电压。 */ + /* 关机后清除历史缓存,下一次启动必须重新设置目标电压。 */ last_volt_valid[idx] = 0; volt_retry_count[idx] = 0; - return; + return 0; } - /* 使用绝对误差,避免无符号减法在实际电压较小时发生下溢。 */ + /* 使用绝对误差,避免实际电压低于目标值时发生无符号下溢。 */ volt_error = (pSW->Now_voltage >= volt_mv) ? (pSW->Now_voltage - volt_mv) : (volt_mv - pSW->Now_voltage); - if (!last_volt_valid[idx] || (volt_mv != last_volt_mv[idx])) { - /* 首次设置或目标变化,立即进入RUNING下发新电压。 */ + if (!last_volt_valid[idx] || + (last_protocol[idx] != (rt_uint8_t)pSW->source.protocol) || + (volt_mv != last_volt_mv[idx])) { + /* 首次设置、协议切换或目标变化时立即下发新电压。 */ need_set = RT_TRUE; } else if (volt_error <= SOURCE_VOLT_ERROR_MV) { - /* 实际电压已进入允许范围,清除连续失败计数。 */ + /* 实际电压误差不超过200mV即可视为设置成功。 */ volt_retry_count[idx] = 0; } else { /* 给功率板三个反馈周期的稳定时间,避免每帧重复写电压。 */ if (volt_retry_count[idx] < SOURCE_VOLT_RETRY_FRAMES) { volt_retry_count[idx]++; } - if (volt_retry_count[idx] >= SOURCE_VOLT_RETRY_FRAMES) { need_set = RT_TRUE; } } - /* 解析函数只决定状态,具体寄存器操作仍由Source状态机执行。 */ pSW->source.work_mode = need_set ? SOURCE_WORK_RUNING : SOURCE_WORK_WAIT; - ret = chrg_source_work_state(idx, pSW); if ((ret == 0) && need_set) { - /* 成功入队后更新缓存;重发成功后重新开始计算连续超差帧数。 */ + /* 只有命令成功提交后才更新缓存,失败时下一次继续重试。 */ last_volt_mv[idx] = volt_mv; + last_protocol[idx] = (rt_uint8_t)pSW->source.protocol; last_volt_valid[idx] = 1; volt_retry_count[idx] = 0; } + + return ret; +} + +/***************************************************************** +函数名称: chrg_source_standard_output +函数描述: 使用COM配置值驱动标准协议电源输出 +输入参数: idx:当前通道 pSW:通道控制结构体 +输出参数: 更新source.vc及source.work_mode +返回说明: 无返回值 +其它说明: 外部协议值0x20映射为PRO_NONE;本函数不解析北向协议返回 + 数据,目标电压和保护电流直接使用COM配置值 +*****************************************************************/ +void chrg_source_standard_output(eIDX_SOU_CH idx, struct chrg_switch_t *pSW) +{ + if (pSW == RT_NULL) { + return; + } + + (void)chrg_source_voltage_control(idx, pSW, + pSW->source.max_vol, pSW->source.protective_curr); +} + +/***************************************************************** +函数名称: chrg_source_parse +函数描述: 按电源协议类型处理目标电压并驱动Source状态机 +输入参数: frame_data:完整北向回码 idx:当前通道 pSW:通道控制结构体 + pNOR:北向总控结构体 +输出参数: 更新电压、电流、source.work_mode及电压重试计数 +返回说明: - +其它说明: 标准协议不解析frame_data,直接使用COM配置值;快充协议读取 + frame_data[8~11]中的协商目标值。新目标立即进入RUNING, + 实际误差连续3帧超过200mV时重发 +*****************************************************************/ +void chrg_source_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx, + struct chrg_switch_t *pSW, struct chrg_north_t *pNOR) +{ + rt_uint16_t volt_mv; + rt_uint16_t curr_ma; + + if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) { + return; + } + + /* 标准协议使用COM设定值,不读取北向协议返回帧。 */ + if (pSW->source.protocol == PRO_NONE) { + chrg_source_standard_output(idx, pSW); + return; + } + + if (frame_data == RT_NULL) { + return; + } + volt_mv = (frame_data[8] << 8) | frame_data[9]; + curr_ma = (frame_data[10] << 8) | frame_data[11]; + /* 快充只负责解析北向协商结果,后续控制逻辑与标准协议共用。 */ + (void)chrg_source_voltage_control(idx, pSW, volt_mv, curr_ma); } /***************************************************************** @@ -138,7 +171,7 @@ void chrg_source_setting(rt_uint8_t *frame_data, eIDX_SOU_CH idx, { //执行输出调整 if (pSW->source.On_Flag == 1) { - if(pSW->source.protocol==0x00){//标准下输出设定值 + if(pSW->source.protocol == PRO_NONE){//标准下输出设定值 chrg_source_standard_output(idx, pSW); } else{ //快充部分按协商结果输出 @@ -258,7 +291,6 @@ struct chrg_north_t chrgnorth = { .id = ID_SINK, // 初始为负载模式 .source = { // 电源侧参数初始化 .On_Flag = 0, // 启动标志初始关闭 - .Set_CV_Flag = 1, // 启停控制初始置1 .work_mode = SOURCE_WORK_WAIT, // 上电保持等待,禁止自动执行Source INIT }, // 关键:补充逗号分隔source和sink .sink = { @@ -276,7 +308,6 @@ struct chrg_north_t chrgnorth = { .change_flag = 0, .source = { .On_Flag = 0, - .Set_CV_Flag = 1, .work_mode = SOURCE_WORK_WAIT, // 上电保持等待,禁止自动执行Source INIT }, .sink = { @@ -293,7 +324,6 @@ struct chrg_north_t chrgnorth = { .change_flag = 0, .source = { .On_Flag = 0, - .Set_CV_Flag = 1, .work_mode = SOURCE_WORK_WAIT, // 上电保持等待,禁止自动执行Source INIT }, .sink = { @@ -310,7 +340,6 @@ struct chrg_north_t chrgnorth = { .change_flag = 0, .source = { .On_Flag = 0, - .Set_CV_Flag = 1, .work_mode = SOURCE_WORK_WAIT, // 上电保持等待,禁止自动执行Source INIT }, .sink = { diff --git a/apps/chrg/applications/utils/chrg_regs.h b/apps/chrg/applications/utils/chrg_regs.h index 635a128..c18391e 100644 --- a/apps/chrg/applications/utils/chrg_regs.h +++ b/apps/chrg/applications/utils/chrg_regs.h @@ -93,60 +93,17 @@ enum { TOTAL_COIL_REGS // ̵24 }; -#define TOTAL_INPUT_CH_REGS (10) // ͨ Ĵ - +#define TOTAL_INPUT_CH_REGS (50) // ͨĴַͨΪ50 +#define TOTAL_INPUT_REGS TOTAL_INPUT_CH_REGS * 4 // Ĵб +// ÿͨռ50ַǰʵʹǰ4ĴַԤ enum { INPUT_REG_CH0_STA1 = INPUT_REG_START, // ͨ0 ״̬1 ͬԴ INPUT_REG_CH0_STA2, // ͨ0 ״̬2 ͬԴ INPUT_REG_CH0_FAULT1, // ͨ0 ״̬1 ͬԴ - INPUT_REG_CH0_FAULT2, // ͨ0 ״̬2 ͬԴ - INPUT_REG_04, // Ĵ04 - INPUT_REG_05, // Ĵ05 - INPUT_REG_06, // Ĵ06 - INPUT_REG_07, // Ĵ07 - INPUT_REG_08, // Ĵ08 - INPUT_REG_09, // Ĵ09 - // add more TOTAL_INPUT_CH_REGS - - INPUT_REG_CH1_STA1, // ͨ1 ״̬1 - INPUT_REG_CH1_STA2, // ͨ1 ״̬2 - INPUT_REG_CH1_FAULT1, // ͨ1 ״̬1 - INPUT_REG_CH1_FAULT2, // ͨ1 ״̬2 - INPUT_REG_14, // Ĵ14 - INPUT_REG_15, // Ĵ15 - INPUT_REG_16, // Ĵ16 - INPUT_REG_17, // Ĵ17 - INPUT_REG_18, // Ĵ18 - INPUT_REG_19, // Ĵ19 - - INPUT_REG_CH2_STA1, // ͨ2 ״̬1 - INPUT_REG_CH2_STA2, // ͨ2 ״̬2 - INPUT_REG_CH2_FAULT1, // ͨ2 ״̬1 - INPUT_REG_CH2_FAULT2, // ͨ2 ״̬2 - INPUT_REG_24, // Ĵ24 - INPUT_REG_25, // Ĵ25 - INPUT_REG_26, // Ĵ26 - INPUT_REG_27, // Ĵ27 - INPUT_REG_28, // Ĵ28 - INPUT_REG_29, // Ĵ29 - - INPUT_REG_CH3_STA1, // ͨ3 ״̬1 - INPUT_REG_CH3_STA2, // ͨ3 ״̬2 - INPUT_REG_CH3_FAULT1, // ͨ3 ״̬1 - INPUT_REG_CH3_FAULT2, // ͨ3 ״̬2 - INPUT_REG_34, // Ĵ34 - INPUT_REG_35, // Ĵ35 - INPUT_REG_36, // Ĵ36 - INPUT_REG_37, // Ĵ37 - INPUT_REG_38, // Ĵ38 - INPUT_REG_39, // Ĵ39 - INPUT_REG_40, // Ĵ40 - - - TOTAL_INPUT_REGS // Ĵ + INPUT_REG_CH0_FAULT2 // ͨ0 ״̬2 ͬԴ + }; -//AI޸ģһ׼ȷ // ======================== ¼Ĵӳ (0x06/0x10׼Modbus) ======================== // ַռ滮: // (Sink): 0x0000 + ͨš29 + ƫ (4ͨ29=116, 0x0000~0x0073) diff --git a/apps/chrg/applications/utils/chrg_sink.c b/apps/chrg/applications/utils/chrg_sink.c index aecb00f..a39b9a4 100644 --- a/apps/chrg/applications/utils/chrg_sink.c +++ b/apps/chrg/applications/utils/chrg_sink.c @@ -228,7 +228,6 @@ static int chrg_sink_nor_work_off(eIDX_SOU_CH idx, struct chrg_switch_t *pSW) } pSW->sink.On_work = 0; - pSOU->enable[idx] = 0; pSOU->online[idx] = 0; pNOR->enable[idx] = 0; diff --git a/apps/chrg/applications/utils/chrg_source.c b/apps/chrg/applications/utils/chrg_source.c index f8c8c23..7641413 100644 --- a/apps/chrg/applications/utils/chrg_source.c +++ b/apps/chrg/applications/utils/chrg_source.c @@ -135,8 +135,7 @@ static int chrg_source_work_stop(eIDX_SOU_CH idx, struct chrg_switch_t *pSW) } pSW->source.On_Flag = 0; - pSOU->enable[idx] = 0; - pNOR->enable[idx] = 0; + pNOR->enable[idx] = 0; pSOU->online[idx] = 0; chrg_nor_sw_rel((eIDX_NOR_CH)idx, 0); pSW->source.work_mode = SOURCE_WORK_WAIT; diff --git a/apps/chrg/applications/utils/chrg_source.h b/apps/chrg/applications/utils/chrg_source.h index 937b0a7..dba1737 100644 --- a/apps/chrg/applications/utils/chrg_source.h +++ b/apps/chrg/applications/utils/chrg_source.h @@ -156,7 +156,6 @@ struct chrg_src_t { rt_uint16_t protective_curr; // 保护电流 rt_uint8_t Now_State; // 当前状态 rt_uint8_t On_Flag; // 启动总标志(0/1) - rt_uint8_t Set_CV_Flag; // 电压/电流切换标志(0/1) rt_uint8_t LCD_Set_Pro_Flag; // LCD设置协议标志位 rt_uint8_t change_sink_Flag; // 从source切换到sink标志位 rt_uint8_t work_mode; diff --git a/docs/BMP4810300-4多协议可编程双向电源通信协议V_1.1.xlsx b/docs/BMP4810300-4多协议可编程双向电源通信协议V_1.1.xlsx new file mode 100644 index 0000000..7c05d2f Binary files /dev/null and b/docs/BMP4810300-4多协议可编程双向电源通信协议V_1.1.xlsx differ diff --git a/docs/south_regs.h b/docs/south_regs.h new file mode 100644 index 0000000..d535cab --- /dev/null +++ b/docs/south_regs.h @@ -0,0 +1,190 @@ +#ifndef __DigtalPower_ModbusRTU_REG_List_H__ +#define __DigtalPower_ModbusRTU_REG_List_H__ + +#include "USART1_Modbus_RTU.h" +#include "dac.h" + +#define ModbusRTU_SW_Version 0x0301; //01ǵԴţ02Ǹشţ03ǷǽԴشţ04ǽܵԴ;ֽ01ǰ汾ţV0.1 + +//ModbusRTU վַ//״̬вʾ +#define ModbusRTU_Power_Status 0x00 //R,״ָ̬ʾ00 Ԥ磻01/ֹͣ 02 03 У04 :03 03 00 00 00 01 85 E8 +#define ModbusRTU_Relay_Status 0x01 //bit0=0 ̵Ͽ bit0=1 ̵պϣbit1=0 ˲̵Ͽ bit1=1 ˲̵պ +#define ModbusRTU_Fault_Status 0x02 //״̬Ĵ +#define ModbusRTU_Flash_Status 0x03 //flash洢״̬ +#define ModbusRTU_Role_ModeFlag 0x04 //0x04 ԴָĬǵӸأ1supply2eload + +//ϼĴ +/**********************************************/ +#define F_NOERR 0x0000//޹ +#define F_SW_VIN_UVP 0x0001//Ƿѹ +#define F_SW_VIN_OVP 0x0002//ѹ +#define F_SW_VOUT_UVP 0x0004//Ƿѹ +#define F_SW_VOUT_OVP 0x0008//ѹ +#define F_SW_IOUT_OCP 0x0010// +#define F_SW_SHORT 0x0020//· +#define F_SW_OTP 0x0040//± + +//Դָ +#define ModbusRTU_PowerCmd 0x05 //05 W 0x01 0x02 ػ0x03ϸλ0xAA 洢ݵflash0xBB ָĬϲ +#define ModbusRTU_WorkMode 0x06 //06 WR 0x01 ѹ0x02 0x0304 㹦ʣ05 +#define ModbusRTU_Volt 0x07 //07-08 WR ѹ uint320.001V, 0~60V,Ĭ5VѯѹҲָ +#define ModbusRTU_Current 0x09 //09-0A WR uint32 0.001A, 0~60A,Ĭֵ1AѯѹҲָ + +#define ModbusRTU_ShortTest_VoltShort 0x0B //shortԳɹʧܣ·ֵʱĵѹ +#define ModbusRTU_ShortTest_CurrentShort 0x0C //۲Գɹʧܣ·ֵʱĵѹ +#define ModbusRTU_OCPTest_VoltOCP 0x0D //shortԳɹʧܣ·ֵʱĵѹ +#define ModbusRTU_OCPTest_CurrentOCP 0x0E //۲Գɹʧܣ·ֵʱĵѹ + +#define ModbusRTU_DUT_Vpkp 0x0F //ֵ +#define ModbusRTU_DUT_Vpkn 0x10 //⸺ֵ +#define ModbusRTU_DUT_Vpp 0x11 //ֵ +//ƲĴ +#define ModbusRTU_Ripple_Value 0x12 //ȡƲ + +#define ModbusRTU_Temp 0x1A //WR 11,ǰڲ¶ȶȡ +#define ModbusADDR_SW_Version 0x1B //10,12ַȡ汾ţ03buckboostţ01ǰ汾 +#define ModbusADDR_SlaveID_Modify 0x1C //11,13ַ,޶SlaveID + + +#define Line_Compensation 0X1D //1F 14dַ𲹳5V1mv0.001Ŵ10005000 + +#define Eload_Start_VON 0x20 //10 16Ĵ洢Ӹѹؼ⵽ѹֵΪѹſӸأ +#define Eload_Stop_Volt 0x21 //11 17Ĵ洢Ӹعرյѹ +#define Eload_Slew_Rate 0x22 //12 18Ĵ洢Ӹбʲ + +#define ModbusRTU_CPower 0x24 //36-37 ֵ +#define ModbusRTU_CResistor 0x26 //38 ֵ + +//6.3.1ԴƲ +#define ModbusRTU_VoltLimit 0x28 //0x29 40-41 0x2A 42Ĵѹֵ,Ĭ6.0V,΢6.5V +#define ModbusRTU_CurrentLimit_H 0x2A //42~43WR ֵ +#define ModbusRTU_CurrentLimit_L 0x2B //42~43WR ֵ + +#define ModbusRTU_Volt_CAL_K 0x2C //2C~2D ѹУ׼Kֵ,ŴQ16ƶ16ȥʹֽ +#define ModbusRTU_Volt_CAL_K_L 0x2D +#define ModbusRTU_Volt_CAL_B 0x2E //2E ѹУ׼Bֵ +#define ModbusRTU_Current_CAL_K 0x2F //2F-30 У׼Kֵ +#define ModbusRTU_Current_CAL_K_L 0x30 + +#define ModbusRTU_Current_CAL_B 0x31 //31 У׼Bֵ + +#define ModbusRTU_SourceCurrent_CAL_K 0x32 //32-33 У׼Kֵ +#define ModbusRTU_SourceCurrent_CAL_K_L 0x33 + +#define ModbusRTU_SourceCurrent_CAL_B 0x34 //34 У׼Bֵ + +#define ModbusRTU_SourceSink_Current_Offset 0x35 //Դĵϱoffset +//#define ModbusRTU_Sink_Current_Offset 0x33 //صĵϱoffset + +#define ModbusRTU_CALI_CRC 0x36 //У׼ƫ6УֵʹCRC16-ModbusУ飻 + + +#define ModbusRTU_CAL_WriteEnable 0x37 //ʹдFLASH´εʹǸħ0x4361 C+a +#define ModbusRTU_CAL_WriteRecovery 0x38 //ʹд0x5763 +#define ModbusRTU_CAL_ReadRecovery 0x39 //ʹܶݶǰbankУ6 + +//short +#define ModbusRTU_ShortTest_CMD_MODE_FLAG 0x40 //16λ0x0101; 01ֽڵ01ֵΪ0ͷŵ 20260601һֽڵbit7=0ǻָǰ״̬bit7=1ǽжص㣻 +#define ModbusRTU_ShortTest_Hold_Time 0x41 //λms65535ms0ͷţһʱֵDZʱ䲻䣻 +//#define ModbusRTU_ShortTest_CurrentShort 0x42 //۲Գɹʧܣ·ֵʱĵѹ + +//OCP +#define ModbusRTU_OCPTest_CMD_MODE_FLAG 0x43 //16λ0x0101; 01ֽڵ01ֵΪ0ͷŵ 20260601һֽڵbit7=0ǻָǰ״̬bit7=1ǽжص㣻 +#define ModbusRTU_OCPTest_StartCurrent 0x44 //ʼ +#define ModbusRTU_OCPTest_StopCurrent 0x45 //ֹ +#define ModbusRTU_OCPTest_StepCurrent 0x46 //ÿһĵ +#define ModbusRTU_OCPTest_Step_Hold_Time 0x47 //ÿһıʱ䣻Ĭ10msΧ1ms100ms; +#define ModbusRTU_OCPTest_Vtrig_Stop 0x48 //ﵽOCPĵѹֵ +#define ModbusRTU_OCPTest_Hold_Time 0x49 +//#define ModbusRTU_OCPTest_VoltOCP 0x49 //shortԳɹʧܣ·ֵʱĵѹ +//#define ModbusRTU_OCPTest_CurrentOCP 0x4A //۲Գɹʧܣ·ֵʱĵѹ + +//DYNA ӸصĶ̬ģʽҲж̬ػ˲̬ԡڸģʽ£ػᰴ趨бʡƵʺռձȣֵ߸غ͵͸أ֮䣬ԵԴ˲̬Ӧָʱԡ +#define ModbusRTU_DYNA_CMD_MODE_FLAG 0x4B //̬ CMD˳ ԼģʽContinuousPULSEToggleLSB8 BIT7 ·ʱĵ/㣻bit1 bit0 ɹ/ʧ +#define ModbusRTU_DYNA_L1 0x4C //̬Ե1 +#define ModbusRTU_DYNA_L2 0x4D //̬Ե2 +#define ModbusRTU_DYNA_T1 0x4E //̬Ե1ʱ +#define ModbusRTU_DYNA_T2 0x4F //̬Ե2ʱ +#define ModbusRTU_DYNA_Rise_Slew_Rate 0x50 //̬б +#define ModbusRTU_DYNA_Fall_Slew_Rate 0x51 //̬½б + + +#define ModbusRTU_DUT_ValueReset 0x5D //λֵ + +#define ModbusRTU_SYS_Reset 0x61 //ϵͳλָ쳣ѹָͨϵͳλ + +//#define ModbusRTU_Volt_Kp 0x30 //48-49 RW ѹkp +//#define ModbusRTU_Volt_Ki 0x32 //50-51WR ѹki +//#define ModbusRTU_Curr_Kp 0x34 //52-53WR kp +//#define ModbusRTU_Curr_Ki 0x36 //54-55WR ki + +//#define ModbusRTU_CP_Kp 0x38 //56-57 RW ʻkp +//#define ModbusRTU_CP_Ki 0x3A //58-59 WR ʻki +//#define ModbusRTU_CR_Kp 0x3C //60-61 WR 軷kp +//#define ModbusRTU_CR_Ki 0x3E //62-63 WR 軷ki + +//112,0x70ĴΪǰڲ¶ȶȡ㣻 + +#define ModbusRTU_TempLimit 0x71 //WR ¶ֵ +#define ModbusRTU_FANSpeed 0x72 //ٿƣλ趨Զģʽ£¶ȸһֵܣС + +#define SMU_Relay_ON 0x0001 //Դ̵ +#define SMU_EL_PB15_EMI_Bypass_ON 0x0002 //·˲̵ +//ֵĹϵY(VDAC) = K*X(I-real)+B +#define Init_OCP_VALUE 12000 //12A +// +#define K_COEFF_FWD_Q16 (9960) +#define B_Intercept_FWD (1846) +// +#define K_COEFF_REV_Q16 (-9960) +#define B_Intercept_REV (1846) + +//ṹ +//6.2.1״̬вʾ PowerStatusAndParaShow +typedef struct { + uint16_t Power_Status; + uint16_t Relay_Status; + uint16_t Fault_Status; + uint16_t Flash_Status; + uint32_t InputVolt; + uint32_t InputCurr; + uint32_t OutputVolt; + uint32_t OutputCurr; + uint32_t OutputPower; + uint16_t statusRsv1; //Ԥλ + uint16_t statusRsv2; +}S_PowerStatusAndParaShow; + +extern S_PowerStatusAndParaShow PowerStatusAndParaShow; + +//6.2.2ԴָPowerControlCmd +typedef struct{ + uint16_t PowerCmd; + uint16_t WorkMode; + uint32_t Vout; + uint32_t Iout; + uint8_t Remote_Power_ON_Flag; //ػָʾ + uint8_t Remote_Power_Reset_Flag; //λָʾ +}S_PowerControlCmd; + +extern S_PowerControlCmd PowerControlCmd; + + +//6.3.1ԴƲ +typedef struct{ + uint32_t VoutLimit; + uint32_t IoutLimit; + uint16_t DutyLimit; + uint16_t FrequnceLimit; + float VoltKp; + float VoltKi; + float CurrKp; + float CurrKi; +}S_PowerControlPara; + +extern uint8_t Power_OnOff_Flag,Power_OnOff_Flag; + +extern S_PowerControlPara PowerControlPara; +//Modbus ʼ +extern void Modbus_Para_Init(void); +#endif diff --git a/docs/副本BMP4810300-4多协议可编程双向电源通信协议V_2.0 - 副本(1).xlsx b/docs/副本BMP4810300-4多协议可编程双向电源通信协议V_2.0 - 副本(1).xlsx deleted file mode 100644 index 8307457..0000000 Binary files a/docs/副本BMP4810300-4多协议可编程双向电源通信协议V_2.0 - 副本(1).xlsx and /dev/null differ diff --git a/rt-thread/components/legacy/usb/usbdevice/core/usbdevice_core.c b/rt-thread/components/legacy/usb/usbdevice/core/usbdevice_core.c index 015473f..ab76558 100644 --- a/rt-thread/components/legacy/usb/usbdevice/core/usbdevice_core.c +++ b/rt-thread/components/legacy/usb/usbdevice/core/usbdevice_core.c @@ -2237,6 +2237,7 @@ static struct rt_thread usb_thread; /* internal of the message queue: every message is associated with a pointer, * so in order to recveive USBD_MQ_MAX_MSG messages, we have to allocate more * than USBD_MQ_MSG_SZ*USBD_MQ_MAX_MSG memory. */ +rt_align(RT_ALIGN_SIZE) static rt_uint8_t usb_mq_pool[(USBD_MQ_MSG_SZ+sizeof(void*))*USBD_MQ_MAX_MSG]; /**