NXP FS85 的软件设计

一、概述

        NXP 的 SBC - FS85 是一款车规级、多通道电源输出的电源集成芯片。FS85 的最大输入电压是 60V,可应用于新能源汽车的 12V 或者 24V 电源系统中。FS85可通过 I2C 或者 SPI 接口与主机通讯。主控 MCU 在运行过程中需要定时给 FS85 发送喂狗信息,通过这种方式来监测主控 MCU 是否宕机。一旦超时没有喂狗,FS85 就会认为主控 MCU 出现问题,就会立即采取一系列措施,比如产生中断信号、拉低复位管脚、断电等。

       世平集团在汽车 HVBMS 方案中,主控板上的电源管理集成芯片采用 FS85。通过这颗 IC 对电源进行管理,提高了系统的稳定性和安全性。

       在前一篇已经向大家介绍了 FS85 的硬件设计,这一篇向大家介绍 FS85 的内部启动流程和初始化过程。


二、FS85 的启动流程

        FS85 的启动分成 2 个同步的流程:Main 和 Fail-safe。在上电的过程中,FS85 在 VSUP 电压高于 6.5V 之后,首先会检查 DBG 管脚(pin48)和 WAKE1/2 管脚(pin49、pin1)的电压。

        ① 当 WAKE1 和 WAKE2 管脚都为 0V 时,FS85 仍然处在 Power Down 状态。

        ② 当 WAKE1 和 WAKE2 其中一个管脚电压升到 4V 之后,VBOS 开始上电。FS85 进入 STANDBY 状态。如果 DBG 管脚电压为 5V 时,FS85 进入 Debug 模式。

        ③ 在 main 启动流程中:FS85 进入 STANDBY 状态之后,首先等待 LBIST 自检完成,然后,开始按照顺序输出 VPRE、VBOOST、以及其他电源电压。

        ④ 在 Fail-safe 启动流程中:FS85 进入 STANDBY 状态之后,FS85 首先执行逻辑量内部自检(LBIST),LBIST 在 6ms 内检查完成。然后,开始执行模拟量内部自检 1(ABIST1)。ABIST1 的自检内容由 OTP 决定。在执行 ABIST1 完成之前,RSTB、FS0B、PGOOD 三个管脚都是 0V。如果 ABIST1 发现错误就会回到 Power Down 模式。如果 ABIST1 执行完成并无错误之后,进入 INIT_FS 状态,并且 PGOOD 和 RSTB 被释放,此时,MCU 开始运行。

        ⑤ 对于非 Debug 模式,FS85 进入 INIT_FS 状态之后,会给一个 256ms 的窗口期。而 Debug模式则没有这个窗口期。此时,PGOOD 和 RSTB 被释放,MCU 可以对 FS85 的寄存器进行操作,比如模拟量内部自检 2(ABIST2)的参数设置、看门狗时间窗口设置等。

        ⑥ 当 MCU 在 256ms 内喂一次看门狗,FS85 即可退出 INIT_FS 模式,并进入 Normal 模式。ABIST2 开始自检;并且 MCU 需要定时喂狗。

        ⑦ 如果 MCU 没有在 256ms 内喂狗,FS85 将会拉低 RSTB,10ms 之后再释放 RSTB,并持续 256ms。如果在连续释放 4 次 RSTB 之后,也就是 1s 之后,FS85 都没有被喂狗,那么,FS85 将会回到 Power Down 状态。

具体的流程图可参考 FS85 的 datasheet。


三、FS85 的初始化

        FS85 进入 INIT_FS 状态之后,MCU 可以对 FS85 内部的寄存器进行读写操作。FS85 的寄存器包含 2 个部分,分别命名为:Main 寄存器和 Fail_safe 寄存器,每个寄存器的具体说明可参考 FS85 的 datasheet。

        在 Fail_safe 寄存器中有如下几个寄存器:FS_I_OVUV_SAFE_REACTION1、FS_I_OVUV_SAFE_REACTION2、FS_I_WD_CFG、FS_I_ SAFE_INPUTS、FS_I_FSSM、FS_I_SVS、FS_WD _WINDOW,需要将数据按位取反给到相应的 NOT 寄存器中。FS85 的内部比较器会比较两个寄存器值,如果两个数值的每一位都是相应的反数,那么写寄存器的操作成功。软件可参考如下写寄存器的函数:

/* Performs a write to a single FS8x FS init register (during the INIT_FS phase only). */

fs8x_status_t FS8x_WriteRegisterInit(fs8x_drv_data_t* drvData, uint8_t address,

        uint16_t writeData)

{

    fs8x_status_t status = fs8xStatusOk;

    uint16_t writeDataInv;  /* Inverted register data. */

    uint8_t addressNot;     /* Address of _NOT_ register. */

    FS_ASSERT(drvData != NULL);

    status = FS8x_WriteRegister(drvData, true, address, writeData);

    /* _NOT_ registers has address +1 from normal register. */

    addressNot = (uint8_t)(address + 1);

    /* Inverted value should be written to _NOT_ register. */

    writeDataInv = (uint16_t)~writeData;

    status |= FS8x_WriteRegister(drvData, true, addressNot, writeDataInv);

    return status;

}

在以上寄存器中,前缀是 FS_I 的寄存器在 INIT_FS 状态中可读/写,退出 INIT_FS 状态之后,只能读操作。

在 MCU 启动之后,我们可以通过如下流程与 FS85 通讯:

        1、先通过 SPI/I2C 读取 FS_STATES 寄存器,这个寄存器可以知道 FS85 当前处于什么状态。

    /* Check Fail safe state. If 0x2006 is read, FS85 is in INIT_FS */

    FS8x_ReadRegister(fs8xDrvdata, FAILSAFE_REG, FS8X_FS_STATES_ADDR, &rxData);

    printf("Fail State REG: 0x%04x\n\r", rxData.readData);

2、如果 FS85 当前处于 INIT_FS 状态,就开始设置看门狗和 ABIST2 的参数。

       ① 设置看门狗时间窗口的寄存器是 FS_WD_WINDOW。当 FS_WD_WINDOW 寄存器中的 WDW_PERIOD[3:0] (bit 23:20) 设为 0 时,看门狗被关闭。下面的例子将看门狗周期设置为 512ms,窗口期的占空比是 50%,fault 的恢复期是 512ms。这个恢复期是当 FS85 检测到 FCCU 有错误,FS0B 为 0V 时,看门狗的周期将改为恢复期。当 FS85 接受到一个正确的喂狗之后,会从恢复期回到正常状态。

    /*

        Configure WD refresh window, default 3ms is not enough

        set WDW_RECOVERY time > WD refresh time(384ms), we use 512ms

    */

    writeValue = WD_PERIOD | FS8X_FS_WDW_DC_50 | FS8X_FS_WDW_RECOVERY_512MS;

    //writeValue = 0x020B;     // disable watchdog

    status = FS8x_WriteRegisterInit(fs8xDrvdata, FS8X_FS_WD_WINDOW_ADDR,writeValue);

② 设置 ABIST2 :即配置 FS_I_OVUV_SAFE_REACTION1 寄存器。

        ③ 设置 ABIST2 检测到错误之后的响应(IMPACT):即配置 FS_I_OVUV_SAFE_REACTION1 和 FS_I_OVUV_SAFE_REACTION2 寄存器。主要是设置将错误反映到 RSTB 和 FS0B 管脚上。可以选择:00b-RSTB 和 FS0B 管脚上都不影响;01b-只设置 FS0B 为 0V;1xb-RSTB 和 FS0B 管脚都为 0V。一般情况下,为了不影响 MCU 的正常工作,建议设置为 01b。

    /* FS_IMPACT and ABIST2 should be configured in INIT_FS

       Launch ABIST2, configure FS_I_OVUV_SAFE_REACTION1/2 before close of INIT_FS

       Suggest to reaction on FS0B only for all OV/UV fault, Do not include RSTB

       to reset MCU

       POR default: FS_I_OVUV_SAFE_REACTION1 = 0xd00d

       0x57e5: 1. VCOREMON, VMONx VDDIOMON ABIST2 enable, impact reaction: FS0B only   

    */

    writeValue = (uint16_t)0x57e5;

    status |= FS8x_WriteRegisterInit(fs8xDrvdata, FS8X_FS_I_OVUV_SAFE_REACTION1_ADDR, writeValue);

    status |= FS8x_ReadRegister(fs8xDrvdata, FAILSAFE_REG, FS8X_FS_I_OVUV_SAFE_REACTION1_ADDR, &rxData);

    printf("FS8X_FS_I_OVUV_SAFE_REACTION1_ADDR: 0x%04x\n\r", rxData.readData);

    writeValue = (uint16_t)0x5555;    // FS0B only for all OV/UV

    status |= FS8x_WriteRegisterInit(fs8xDrvdata, FS8X_FS_I_OVUV_SAFE_REACTION2_ADDR, writeValue);

    status |= FS8x_ReadRegister(fs8xDrvdata, FAILSAFE_REG, FS8X_FS_I_OVUV_SAFE_REACTION2_ADDR, &rxData);

    printf("FS8X_FS_I_OVUV_SAFE_REACTION2_ADDR: 0x%04x\n\r", rxData.readData);

       ④ 设置看门狗的错误反映条件,即配置 FS_I_WD_CFG 寄存器。当 MCU 喂狗错误一次,错误计数器加 1,当错误计数器达到设定值时,就根据 IMPACT 来反映该错误。当 MCU 正确喂狗一次,错误计数器减 1,直至错误计数器减到 0。

    // FS_I_WD_CFG, WD error impact: FS0B only

    writeValue = FS8X_FS_I_WD_RFR_LIMIT_6 | FS8X_FS_I_WD_ERR_LIMIT_6 | FS8X_FS_I_WD_FS_IMPACT_FS0B;

    status |= FS8x_WriteRegisterInit(fs8xDrvdata, FS8X_FS_I_WD_CFG_ADDR, writeValue);

    status |= FS8x_ReadRegister(fs8xDrvdata, FAILSAFE_REG, FS8X_FS_I_WD_CFG_ADDR, &rxData);     

    printf("FS_I_WD_CFG register: 0x%04x\n\r", rxData.readData);

          ⑤ 设置 FCCU 和 ERRMON,即配置 FS_I_SAFE_INPUTS 寄存器。可配置:A. FCCU1 和 FCCU2 两个管脚是双极性输入还是单独输入;B. FCCU 输入错误的 IMPACT(0b-FS0B 设置为 0V,1b-FS0B 和 RSTB 都设置为 0V);C. ERRMON 的极性;D. ERRMON 的响应时间;E. ERRMON 的 IMPACT(0b-FS0B 设置为 0V,1b-FS0B 和 RSTB 都设置为 0V)。

    /* FCCU pin configuration, set FCCU_CFG[1:0] = 0, no monitoring, FCCU_EN = 1 enabled in OTP

      caution: watchdog refresh writing answer to FS8X_FS_WD_ANSWER_ADDR fail (RSTB low, MCU reset)

      if fCCU monitoring function is enabled

      POR default: 0x41C6

    */

    status |= FS8x_ReadRegister(fs8xDrvdata, FAILSAFE_REG, FS8X_FS_I_SAFE_INPUTS_ADDR, &rxData);

    printf("Read FS_I_SAFE_INPUTS: 0x%04x\n\r", rxData.readData); 

   

    writeValue = rxData.readData & ~FS8X_FS_I_FCCU_CFG_MASK; // disable FCCU monitoring in FS85.

    //writeValue = rxData.readData | FS8X_FS_I_FCCU12_FLT_POL_MASK; // configure FCCU polarity FCCU12_FLT_POL = 1;

    status |= FS8x_WriteRegisterInit(fs8xDrvdata, FS8X_FS_I_SAFE_INPUTS_ADDR, writeValue);

    status |= FS8x_ReadRegister(fs8xDrvdata, FAILSAFE_REG, FS8X_FS_I_SAFE_INPUTS_ADDR, &rxData);

    printf("configure FCCU12_FLT_POL=1 and read FS_I_SAFE_INPUTS again: 0x%04x\n\r", rxData.readData);

       ⑥ 设置 FSSM,即配置 FS_I_FSSM 寄存器。可配置:A. FS85 检测到错误的极限值;B. 错误到达极限值后的 IMPACT;C. RSTB 置为 0V 持续时间;D. RSTB 与 FS0B 的联动;E. 使能时钟检测;F. 使能 8 秒定时器,等。

    // FSI_I_FSSM register, POR = 0x5081

    status |= FS8x_ReadRegister(fs8xDrvdata, FAILSAFE_REG, FS8X_FS_I_FSSM_ADDR, &rxData);

    writeValue = FS8X_FS_I_FLT_ERR_IMPACT_FS0B | FS8X_FS_I_FLT_ERR_CNT_LIMIT_6 | FS8X_FS_I_FS0B_SC_HIGH_CFG_NO_ASSERTION;

    status |= FS8x_WriteRegisterInit(fs8xDrvdata, FS8X_FS_I_FSSM_ADDR, writeValue);

    status |= FS8x_ReadRegister(fs8xDrvdata, FAILSAFE_REG, FS8X_FS_I_FSSM_ADDR, &rxData);

    printf("configure FSI_I_FSSM to 0x%04x\n\r", rxData.readData);

3、退出 INIT_FS 状态

当第一次喂狗成功之后,FS85 退出 INIT_FS 状态,在此之后,MCU 可以定时喂狗、定期检查错误。

如果想再次进入 INIT_FS 状态,可设置 FS_SAFE_IOS 寄存器的 GOTO_INITFS(bit10)为 1。


四、总结

       通过以上描述,相信您对 FS85 这颗安全芯片的软件设计有所了解。我们从中可以看出,作为适合 ASIL D 功能安全等级的电源管理芯片,其不仅在硬件上做了各种安全设置,而且在软件上有多种要求,极大限度地保证了系统的正常运行。如果想了解更多,可以在下方评论区留言,或者发邮件给我们:[email protected]


五、参考资料

  1. FS84/FS85 Datasheet。
  2. NXP FS85 官方例程。
  3. 世平基于 FC7300 的 HVBMS 例程。


欢迎在大大通相关博文下方留言评论,我们会及时回复您的问题。如有更多需求,欢迎联系大联大世平集团 ATU 部门:[email protected]
作者:May Xu / 徐美霞

登录大大通,了解更多详情,解锁1500+完整应用方案,更有大联大700+FAE在线答疑解惑!

你可能感兴趣的:(单片机,物联网,嵌入式硬件,能源,大大通)