PMBus 指令解析:QUERY (1Ah) 自動查詢電源支援哪些命令
PMBus QUERY (1Ah) 能力查詢命令完整解析:Block Write-Block Read Process Call 格式、回應位元組的支援/讀寫/資料格式定義,附常見回應值速查、自動掃描指令清單的做法與 C 語言解碼範例。
綱要介紹
開發 PMBus 主控端(Host Driver / MCU 韌體)或通用測試工具時,不同廠商、不同型號的電源模組支援的命令集常常不一樣。
QUERY 提供了動態探索的機制,讓 Host 不用翻規格書,就能透過 PMBus 掃描電源模組支援哪些功能:
- 命令支援度:該 Command Code 是否有實作。
- 存取權限:該命令是唯讀、唯寫,還是可讀寫。
- 資料格式:該命令的數值是 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
- Host 寫入(Block Write 階段)
- Command Code:
1Ah - Byte Count:
01h - Target Command Code:要查詢的命令,例如查
VOUT_COMMAND就送21h
- Command Code:
- 電源回應(Block Read 階段)
- Byte Count:
01h - Query Data Byte:支援狀態、讀寫權限與資料格式
- Byte Count:
回應位元結構(Query Data Byte)
| Bit | 欄位 | 說明 |
|---|---|---|
| b[7] | Supported | 1:支援該命令0:不支援(此時 b[6:0] 沒有意義) |
| b[6] | Write | 1:可寫入 |
| b[5] | Read | 1:可讀取 |
| b[4:2] | Data Format | 見下表 |
| b[1:0] | Reserved | 保留,固定 00b |
b[4:2] 資料格式
| 值 | 資料格式 | 對應的命令範例 |
|---|---|---|
000b | Linear(LINEAR11 / LINEAR16) | READ_IOUT、VOUT_COMMAND |
001b | 16 位元有號數 | |
010b | 保留 | |
011b | Direct(需搭配係數 m、b、R) | 使用 Direct 格式的量測命令 |
100b | 8 位元無號數 | |
101b | VID | VOUT_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。
常見回應值速查
| 回應 | 二進位 | 意義 | 範例命令 |
|---|---|---|---|
E0h | 1110 0000 | 支援、可讀寫、Linear | VOUT_COMMAND (21h) |
A0h | 1010 0000 | 支援、唯讀、Linear | READ_IOUT (8Ch) |
BCh | 1011 1100 | 支援、唯讀、非數值 | STATUS_WORD (79h) |
FCh | 1111 1100 | 支援、可讀寫、非數值 | OPERATION (01h)、ON_OFF_CONFIG (02h) |
00h | 0000 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比直接試讀試寫安全。
延伸閱讀: