PMBus 指令解析:ON_OFF_CONFIG (02h) 開機條件與 CONTROL 腳位設定
PMBus ON_OFF_CONFIG (02h) 逐位元解析:PU、CMD、CP、極性與關機方式,搞懂電源到底聽 CONTROL 腳位還是 OPERATION 命令,附常用設定值速查表與 C 語言解碼範例。
為什麼需要 ON_OFF_CONFIG
電源模組的開關機可以由兩個來源控制:
- 硬體腳位:PMBus 規格稱為 CONTROL 腳位,在不同產品上可能叫
EN、RUN、ON/OFF,CRPS 電源上則是PSON#。 - 軟體命令:透過 PMBus 寫入
OPERATION (01h)的開關位元。
ON_OFF_CONFIG 就是用來設定這兩個來源誰有效、怎麼組合,以及腳位的極性與關機方式。
傳輸格式
ON_OFF_CONFIG 使用 SMBus 的 Write Byte / Read Byte 協定,資料長度為 1 個位元組:
寫入:S | Addr+W | A | 02h | A | Data | A | [PEC | A] | P
讀取:S | Addr+W | A | 02h | A | Sr | Addr+R | A | Data | [PEC] | NA | P
暫存器位元結構
| Bit | 名稱 | 0 | 1 |
|---|---|---|---|
| b[7:5] | Reserved | 填 000b | — |
| b[4] | PU | 只要有輸入電源就開機,不理會 CONTROL 腳位和 OPERATION | 依 b[3:2] 的設定,等到開機條件成立才開機 |
| b[3] | CMD | 忽略 OPERATION 的開關位元 | 回應 OPERATION 的開關位元 |
| b[2] | CP | 忽略 CONTROL 腳位 | 需要 CONTROL 腳位致能才能開機 |
| b[1] | Polarity | CONTROL 腳位 Active Low(拉低 = 開機) | CONTROL 腳位 Active High(拉高 = 開機) |
| b[0] | Off Action | 腳位關機時依 TOFF_DELAY / TOFF_FALL 時序關閉(Soft Off) | 腳位關機時立即停止輸出(Immediate Off) |
開機條件判斷流程
PU = 1 時,真正的開機條件由 CMD 和 CP 兩個位元組合決定:
| CMD (b3) | CP (b2) | 開機條件 |
|---|---|---|
| 0 | 1 | 只看 CONTROL 腳位 |
| 1 | 0 | 只看 OPERATION 命令 |
| 1 | 1 | CONTROL 腳位致能 且 OPERATION = On,兩者都要成立 |
| 0 | 0 | 沒有任何開機來源,實務上應避免這種設定 |
flowchart TD
S["輸入電源就緒"] --> PU{"PU (b4)?"}
PU -- "0" --> ON["輸出開啟<br>(不管腳位與命令)"]
PU -- "1" --> CP{"CP (b2) = 1?"}
CP -- "是" --> PIN{"CONTROL 腳位<br>是否致能?"}
CP -- "否" --> CMD{"CMD (b3) = 1?"}
PIN -- "否" --> OFF["保持關閉"]
PIN -- "是" --> CMD
CMD -- "否" --> PINONLY{"CP = 1?"}
PINONLY -- "是" --> ON
PINONLY -- "否" --> OFF
CMD -- "是" --> OP{"OPERATION<br>b[7:6] = 10 (On)?"}
OP -- "是" --> ON
OP -- "否" --> OFF
常用設定值速查表
| Hex | Binary | PU | CMD | CP | 極性 | 腳位關機 | 說明 |
|---|---|---|---|---|---|---|---|
00h | 0000 0000 | 0 | – | – | – | – | 有電就開機,腳位與命令都無效 |
14h | 0001 0100 | 1 | 0 | 1 | Low | Soft | 只看腳位(低電位開機) |
15h | 0001 0101 | 1 | 0 | 1 | Low | Immediate | 只看腳位(低電位開機),放開腳位立即關閉 |
16h | 0001 0110 | 1 | 0 | 1 | High | Soft | 只看腳位(高電位開機) |
18h | 0001 1000 | 1 | 1 | 0 | – | – | 只看 OPERATION |
1Ch | 0001 1100 | 1 | 1 | 1 | Low | Soft | 腳位(低電位)且 OPERATION = On |
1Eh | 0001 1110 | 1 | 1 | 1 | High | Soft | 腳位(高電位)且 OPERATION = On |
讀取與解碼範例
Linux(i2c-tools)
以 PMBus 位址 0x58、I2C bus 1 為例(請換成你系統上的實際值):
# 讀取 ON_OFF_CONFIG
i2cget -y 1 0x58 0x02 b
# 設為「只看 OPERATION 命令」(18h)
i2cset -y 1 0x58 0x02 0x18 b
C 語言解碼
#include <stdint.h>
#include <stdio.h>
#define ON_OFF_PU (1u << 4) /* 1 = 等待開機條件 */
#define ON_OFF_CMD (1u << 3) /* 1 = 回應 OPERATION */
#define ON_OFF_CP (1u << 2) /* 1 = 需要 CONTROL 腳位 */
#define ON_OFF_POL_HIGH (1u << 1) /* 1 = CONTROL Active High */
#define ON_OFF_OFF_FAST (1u << 0) /* 1 = 腳位關機時立即關閉 */
void decode_on_off_config(uint8_t v)
{
if (!(v & ON_OFF_PU)) {
printf("0x%02X: 有輸入電源就開機\n", v);
return;
}
int cmd = !!(v & ON_OFF_CMD);
int cp = !!(v & ON_OFF_CP);
if (cmd && cp) printf("0x%02X: CONTROL 腳位且 OPERATION 都要成立\n", v);
else if (cmd) printf("0x%02X: 只看 OPERATION\n", v);
else if (cp) printf("0x%02X: 只看 CONTROL 腳位\n", v);
else printf("0x%02X: 沒有開機來源(設定有誤)\n", v);
if (cp) {
printf(" CONTROL 極性:%s\n", (v & ON_OFF_POL_HIGH) ? "Active High" : "Active Low");
printf(" 腳位關機:%s\n", (v & ON_OFF_OFF_FAST) ? "Immediate Off" : "Soft Off");
}
}
工程實務提示
結論
ON_OFF_CONFIG (02h)是 1 Byte 命令,決定電源開機要聽誰的。- PU = 0:有電就開;PU = 1:再看 CMD(
OPERATION)和 CP(CONTROL 腳位)。 - CMD 和 CP 都為 1 時,兩個條件都要成立才會開機。
b[1]決定腳位極性,b[0]只影響用腳位關機時的方式。OPERATION寫了沒反應?先讀ON_OFF_CONFIG確認 CMD 位元。
延伸閱讀: