PMBus 指令解析:CLEAR_FAULTS (03h) 清除故障、釋放 SMBALERT# 與重新開機
PMBus CLEAR_FAULTS (03h) 完整解析:Send Byte 時序(含 PEC 計算範例)、清除哪些 STATUS、為什麼清掉又馬上出現,以及最常被問的問題:清除故障後電源會自己重新開機嗎?附 Latch Off、Hiccup 行為比較與 CRC-8 程式。
綱要介紹
電源模組(CRPS、POL 等)發生異常時,例如過壓 OVP、過流 OCP、過溫 OTP,韌體會把對應的狀態位元**鎖存(Latch)**在 STATUS_WORD 與各個 STATUS_xxx 中,同時拉低 SMBALERT# 通知 Host。
CLEAR_FAULTS 的作用:
- 清除狀態:把所有
STATUS_xxx中的故障與警告位元清為 0。 - 釋放告警中斷:放開
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(位址 + 命令碼)
- 流程:
- Master 發出 Start(S)
- Master 傳送 Slave Address + Write(0),Slave 回應 ACK
- Master 傳送命令碼
03h,Slave 回應 ACK - 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。
欄位說明
| 符號 | 全名 | 方向 | 說明 |
|---|---|---|---|
| S | Start Condition | Master → Slave | SCL 為高時,SDA 由高拉低 |
| Slave Addr+W | Slave Address + Write | Master → Slave | 7 位元位址 + 寫入位元(0) |
| Cmd: 03h | Command Code | Master → Slave | CLEAR_FAULTS 命令碼 |
| PEC | Packet Error Checking | Master → Slave | CRC-8,多項式 |
| A | Acknowledge | Slave → Master | 接收端拉低 SDA 表示確認 |
| P | Stop Condition | Master → Slave | SCL 為高時,SDA 由低拉高 |
PEC 計算範例
PEC 的計算範圍包含位址位元組(7 位元位址左移 1 位 + R/W 位元)。以位址 0x58 為例:
| 位元組 | 值 | 說明 |
|---|---|---|
| 位址 + W | B0h | 0x58 << 1 | 0 |
| 命令碼 | 03h | CLEAR_FAULTS |
| PEC | 46h | CRC-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
建議的處理順序
- 收到
SMBALERT#或輪詢發現異常 → 先讀STATUS_WORD和對應的STATUS_xxx,記錄下來 - 排除故障原因
- 送出
CLEAR_FAULTS - 讀回
STATUS_WORD:還有故障位元,代表問題沒有排除 - 輸出若仍關閉,依需求切換
PSON#或OPERATION重新開機
結論
CLEAR_FAULTS (03h)使用 Send Byte,沒有資料;啟用 PEC 時多 1 Byte CRC-8。- 清除所有 STATUS 的故障與警告位元,並釋放
SMBALERT#。 - 只清紀錄,不修故障:故障還在的話會立刻再被設定。
- 依規格不會重新開機,要用 CONTROL 腳位、
OPERATIONOff→On 或斷電重啟。 - 除錯時先讀 STATUS 再清除。
延伸閱讀: