? ? ? ? NXP 的 SBC - FS85 是一款车规级、多通道电源输出的电源集成芯片。FS85 的最大输入电压是 60V,可应用于新能源汽车的 12V 或者 24V 电源系统中。FS85可通过 I2C 或者 SPI 接口与主机通讯。主控 MCU 在运行过程中需要定时给 FS85 发送喂狗信息,通过这种方式来监测主控 MCU 是否宕机。一旦超时没有喂狗,FS85 就会认为主控 MCU 出现问题,就会立即采取一系列措施,比如产生中断信号、拉低复位管脚、断电等。
? ? ? ?世平集团在汽车 HVBMS 方案中,主控板上的电源管理集成芯片采用 FS85。通过这颗 IC 对电源进行管理,提高了系统的稳定性和安全性。
? ? ? ?在前一篇已经向大家介绍了 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 进入 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 功能安全等级的电源管理芯片,其不仅在硬件上做了各种安全设置,而且在软件上有多种要求,极大限度地保证了系统的正常运行。如果想了解更多,可以在下方评论区留言,或者发邮件给我们:atu.sh@wpi-group.com。
欢迎在大大通相关博文下方留言评论,我们会及时回复您的问题。如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com
作者:May Xu / 徐美霞