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 功能安全等級的電源管理晶片,其不僅在硬體上做了各種安全設置,而且在軟體上有多種要求,極大限度地保證了系統的正常運行。如果想了解更多,可以在下方評論區留言,或者發郵件給我們:atu.sh@wpi-group.com


五、參考資料

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


歡迎在博文下方留言評論,我們會及時回復您的問題。如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com
作者:May Xu / 徐美霞

 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論