韌體約 3 分鐘

PMBus 指令解析:ON_OFF_CONFIG (02h) 開機條件與 CONTROL 腳位設定

PMBus ON_OFF_CONFIG (02h) 逐位元解析:PU、CMD、CP、極性與關機方式,搞懂電源到底聽 CONTROL 腳位還是 OPERATION 命令,附常用設定值速查表與 C 語言解碼範例。

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

為什麼需要 ON_OFF_CONFIG

電源模組的開關機可以由兩個來源控制:

  1. 硬體腳位:PMBus 規格稱為 CONTROL 腳位,在不同產品上可能叫 EN、RUN、ON/OFF,CRPS 電源上則是 PSON#。
  2. 軟體命令:透過 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名稱01
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]PolarityCONTROL 腳位 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)開機條件
01只看 CONTROL 腳位
10只看 OPERATION 命令
11CONTROL 腳位致能 且 OPERATION = On,兩者都要成立
00沒有任何開機來源,實務上應避免這種設定
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

常用設定值速查表

HexBinaryPUCMDCP極性腳位關機說明
00h0000 00000––––有電就開機,腳位與命令都無效
14h0001 0100101LowSoft只看腳位(低電位開機)
15h0001 0101101LowImmediate只看腳位(低電位開機),放開腳位立即關閉
16h0001 0110101HighSoft只看腳位(高電位開機)
18h0001 1000110––只看 OPERATION
1Ch0001 1100111LowSoft腳位(低電位)且 OPERATION = On
1Eh0001 1110111HighSoft腳位(高電位)且 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 位元。

延伸閱讀: