PMBus 指令解析:SMBALERT_MASK (1Bh) 屏蔽特定告警的 SMBALERT# 中斷
PMBus SMBALERT_MASK (1Bh) 完整解析:寫入用 Write Word、讀取用 Block Write-Block Read Process Call 的特殊格式,Mask Byte 與 STATUS 位元的對應方式,搭配 ARA 流程與 i2c-tools 實作範例。
綱要介紹
在 PMBus 系統中,電源發生異常(例如過壓 OVP、過流 OCP)時,除了更新狀態命令(STATUS_WORD 與 STATUS_xxx),還會主動拉低 SMBALERT# 腳位,通知 Host / MCU 處理。
但有些告警在特定情況下是預期中的,例如系統啟動過程中短暫的輸入欠壓警告。透過 SMBALERT_MASK,工程師可以:
- 屏蔽特定告警:即使該 Fault / Warning 發生,
SMBALERT#仍保持高電位,不送出硬體中斷。 - 保留狀態記錄:被屏蔽的告警仍然會記錄在 STATUS 命令中,透過輪詢(Polling)一樣讀得到。
通訊協定格式
設定遮罩:Write Word
資料的低位元組是目標 STATUS 命令碼,高位元組是 Mask Byte:
S | Addr+W | A | 1Bh | A | STATUS 命令碼 | A | Mask Byte | A | [PEC | A] | P
(Low Byte) (High Byte)
讀取遮罩:Block Write-Block Read Process Call
S | Addr+W | A | 1Bh | A | 01h | A | STATUS 命令碼 | A
| Sr | Addr+R | A | 01h | A | Mask Byte | [A | PEC] | NA | P
- 主控端寫入:Byte Count =
01h,加上要查詢的 STATUS 命令碼 - 元件回應:Byte Count =
01h,加上該 STATUS 目前的 Mask Byte
Mask Byte 的對應方式
以 STATUS_VOUT (7Ah) 的 Bit 7(VOUT_OV_FAULT)為例:
| Target Command | STATUS 位元 | Mask Bit 7 | 實際行為 |
|---|---|---|---|
STATUS_VOUT (7Ah) | Bit 7:VOUT_OV_FAULT | 1(Masked) | 發生 VOUT_OV 時,SMBALERT# 不會拉低,STATUS 仍記錄 |
STATUS_VOUT (7Ah) | Bit 7:VOUT_OV_FAULT | 0(Unmasked) | 發生 VOUT_OV 時,SMBALERT# 立刻拉低 |
每個 STATUS 命令都有各自獨立的 Mask Byte,要屏蔽不同類別的告警,就要分別對 STATUS_VOUT、STATUS_IOUT、STATUS_TEMPERATURE 等各寫一次。
運作邏輯
flowchart TD
E["告警事件發生<br>(例:OVP / OCP / OT)"] --> S["對應的 STATUS 位元 = 1"]
S --> M{"SMBALERT_MASK<br>對應的 Mask Bit?"}
M -- "0(Unmasked)" --> A["拉低 SMBALERT#<br>主控端收到中斷"]
M -- "1(Masked)" --> N["不拉低 SMBALERT#"]
A --> R["主控端讀 ARA (0x0C)<br>找出發出告警的元件"]
N --> P["STATUS 仍記錄<br>可透過輪詢讀到"]
操作範例
情況 1:屏蔽 STATUS_TEMPERATURE (7Dh) 的 OT Fault(Bit 7)
| 欄位 | 值 |
|---|---|
| Target Command | 7Dh |
| Mask Byte | 80h(1000 0000b) |
| Write Word 資料 | Low Byte = 7Dh、High Byte = 80h → Word = 807Dh |
效果:發生過溫 Fault 時,STATUS_TEMPERATURE 會記錄,但 SMBALERT# 不會拉低。
情況 2:查詢 STATUS_IOUT (7Bh) 目前的遮罩
用 Process Call 帶入 Target Command 7Bh,讀回 Mask Byte。若回應 00h,表示所有 IOUT 相關告警都會觸發 SMBALERT#。
Linux(i2c-tools)
以 PMBus 位址 0x58、I2C bus 1 為例(請換成你系統上的實際值):
# 情況 1:屏蔽 OT Fault(Write Word,資料 = 0x807D:低位元組 7Dh、高位元組 80h)
i2cset -y 1 0x58 0x1b 0x807d w
# 情況 2:讀取 STATUS_IOUT 的遮罩(Process Call:寫 3 Bytes,Repeated Start 後讀 2 Bytes)
i2ctransfer -y 1 w3@0x58 0x1b 0x01 0x7b r2
# 回應範例:0x01 0x00 → Byte Count = 1,Mask = 0x00
i2cget 不支援 Process Call,所以讀取要改用 i2ctransfer,它會在寫入和讀取之間使用 Repeated Start。
工程實務提示
結論
SMBALERT_MASK (1Bh)控制哪些告警會拉低SMBALERT#,不影響 STATUS 記錄。- 寫入用 Write Word(低位元組 = STATUS 命令碼、高位元組 = Mask),讀取用 Process Call。
- Mask Byte 與目標 STATUS 位元一對一對應,1 = 屏蔽。
- 每個 STATUS 命令的遮罩各自獨立。
- 收到
SMBALERT#後,用 ARA (0x0C) 找出發出告警的元件。
延伸閱讀: