PMBus 系列約 5 分鐘

PMBus 指令解析:CLEAR_FAULTS (03h) 清除故障、釋放 SMBALERT# 與重新開機

PMBus CLEAR_FAULTS (03h) 完整解析:Send Byte 時序(含 PEC 計算範例)、清除哪些 STATUS、為什麼清掉又馬上出現,以及最常被問的問題:清除故障後電源會自己重新開機嗎?附 Latch Off、Hiccup 行為比較與 CRC-8 程式。

📘 參考規格書PMBus · PMBus Power System Management Protocol Specification Part II原廠文件 ↗

綱要介紹

電源模組(CRPS、POL 等)發生異常時,例如過壓 OVP、過流 OCP、過溫 OTP,韌體會把對應的狀態位元**鎖存(Latch)**在 STATUS_WORD 與各個 STATUS_xxx 中,同時拉低 SMBALERT# 通知 Host。

CLEAR_FAULTS 的作用:

  1. 清除狀態:把所有 STATUS_xxx 中的故障與警告位元清為 0。
  2. 釋放告警中斷:放開 SMBALERT#,讓外部上拉電阻把訊號拉回高電位。

通訊協定格式:Send Byte

CLEAR_FAULTS 使用 SMBus 的 Send Byte 協定,只有命令碼,沒有任何資料位元組。依系統是否啟用 PEC(Packet Error Checking),分成兩種格式。

1. 未啟用 PEC

┌───┬──────────────┬───┬──────────┬───┬───┐
│ S │ Slave Addr+W │ A │ Cmd: 03h │ A │ P │
└───┴──────────────┴───┴──────────┴───┴───┘
  • 資料長度:2 Bytes(位址 + 命令碼)
  • 流程:
    1. Master 發出 Start(S)
    2. Master 傳送 Slave Address + Write(0),Slave 回應 ACK
    3. Master 傳送命令碼 03h,Slave 回應 ACK
    4. Master 發出 Stop(P)

2. 啟用 PEC

┌───┬──────────────┬───┬──────────┬───┬─────┬───┬───┐
│ S │ Slave Addr+W │ A │ Cmd: 03h │ A │ PEC │ A │ P │
└───┴──────────────┴───┴──────────┴───┴─────┴───┴───┘
  • 資料長度:3 Bytes(多 1 Byte CRC-8 校驗碼)
  • 流程:前 3 步相同,第 4 步 Master 送出 PEC(對前面所有位元組計算的 CRC-8),Slave 驗證正確才回應 ACK,最後發出 Stop。

欄位說明

符號全名方向說明
SStart ConditionMaster → SlaveSCL 為高時,SDA 由高拉低
Slave Addr+WSlave Address + WriteMaster → Slave7 位元位址 + 寫入位元(0)
Cmd: 03hCommand CodeMaster → SlaveCLEAR_FAULTS 命令碼
PECPacket Error CheckingMaster → SlaveCRC-8,多項式 C(x)=x8+x2+x+1C(x) = x^8 + x^2 + x + 1
AAcknowledgeSlave → Master接收端拉低 SDA 表示確認
PStop ConditionMaster → SlaveSCL 為高時,SDA 由低拉高

PEC 計算範例

PEC 的計算範圍包含位址位元組(7 位元位址左移 1 位 + R/W 位元)。以位址 0x58 為例:

位元組值說明
位址 + WB0h0x58 << 1 | 0
命令碼03hCLEAR_FAULTS
PEC46hCRC-8(B0h 03h)
#include <stddef.h>
#include <stdint.h>

/* SMBus PEC:CRC-8,多項式 0x07,初始值 0 */
uint8_t smbus_pec(const uint8_t *data, size_t len)
{
    uint8_t crc = 0;

    while (len--) {
        crc ^= *data++;
        for (int i = 0; i < 8; i++)
            crc = (crc & 0x80) ? (uint8_t)((crc << 1) ^ 0x07) : (uint8_t)(crc << 1);
    }
    return crc;
}

/* uint8_t frame[] = { 0x58 << 1, 0x03 };  smbus_pec(frame, 2) → 0x46 */

PEC 錯誤時,電源會忽略這個命令,並設定 STATUS_CML 的 PEC Failed(b5)。PEC 的完整計算規則與各種交易的範例,請見 PEC 校驗完整解析。

清除範圍

項目對象執行後
主狀態STATUS_BYTE (78h)、STATUS_WORD (79h)故障與警告位元清為 0
子狀態STATUS_VOUT (7Ah)、STATUS_IOUT (7Bh)、STATUS_INPUT (7Ch)、STATUS_TEMPERATURE (7Dh)、STATUS_CML (7Eh)、STATUS_OTHER (7Fh)、STATUS_MFR_SPECIFIC (80h)、STATUS_FANS_1_2 (81h)、STATUS_FANS_3_4 (82h)所有位元清為 0
硬體腳位SMBALERT#釋放下拉,訊號回到高電位

核心疑問:CLEAR_FAULTS 之後會重新開機嗎?

答案:依 PMBus 規格,不會。

實際行為還取決於該故障設定的響應模式(Fault Response),例如 VOUT_OV_FAULT_RESPONSE (41h)、IOUT_OC_FAULT_RESPONSE (47h)、OT_FAULT_RESPONSE (50h):

1. 鎖死模式(Latch Off):不會自動開機(CRPS 典型行為)

  • 適用情境:CRPS 伺服器電源的主輸出過壓(OVP)、過流(OCP)等嚴重故障。
  • 執行 03h 後:
    • STATUS_xxx 旗標清為 0,SMBALERT# 被釋放
    • 輸出仍然關閉
  • 重新開機方法:
    • 硬體控制:PSON# 拉高(Off)再拉低(On)
    • 軟體控制:OPERATION 寫 00h / 40h 再寫 80h(需要 ON_OFF_CONFIG 的 CMD = 1,詳見 OPERATION (01h))
    • 斷電重啟:AC Power Cycle

2. 打嗝 / 自動重試模式(Hiccup / Retry):重啟和 03h 無關

  • 適用情境:響應模式設定為定時重試,常見於較輕微的過流或欠壓。
  • 執行 03h 後:
    • 電源本來就會依內部計時器自動嘗試重新軟啟動
    • 03h 只是清除紀錄;如果重試時故障還在,會再次觸發保護並重新設定旗標

3. 少數元件的自訂行為:清除後自動重啟

運作流程

flowchart TD
    A["電源因故障關閉輸出"] --> B["收到 CLEAR_FAULTS (03h)"]
    B --> C["清除 STATUS、釋放 SMBALERT#"]
    C --> F{"故障還存在?"}
    F -- "是" --> R["立刻重新設定旗標<br>再次拉低 SMBALERT#"]
    F -- "否" --> M{"Fault Response 模式?"}
    M -- "Latch Off(CRPS 常見)" --> L["輸出保持關閉"]
    M -- "Hiccup / Retry" --> H["依內部計時器自動重試<br>(與 03h 無關)"]
    L --> T["切換 PSON#、OPERATION Off→On<br>或 AC 重新上電"]

實務操作

Linux(i2c-tools)

以 PMBus 位址 0x58、I2C bus 1 為例(請換成你系統上的實際值):

# 清除故障(Send Byte,沒有資料)
i2cset -y 1 0x58 0x03

# 啟用 PEC 的系統:模式 c(無資料)加上 p(PEC)
i2cset -y 1 0x58 0x03 cp

# 清除後讀回 STATUS_WORD 確認
i2cget -y 1 0x58 0x79 w

建議的處理順序

  1. 收到 SMBALERT# 或輪詢發現異常 → 先讀 STATUS_WORD 和對應的 STATUS_xxx,記錄下來
  2. 排除故障原因
  3. 送出 CLEAR_FAULTS
  4. 讀回 STATUS_WORD:還有故障位元,代表問題沒有排除
  5. 輸出若仍關閉,依需求切換 PSON# 或 OPERATION 重新開機

結論

  • CLEAR_FAULTS (03h) 使用 Send Byte,沒有資料;啟用 PEC 時多 1 Byte CRC-8。
  • 清除所有 STATUS 的故障與警告位元,並釋放 SMBALERT#。
  • 只清紀錄,不修故障:故障還在的話會立刻再被設定。
  • 依規格不會重新開機,要用 CONTROL 腳位、OPERATION Off→On 或斷電重啟。
  • 除錯時先讀 STATUS 再清除。

延伸閱讀: