PMBus 系列約 3 分鐘

PMBus 指令解析:SMBALERT_MASK (1Bh) 屏蔽特定告警的 SMBALERT# 中斷

PMBus SMBALERT_MASK (1Bh) 完整解析:寫入用 Write Word、讀取用 Block Write-Block Read Process Call 的特殊格式,Mask Byte 與 STATUS 位元的對應方式,搭配 ARA 流程與 i2c-tools 實作範例。

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

綱要介紹

在 PMBus 系統中,電源發生異常(例如過壓 OVP、過流 OCP)時,除了更新狀態命令(STATUS_WORD 與 STATUS_xxx),還會主動拉低 SMBALERT# 腳位,通知 Host / MCU 處理。

但有些告警在特定情況下是預期中的,例如系統啟動過程中短暫的輸入欠壓警告。透過 SMBALERT_MASK,工程師可以:

  1. 屏蔽特定告警:即使該 Fault / Warning 發生,SMBALERT# 仍保持高電位,不送出硬體中斷。
  2. 保留狀態記錄:被屏蔽的告警仍然會記錄在 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 CommandSTATUS 位元Mask Bit 7實際行為
STATUS_VOUT (7Ah)Bit 7:VOUT_OV_FAULT1(Masked)發生 VOUT_OV 時,SMBALERT# 不會拉低,STATUS 仍記錄
STATUS_VOUT (7Ah)Bit 7:VOUT_OV_FAULT0(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 Command7Dh
Mask Byte80h(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) 找出發出告警的元件。

延伸閱讀: