NXP MCU 技术论坛
直播中

靓仔峰

10年用户 1229经验值
擅长:可编程逻辑
私信 关注
[问答]

求助,关于800V电池管理系统BJB gpio控制问题求解

我有一个问题是我想控制 BMS BJB gpio 来测试隔离测试,我的系统是 800 V 电池管理系统,s32k358 平台,33772 BJB 和 33774 CMU
软件项目是 NXP 示例项目中的 HVBMS 集成项目
有一个“hvbms_bjb_main_isomeas_gpioenable”功能可以设置 Q1、QL1 和 Opto 引脚,但我想自己控制。(我什至不知道如何使用这个功能,因为每个功能都是静态的)
以下是我尝试在运行时任务中控制这三个引脚的代码
Std_ReturnType hvbms_bjb_isomeas_controlandread(bool enable_Q1, bool enable_QL1, bool enable_Opto, float *riso_pos, float *riso_neg)
{
Std_ReturnType RetVal = E_OK;
HvBms_Bjb_AddressInformation.ChainStart = HVBMS_BJBSENSEMON_CHAIN_ID_ISO(0);
HvBms_Bjb_AddressInformation.ChainEnd = HVBMS_BJBSENSEMON_NO_OF_CHAINS_ISO;
质控 Q1
如果 (enable_q1)
{
HvBms_Bjb_AddressInformation.DeviceStart = HVBMS_BJB_AFE2;
HvBms_Bjb_AddressInformation.DeviceEnd = HVBMS_BJB_AFE2;
RetVal = HVBMS_BJB_BJBIF_SETMODE( HvBms_Bjb_AddressInformation, HvBms_BJBConfig,(uint8)HVBMS_BJB_GPIO6_DR_HIGH);
}
else
{
HvBms_Bjb_AddressInformation.DeviceStart = HVBMS_BJB_AFE2;
HvBms_Bjb_AddressInformation.DeviceEnd = HVBMS_BJB_AFE2;
RetVal = HVBMS_BJB_BJBIF_SETMODE( HvBms_Bjb_AddressInformation, HvBms_BJBConfig,(uint8)HVBMS_BJB_GPIO6_DR_LOW);
}
控件 QL1
如果 (enable_ql1)
{
HvBms_Bjb_AddressInformation.DeviceStart = HVBMS_BJB_AFE1;
HvBms_Bjb_AddressInformation.DeviceEnd = HVBMS_BJB_AFE1;
RetVal |= HVBMS_BJB_BJBIF_SETMODE( HvBms_Bjb_AddressInformation, HvBms_BJBConfig,(uint8)HVBMS_BJB_GPIO6_DR_HIGH);
}
else
{
HvBms_Bjb_AddressInformation.DeviceStart = HVBMS_BJB_AFE1;
HvBms_Bjb_AddressInformation.DeviceEnd = HVBMS_BJB_AFE1;
RetVal|=HVBMS_BJB_BJBIF_SETMODE( HvBms_Bjb_AddressInformation, HvBms_BJBConfig,(uint8)HVBMS_BJB_GPIO6_DR_LOW);
}
控制 Opto
如果 (enable_opto)
{
HvBms_Bjb_AddressInformation.DeviceStart = HVBMS_BJB_AFE1;
HvBms_Bjb_AddressInformation.DeviceEnd = HVBMS_BJB_AFE1;
RetVal |= HVBMS_BJB_BJBIF_SETMODE( HvBms_Bjb_AddressInformation, HvBms_BJBConfig,(uint8)HVBMS_bjb_gpio5_dr_high);
}
else
{
HvBms_Bjb_AddressInformation.DeviceStart = HVBMS_BJB_AFE1;
HvBms_Bjb_AddressInformation.DeviceEnd = HVBMS_BJB_AFE1;
RetVal |= HVBMS_BJB_BJBIF_SETMODE( HvBms_Bjb_AddressInformation, HvBms_BJBConfig,(uint8)HVBMS_bjb_gpio5_dr_low);
}

BJB 电流模式变为活动模式后,我尝试控制但不工作,有时 BJB 电流模式会是“HVBMS_MODE_HALT”,我不知道为什么
您有什么经验或想法可以推荐给我吗?也许 Mcal 设置需要修改?

回帖(1)

赵辉

2025-3-2 13:16:47

针对您的问题,以下是分步解决方案:




步骤 1:理解硬件寄存器配置




  1. 查阅33772数据手册

    确认Q1、QL1、Opto引脚对应的GPIO控制寄存器地址(如BJB_GPIO_CTRL)及配置位(例如BIT0控制Q1,BIT1控制QL1,BIT2控制Opto)。




  2. 确认SPI通信协议

    确保了解BJB芯片的SPI从机地址、命令格式(如16位命令字,高位为寄存器地址,低位为数据)。






步骤 2:实现GPIO控制函数




  1. 封装寄存器写入函数  


    Std_ReturnType BJB_WriteRegister(uint8_t reg_addr, uint8_t data) {
       uint16_t command = (reg_addr << 8) | data;
       return SPI_Transmit(BJB_SPI_CHANNEL, &command, 2); // 假设SPI_Transmit支持16位传输
    }



  2. 实现GPIO控制逻辑  


    Std_ReturnType hvbms_bjb_isomeas_controlandread(bool enable_Q1, bool enable_QL1, bool enable_Opto, float *riso_pos, float *riso_neg) {
       uint8_t gpio_data = 0;
       gpio_data |= (enable_Q1  ? BIT0 : 0);
       gpio_data |= (enable_QL1 ? BIT1 : 0);
       gpio_data |= (enable_Opto? BIT2 : 0);

       // 写入BJB的GPIO控制寄存器
       if (BJB_WriteRegister(BJB_GPIO_CTRL, gpio_data) != E_OK) {
           return E_NOT_OK;
       }

       // 等待GPIO稳定(例如10ms延时)
       OsTask_Delay(10);

       // 执行隔离测量(需实现具体ADC读取逻辑)
       *riso_pos = MeasureIsolationResistor(BJB_ISO_POS_CH);
       *riso_neg = MeasureIsolationResistor(BJB_ISO_NEG_CH);

       return E_OK;
    }





步骤 3:检查SPI及硬件配置




  1. 初始化SPI外设

    确认SPI_Transmit已正确配置,包括时钟极性(CPOL/CPHA)、速率(与BJB芯片匹配)。




  2. 验证片选(CS)信号

    确保BJB的片选引脚在传输时被正确拉低/拉高,例如通过GPIO控制:


    void BJB_CS_Assert(void) {
       Gpio_WritePin(BJB_CS_PIN, LOW);
    }

    void BJB_CS_Deassert(void) {
       Gpio_WritePin(BJB_CS_PIN, HIGH);
    }





步骤 4:运行时任务集成




  1. 在周期任务中调用函数

    在1ms任务中调用控制函数,传递所需GPIO状态:


    void BJB_RuntimeTask(void) {
       static bool q1_enable = false;
       float riso_pos, riso_neg;

       // 切换GPIO状态进行测试
       q1_enable = !q1_enable;
       hvbms_bjb_isomeas_controlandread(q1_enable, true, true, &riso_pos, &riso_neg);

       // 记录测量结果
       Log_IsolationValues(riso_pos, riso_neg);
    }





步骤 5:调试与验证




  1. 逻辑分析仪验证SPI波形

    检查实际发送的SPI数据是否符合预期(寄存器地址+数据)。




  2. 测量GPIO引脚电平

    使用万用表或示波器确认Q1/QL1/Opto引脚是否按预期切换。




  3. 隔离电阻合理性检查

    确保返回的riso_posriso_neg值在预期范围内(如>500Ω/V)。






可能问题排查




  • 寄存器写入失败

    检查SPI时钟速率是否过高(尝试降低至1MHz以下)。




  • GPIO无变化

    确认BJB芯片的GPIO模式寄存器(如BJB_GPIO_MODE)是否已配置为输出模式。




  • 隔离测量值异常

    检查ADC基准电压配置,确认测量电路与BJB的GPIO切换时序同步。






通过以上步骤,您应能实现对BJB GPIO的动态控制,并根据测量结果验证隔离测试功能。如需进一步优化,可添加错误重试机制或状态机管理GPIO切换序列。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分