PMBus 系列約 3 分鐘

PMBus 指令解析:QUERY (1Ah) 自動查詢電源支援哪些命令

PMBus QUERY (1Ah) 能力查詢命令完整解析:Block Write-Block Read Process Call 格式、回應位元組的支援/讀寫/資料格式定義,附常見回應值速查、自動掃描指令清單的做法與 C 語言解碼範例。

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

綱要介紹

開發 PMBus 主控端(Host Driver / MCU 韌體)或通用測試工具時,不同廠商、不同型號的電源模組支援的命令集常常不一樣。

QUERY 提供了動態探索的機制,讓 Host 不用翻規格書,就能透過 PMBus 掃描電源模組支援哪些功能:

  1. 命令支援度:該 Command Code 是否有實作。
  2. 存取權限:該命令是唯讀、唯寫,還是可讀寫。
  3. 資料格式:該命令的數值是 Linear、Direct、VID 等哪一種格式。

通訊協定格式

S | Addr+W | A | 1Ah | A | 01h | A | Target Command | A
  | Sr | Addr+R | A | 01h | A | Query Data | [A | PEC] | NA | P
  1. Host 寫入(Block Write 階段)
    • Command Code:1Ah
    • Byte Count:01h
    • Target Command Code:要查詢的命令,例如查 VOUT_COMMAND 就送 21h
  2. 電源回應(Block Read 階段)
    • Byte Count:01h
    • Query Data Byte:支援狀態、讀寫權限與資料格式

回應位元結構(Query Data Byte)

Bit欄位說明
b[7]Supported1:支援該命令
0:不支援(此時 b[6:0] 沒有意義)
b[6]Write1:可寫入
b[5]Read1:可讀取
b[4:2]Data Format見下表
b[1:0]Reserved保留,固定 00b

b[4:2] 資料格式

值資料格式對應的命令範例
000bLinear(LINEAR11 / LINEAR16)READ_IOUT、VOUT_COMMAND
001b16 位元有號數
010b保留
011bDirect(需搭配係數 m、b、R)使用 Direct 格式的量測命令
100b8 位元無號數
101bVIDVOUT_MODE 設為 VID 模式時的電壓命令
110b廠商自訂格式
111b不回傳數值資料(狀態位元、區塊資料等)STATUS_WORD、MFR_ID

運作流程

flowchart TD
    H["Host 送出 QUERY (1Ah)<br>帶入要查詢的命令碼(例:21h)"] --> S{"電源是否支援<br>該命令?"}
    S -- "支援" --> Y["回傳 b[7] = 1<br>加上讀寫權限與資料格式"]
    S -- "不支援" --> N["回傳 b[7] = 0"]
    H -.-> Q{"電源是否實作<br>QUERY 本身?"}
    Q -- "否" --> X["NACK,或設定<br>STATUS_CML 的 Invalid Command"]

實務查詢範例

範例 1:查詢 VOUT_COMMAND (21h)

  • Host 傳送:1Ah(Command)+ 01h(Byte Count)+ 21h(Target)
  • 電源回應:E0h(1110 0000b)
E0h = 1 1 1 000 00
      │ │ │  │   └─ b[1:0] 保留
      │ │ │  └───── b[4:2] = 000 → Linear
      │ │ └──────── b[5] = 1 → 可讀
      │ └────────── b[6] = 1 → 可寫
      └──────────── b[7] = 1 → 支援

結論:21h 是可讀寫、Linear 格式的命令。輸出電壓相關命令實際用的是 LINEAR16,指數要再讀 VOUT_MODE。

常見回應值速查

回應二進位意義範例命令
E0h1110 0000支援、可讀寫、LinearVOUT_COMMAND (21h)
A0h1010 0000支援、唯讀、LinearREAD_IOUT (8Ch)
BCh1011 1100支援、唯讀、非數值STATUS_WORD (79h)
FCh1111 1100支援、可讀寫、非數值OPERATION (01h)、ON_OFF_CONFIG (02h)
00h0000 0000不支援—

讀取與解碼範例

Linux(i2c-tools)

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

# 查詢 VOUT_COMMAND (21h):寫 3 Bytes,Repeated Start 後讀 2 Bytes
i2ctransfer -y 1 w3@0x58 0x1a 0x01 0x21 r2
# 回應範例:0x01 0xe0 → Byte Count = 1,Query Data = 0xE0

C 語言:解碼回應

#include <stdint.h>
#include <stdio.h>

static const char *const query_formats[8] = {
    "Linear", "16-bit signed", "Reserved", "Direct",
    "8-bit unsigned", "VID", "Manufacturer specific", "Non-numeric",
};

void decode_query(uint8_t cmd, uint8_t q)
{
    if (!(q & 0x80)) {
        printf("0x%02X: 不支援\n", cmd);
        return;
    }
    printf("0x%02X: %s%s, %s\n", cmd,
           (q & 0x20) ? "R" : "-",
           (q & 0x40) ? "W" : "-",
           query_formats[(q >> 2) & 0x07]);
}

decode_query(0x21, 0xE0) 輸出 0x21: RW, Linear;decode_query(0x79, 0xBC) 輸出 0x79: R-, Non-numeric。

工程實務提示

結論

  • QUERY (1Ah) 用來查詢電源支援哪些命令,以及每個命令的讀寫權限與資料格式。
  • 使用 Block Write-Block Read Process Call:寫入目標命令碼,讀回 1 Byte。
  • b[7] 支援、b[6] 可寫、b[5] 可讀、b[4:2] 資料格式。
  • QUERY 本身是選配命令,掃描前先確認電源有實作。
  • 掃描未知電源時,用 QUERY 比直接試讀試寫安全。

延伸閱讀: