TL

PMBus/I2C電源管理プロトコル:テレメトリと制御

電源モジュールの電圧・電流・温度をソフトから読み、出力電圧やシーケンスまで制御したい——その標準言語がPMBusです。SMBus物理層・線形/直接データ形式・PEC誤り検出までを押さえ、運用で使える知識にできます。

応用PMBusSMBusI2C電源管理テレメトリPEC最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.PMBusはSMBus(I2Cベース)の物理層に標準コマンド体系を載せた電源管理プロトコル。電圧・電流・温度の監視、出力電圧設定、マージンテスト、オンオフとシーケンス制御を、専用配線ではなく2線のバスとコマンドで行える。
  • 2.数値は2形式で運ぶ。LINEAR11/LINEAR16は仮数と2のべき指数で表す浮動小数的な形式、DIRECTは `Y=m*X*10^R+b` の係数でデバイスごとに換算する形式。読み書きの前にどちらかと係数を知らないと値の意味が定まらない。
  • 3.各転送はPEC(CRC-8)で保護でき、ノイズで化けたコマンドの誤実行を防ぐ。ALERT#線とSMBus Alert Response Addressで割り込み的に異常を通知し、上位は全デバイスをポーリングせずに障害源を特定できる。

なぜ電源に「通信プロトコル」が要るのか

サーバーやネットワーク機器の基板には、CPU・メモリ・ASIC・PHYなど電圧の違う負荷ごとに、十個以上の電源レール(DC-DCコンバータやPOLレギュレータ)が並びます。これらを個別のアナログ配線で監視・制御すると、レールごとにイネーブル線・電圧監視線・電流検出線が必要になり、配線も部品も爆発します。この問題を2線のシリアルバスとコマンド体系に置き換えたのがPMBus(Power Management Bus)です。1本のバスに多数の電源デバイスをぶら下げ、ソフトウェアから各レールの電圧・電流・温度を読み、出力電圧を変え、オン/オフやシーケンスを指示できます。分散電源アーキテクチャの全体像は /power/point-of-load-distributed-power/ を、デジタル制御の中での位置づけは /power/digital-power-control/ を参照してください。

PMBusの正体は「物理層+コマンド辞書」の二層構造です。物理層は SMBus(System Management Bus)、すなわちI2Cをベースに電気仕様とタイミングを厳しめに規定したバスを使います。その上に、電源管理に特化した標準コマンドコードと、値を運ぶデータ形式を定義したのがPMBus仕様です。

物理層:SMBus(I2C)の上に立つ

PMBusの物理層はI2Cと同じ2線、SCL(クロック)とSDA(データ)です。マスタ(ホスト、BMCやコントローラ)がクロックを供給し、各電源デバイスは7ビットのスレーブアドレスを持ちます。基本のトランザクションはI2Cそのもので、START条件、アドレス+R/Wビット、各バイトごとのACK/NACK、STOP条件で構成されます。

PMBus(SMBus/I2C)の基本転送 ── 例: コマンドを書く

  S | SlaveAddr+W | A | CommandCode | A | DataLow | A | DataHigh | A | [PEC | A] | P

   S = START,  P = STOP,  A = ACK,  W = 書き込み方向ビット
   レジスタ選択にあたるのが「コマンドコード」1バイト

SMBusはI2Cに対して、運用上重要な追加規定をいくつか持ちます。第一にバスのタイムアウトです。スレーブがSCLを長く引っ張りすぎる(クロックストレッチ)とバスがハングするため、SMBusは下限クロック周波数(おおむね10kHz、25〜35msのタイムアウト)を定め、固まったバスをマスタが回復できるようにします。第二に PEC(Packet Error Code)によるパケット誤り検出で、これは後述します。第三が ALERT# 線で、デバイスが異常を能動的に通知する割り込み機構です。クロックは標準100kHz、PMBus 1.2以降は400kHz、1MHzもオプションで規定されます。

I2Cとして繋がってもPMBusとして正しいとは限らない

PMBusデバイスは電気的にはI2Cバスに同居できますが、同じことを意味しません。アドレス衝突(同一7ビットアドレスの重複)、プルアップ抵抗値とバス容量から決まる立ち上がり時間、デバイスごとに違うクロックストレッチの有無は、汎用I2Cセンサと混在させると問題になりがちです。とくにPEC有効デバイスと無効デバイスを同一マスタで扱うと、マスタ側がPECバイトを送る/期待するかどうかをデバイスごとに切り替える必要があります。バス設計時はプルアップと総容量を見積もり、立ち上がり時間がSMBus規定(おおむね1µs以下)に収まるか確認します。

コマンド体系:標準化された「電源の語彙」

PMBusの価値の中核は、コマンドコードが標準化されていることです。コマンドコードはレジスタアドレスのように働く1バイトで、仕様書が用途ごとに番号を割り当てています。代表例を挙げます。

コマンドコード方向役割
OPERATION0x01R/W出力のオン/オフ、マージン状態の指示
VOUT_COMMAND0x21R/W目標出力電圧の設定
VOUT_MARGIN_HIGH/LOW0x25/0x26R/Wマージンテスト時の上振れ/下振れ電圧
READ_VIN / READ_VOUT0x88/0x8BR入力/出力電圧のテレメトリ読み出し
READ_IOUT0x8CR出力電流のテレメトリ読み出し
READ_TEMPERATURE_10x8DR温度のテレメトリ読み出し
STATUS_WORD / STATUS_BYTE0x79/0x78R障害・警告フラグの一括読み出し
TON_DELAY / TOFF_DELAY0x60/0x64R/W起動/停止シーケンスの遅延時間

この標準化のおかげで、メーカーやモデルが違うデバイスでも同じソフトで監視・制御できます。たとえば「全レールの出力電圧を読む」処理は、各デバイスに READ_VOUT を投げるループとして書けます。マージンテスト(出力を意図的に少し高め/低めに振って回路が許容範囲で動くか検証する出荷試験)は、VOUT_MARGIN_HIGH/LOW に振れ幅を設定し、OPERATION コマンドのマージンビットで上振れ/下振れ/通常を切り替えるだけで実行できます。これがアナログ配線では到底できない、ソフト駆動の電源管理です。

シーケンス制御 ── 立ち上げ順序をコマンドで決める

複数レールには「コアを先、I/Oを後」のような投入順序の制約があり、順序を誤るとラッチアップやデバイス破損を招きます。PMBusでは各レールの TON_DELAY(イネーブルから立ち上げ開始までの遅延)と TON_RISE(立ち上げ時間)を設定し、共通のCONTROL線やコマンドで一斉トリガすると、各デバイスが自分の遅延だけ待ってから順に立ち上がります。停止も TOFF_DELAY で逆順に落とせます。専用シーケンサICを並べる代わりに、各POLが自分の順番をパラメータとして保持する分散シーケンスが組めるのが利点です。電源アーキテクチャ全体での投入管理は /power/datacenter-power-architecture/ も参照。

データ形式:LINEARとDIRECT

コマンドで運ぶ数値の解釈には2つの形式があり、ここを取り違えると値が桁単位でずれます。

LINEAR形式 は、整数の仮数を2のべき乗の指数でスケールする浮動小数的な表現です。出力電圧以外の量(入力電圧・電流・温度・電力など)は LINEAR11 を使い、16ビットワードを「5ビットの符号付き指数 + 11ビットの符号付き仮数」に分けて 実値 = 仮数 × 2^指数 で復元します。出力電圧(VOUT系)だけは精度を稼ぐため別扱いで、16ビット全部を仮数とする LINEAR16(ULINEAR16) を使い、指数は VOUT_MODE コマンドで別途与えられます。

LINEAR11 の復元(READ_IOUT などで使用):

  16ビットワード = [ 指数 e : 上位5ビット(符号付き) ][ 仮数 Y : 下位11ビット(符号付き) ]
  実値 = Y × 2^e

  例) e = -6, Y = 320 のとき
      実値 = 320 × 2^-6 = 320 / 64 = 5.0 (A)

LINEAR16 / VOUT(READ_VOUT などで使用):

  実値 = V × 2^(VOUT_MODE の指数)
  V は16ビットの仮数(指数は VOUT_MODE で別途取得)

DIRECT形式 は、デバイスごとの係数で生の整数を実値に線形換算する方式です。送出側では Y = (m × X + b) × 10^R で、X が実値(電圧・電流など)、Y がバス上の2バイト整数、m(傾き)・b(オフセット)・R(10のべき乗のスケール)はデバイスが定義します。ホスト側は逆算 X = (Y × 10^-R - b) / m で実値を得ます。LINEARはデバイス非依存で扱いやすく、DIRECTは係数さえ知ればADC特性をそのまま素直に表現できる という違いがあり、どちらを使うかはデバイスが決めます。

形式と係数を確認せずに読むと値が無意味になる

同じ生バイト列でも、LINEAR11として読むか、特定の m・b・R を持つDIRECTとして読むかで、結果はまったく別の数になります。さらにLINEAR16では VOUT_MODE を、DIRECTでは各量の m・b・R をデータシートで確認しないと換算できません。テレメトリ実装では「このデバイスの READ_VOUT は LINEAR16 で VOUT_MODE の指数が幾つか」「READ_IOUT は LINEAR11 か DIRECT か」を最初に固定するのが鉄則です。温度のように符号付き量を扱うときは、仮数の符号ビット(2の補数)の取り違えにも注意します。

PEC:CRCで化けたコマンドを弾く

電源バスは長い配線やノイズの多い環境を通るため、コマンドやデータが化けると、意図しない電圧設定や誤ったオフ指示につながりかねません。これを防ぐのが PEC(Packet Error Code)です。PECは、転送に含まれる全バイト(スレーブアドレス・R/Wビット・コマンドコード・データ)を多項式 x^8 + x^2 + x + 1(CRC-8)で計算した1バイトのチェック値で、転送末尾のSTOP直前に付加します。

PEC(CRC-8)の対象 ── 例: 書き込みトランザクション

  対象バイト列 = [SlaveAddr+W] [CommandCode] [Data...]
  PEC = CRC8( 上記の全バイト )     多項式: x^8 + x^2 + x + 1

  受信側で再計算した CRC と末尾PECが不一致 → NACKまたは
  STATUS_CML(通信・メモリ・ロジック障害)フラグを立てて拒否

受信側はバイトを受け取りながら同じCRCを再計算し、末尾のPECと一致しなければそのコマンドを実行しません。代わりに STATUS_WORD の CML(Communication, Memory, Logic)ビットを立て、ホストが異常を検知できるようにします。PECは1ビット誤りはもちろん、バーストエラーも高い確率で検出するため、安全に関わる電圧設定やオン/オフを誤って実行する事故を実質的に防げます。PEC対応はオプションですが、サーバー電源など信頼性が要る用途では有効化が前提です。

ALERT#とアラートレスポンス ── ポーリングなしの障害特定

過電流・過温度・過電圧などの異常が起きると、デバイスはオープンドレインの ALERT# 線をLowに引き、ホストに割り込みをかけます。ホストは「アラートレスポンスアドレス」(ARA、0x0C) へ汎用呼び出しを送り、異常を出したデバイスがそこに自分のアドレスを返します(複数あればI2Cアービトレーションで最若アドレスが勝ち、順に解決)。これにより全デバイスを総当たりでポーリングせずに障害源を特定できます。障害の詳細は STATUS_WORD と、VOUT/IOUT/TEMPERATURE/CML など系統別の STATUS_xxx レジスタで切り分けます。

運用上の役割 ── 監視・保護・遠隔制御の実体

PMBusが現場で果たす役割は三層に整理できます。第一は テレメトリ。BMC(Baseboard Management Controller)が各レールの電圧・電流・電力・温度を定期的に読み、消費電力の可視化、効率の算出、温度上昇の早期検知に使います。サーバーの「このCPUレールが何ワット」という値の多くはPMBus経由です。第二は 保護とフォルト記録。デバイス側で過電流・過温度の閾値(OT/UV/OV/OCの各 _LIMIT コマンド)を設定でき、異常時はデバイス自身が遮断しつつ ALERT# と STATUS で通知します。ホットスワップ電源の挙動は /power/hotswap-efuse/ とも連動します。第三は 遠隔制御。出荷後のマージンテスト、フィールドでの出力電圧微調整、リモートからのオン/オフ・シーケンス変更を、基板を触らずソフトから行えます。

試験・実務で問われる勘所

要点は4つです。(1) PMBusは物理層がSMBus(I2C派生、ALERT#とPEC・タイムアウトを追加)、その上に標準コマンドコード辞書を載せた電源管理プロトコル。(2) 値の形式は2系統——LINEAR11(指数×仮数の浮動小数的表現、電流/温度等)とLINEAR16(VOUT専用、指数は VOUT_MODE)、およびDIRECT(Y=(m·X+b)·10^R の係数換算)。形式と係数を先に確定しないと値が無意味。(3) PECはCRC-8(x^8+x^2+x+1)で全バイトを保護し、化けたコマンドの誤実行を防ぐ(不一致は STATUS_CML)。(4) ALERT#+ARA(0x0C)でポーリングなしに障害源を特定し、STATUS_WORD/系統別STATUSで切り分ける。マージンテストは VOUT_MARGIN_HIGH/LOW+OPERATION、シーケンスは TON_DELAY/TOFF_DELAY で組む。

まとめ

  • PMBusは SMBus(I2C派生)の物理層 に、電源管理用の 標準コマンドコード辞書 を載せた2線プロトコル。十数レールの監視・制御を専用配線からバスとソフトに置き換える。SMBusはI2Cにタイムアウト・PEC・ALERT#を足したもの。
  • コマンドはレジスタ的な1バイトのコードで標準化され、READ_VOUT/IOUT/TEMPERATURE のテレメトリ、VOUT_COMMAND の電圧設定、VOUT_MARGIN+OPERATION のマージンテスト、TON/TOFF_DELAY のシーケンス制御が機種横断で書ける。
  • 数値形式は LINEAR11(指数×仮数)・LINEAR16(VOUT専用、指数は VOUT_MODE)・DIRECTY=(m·X+b)·10^R)の3つ。形式と係数を先に確定しないと同じバイト列が別の値になる。
  • PEC(CRC-8) が全バイトを保護し化けたコマンドの誤実行を防ぐ。ALERT#+ARA はポーリングなしで障害源を特定し、STATUS_WORD/系統別STATUSで詳細を切り分ける。これが監視・保護・遠隔制御という運用上の役割を支える。
  • 関連は /power/digital-power-control//power/point-of-load-distributed-power//power/datacenter-power-architecture//power/hotswap-efuse/ を参照。

電源 Article

PMBus/I2C電源管理プロトコル:テレメトリと制御を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

PMBus

比較で見る軸

難易度: advanced / カテゴリ: 電源 / タグ数: 6

導入後に効く点

数値は2形式で運ぶ。LINEAR11/LINEAR16は仮数と2のべき指数で表す浮動小数的な形式、DIRECTは `Y=m*X*10^R+b` の係数でデバイスごとに換算する形式。読み書きの前にどちらかと係数を知らないと値の意味が定まらない。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
電源
タグ数
6

判断チェックリスト

  • 自社の用途が「PMBus / SMBus」に近いか確認する。
  • 強みである「PMBusはSMBus(I2Cベース)の物理層に標準コマンド体系を載せた電源管理プロトコル。電圧・電流・温度の監視、出力電圧設定、マージンテスト、オンオフとシーケンス制御を、専用配線ではなく2線のバスとコマンドで行える。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

PMBusSMBusI2C電源管理テレメトリPMBusSMBusI2C
参考: 公式情報