PMBus
PMBus
Category: Power Management
Overview
PMBus (Power Management Bus) is an open-standard protocol extension of SMBus/I2C specifically for digital management of power supplies, voltage regulators, and power modules. It enables reading telemetry, setting voltages, enabling/disabling outputs, and configuring faults over a 2-wire bus.
1. Theory & Fundamentals
- Built on top of SMBus 2.0 (I2C-compatible)
- Defines command codes for power supply management
- Telemetry: Read voltage, current, temperature, power, duty cycle
- Control: Set output voltage, current limit, enable/disable output
- Faults: Configure and read over-voltage, over-current, over-temperature
- Speed: 100 kHz – 400 kHz
- Addressing: Up to 8 devices per bus (with address pins)
2. Frame / Packet Structure
PMBus command structure (SMBus transactions):
Write Byte: S | ADDR W | A | CMD | A | DATA | A | P
Read Byte: S | ADDR W | A | CMD | A | Sr | ADDR R | A | DATA | NA | P
Write Word: CMD | DATA_LOW | DATA_HIGH
Read Word: returns 2 bytes (Linear11 or ULINEAR16 format)
Linear11 format (2 bytes):
[15:11] = 5-bit signed exponent N
[10:0] = 11-bit signed mantissa Y
Value = Y × 2^N
Example: VOUT_COMMAND = 0x21
Write word to set output voltage
ULINEAR16 format: voltage = value × 2^exponent
3. Protocol Mechanics
- Command codes: 0x00–0xFF; lower codes standard, upper vendor-specific
- Page: Multi-phase converters use PAGE command to select output
- Group protocol: Change multiple regulators simultaneously
- Fault response: SMBALERT# line or polling STATUS registers
- Coefficients: Some devices use m/b/R coefficients for scaling
4. Hardware Implementation
- Common PMBus ICs: LTC3880, TPS40425, IR38064, ISL91302
- I2C interface: Same 2-wire SDA/SCL; 4.7 kΩ pull-ups
- PMBUS_CNTRL pin: Hardware enable (some devices)
- SMBAlert# pin: Open-drain fault interrupt
- Tools: LTpowerPlay (Analog Devices), Fusion Digital Power Designer (TI)
5. Register-Level / Configuration
// Read output voltage (READ_VOUT, cmd 0x8B)
uint16_t PMBus_ReadVout(uint8_t addr) {
return SMBus_ReadWord(addr, 0x8B);
}
float PMBus_Linear16ToFloat(uint16_t raw, int8_t exp) {
return raw * powf(2.0f, exp);
}
// Set output voltage (VOUT_COMMAND, cmd 0x21)
void PMBus_SetVout(uint8_t addr, float voltage) {
int8_t exp = SMBus_ReadByte(addr, 0x20); // VOUT_MODE
exp = -(exp & 0x1F); // 2's complement lower 5 bits
uint16_t raw = (uint16_t)(voltage / powf(2.0f, exp));
SMBus_WriteWord(addr, 0x21, raw);
}
6. Driver / Software Development
// Read telemetry: voltage, current, temperature
float vout = PMBus_ReadLinear11(addr, 0x8B); // READ_VOUT
float iout = PMBus_ReadLinear11(addr, 0x8C); // READ_IOUT
float temp = PMBus_ReadLinear11(addr, 0x8D); // READ_TEMPERATURE_1
float pout = PMBus_ReadLinear11(addr, 0x96); // READ_POUT
// Check fault status
uint8_t status_word_hi = PMBus_ReadByte(addr, 0x79);
uint8_t status_word_lo = PMBus_ReadByte(addr, 0x78);
// Bit 13 = OC_FAULT, bit 12 = UC_FAULT, etc.
7. Debugging & Testing
- LTpowerPlay / Fusion Digital Power Designer: GUI configuration
- Logic analyzer with PMBus/SMBus decode
- Common issues: Linear11 scaling wrong; address collision; SMBALERT# not handled
- Verify VOUT_MODE before interpreting VOUT readings
- Check PEC (Packet Error Code) if enabled
8. Real-World Applications
- Server power supply telemetry and control
- Multi-rail PCB power management
- Data center power monitoring
- Solar inverter control
- Industrial motor drive power modules
9. Advanced Topics & Edge Cases
- PMBus 1.3: Adds AVSBus (adaptive voltage scaling)
- SVID (Serial VID): Intel/AMD CPU power management (proprietary PMBus variant)
- AVS: Adaptive Voltage Scaling for processors
- PMBus vs I2C power controllers: PMBus is standardized; I2C custom registers
- Phase interleaving: PMBus manages timing of multi-phase converters
10. Standards & Variants
| Standard | Notes |
|---|---|
| PMBus 1.0 | Original spec |
| PMBus 1.1 | Zone commands |
| PMBus 1.2 | Extended commands |
| PMBus 1.3 | AVSBus integration |
💡 Practical Examples
Ex 1: Read LTC3880 output voltage: PMBus_ReadLinear11(0x40, 0x8B) → 1.002 V
Ex 2: Set voltage: PMBusSetVout(0x40, 1.0f) → sets VOUTCOMMAND
Ex 3: Fault check: Poll STATUSWORD; if bit set, read STATUSVOUT / STATUS_IOUT for detail.
🧪 Practice Questions
Beginner: 1) PMBus vs I2C? 2) What can you read? 3) What is Linear11? 4) PMBus address range? 5) What is SMBALERT#?
Intermediate: 1) Linear11 decode formula. 2) Set output voltage. 3) Fault handler. 4) PAGE command use. 5) Coefficient-based vs Linear11.
Advanced: 1) Multi-rail telemetry logger. 2) Adaptive voltage scaling implementation. 3) PMBus fault injection test. 4) Multi-phase converter management. 5) PMBus over RTOS with mutex.
Checklist
- [ ] Understand PMBus command structure
- [ ] Read output voltage with Linear11 decode
- [ ] Read current, temperature, power
- [ ] Set output voltage via VOUT_COMMAND
- [ ] Handle SMBALERT# fault interrupt
- [ ] Parse STATUS_WORD fault bits
- [ ] Use LTpowerPlay for configuration
- [ ] Debug with logic analyzer
- [ ] Implement multi-rail monitoring
- [ ] Configure fault thresholds