ESH10000533 - M.2 PSU Module
Overview
The ESH10000533 is a high-performance power supply module featuring dual-channel power management based on the Linear Technology LTC3889 PMBus controller, designed for M.2 device testing and validation.
Description
The M.2 PSU module provides two independent, precision-controlled DC/DC converter channels with comprehensive PMBus monitoring and control capabilities. Built around the LTC3889 power management IC, this module offers real-time telemetry, fault protection, calibration support, and temperature monitoring for demanding power delivery applications.
Key Features:
Dual Independent Power Channels (CH1, CH2): Precision voltage and current control
- Maximum 60W per channel
- Programmable output voltage via PMBus VOUT_COMMAND
- Configurable voltage and current limits
- Margin high/low voltage support
- Soft-start and shutdown sequencing
Comprehensive Fault Protection: Multi-level protection with configurable responses
- Output overvoltage/undervoltage fault and warning limits
- Output overcurrent protection
- Input overvoltage/undervoltage monitoring
- Overtemperature and undertemperature protection
- TON_MAX fault detection for startup monitoring
PMBus Monitoring: Real-time telemetry for all critical parameters
- Output voltage (READ_VOUT)
- Output current (READ_IOUT)
- Input voltage (READ_VIN)
- Input current (READ_IIN)
- Temperature (READ_TEMPERATURE_1, READ_TEMPERATURE_2)
- Power output (READ_POUT)
- Efficiency calculations
Calibration Support: Per-channel current sense calibration
- IOUT_CAL_GAIN: Current sense resistor calibration (typical 2mΩ)
- MFR_IOUT_CAL_GAIN_TC: Temperature coefficient compensation (typical 50 ppm/°C)
- MFR_IIN_CAL_GAIN: Input current calibration
- Persistent calibration storage by product ID, revision, and serial number
- User-accessible CALIBRATION channel for reading/updating calibration data
Temperature Monitoring: Dual-sensor temperature reporting with ITempReporter interface
- Warning threshold: 60°C
- Error threshold: 90°C
- Automatic temperature invalidation every 10 seconds
- Reports maximum temperature across all sensors
Status and Fault Reporting: Comprehensive status registers per PMBus specification
- STATUS_BYTE, STATUS_WORD: Overall unit status
- STATUS_VOUT, STATUS_IOUT: Per-channel output status
- STATUS_INPUT: Input voltage/current status
- STATUS_TEMPERATURE: Temperature status
- STATUS_CML: Communication and memory status
- STATUS_MFR_SPECIFIC: Manufacturer-specific status
Hardware Details
Power Management Controller:
- Chip: Linear Technology LTC3889
- I²C Address: 0x4F (7-bit)
- Channels: 2 independent DC/DC converters (CH1, CH2)
- Communication: PMBus over I²C
- Silicon Revision: 2.0
Power Specifications:
- Maximum Power per Channel: 60W
- Switching Frequency: Configurable via FREQUENCY_SWITCH register
- Voltage Protection Levels (configurable):
- Overvoltage Fault Limit: +20% of nominal
- Overvoltage Warning Limit: +10% of nominal
- Margin High: +5% of nominal
- Margin Low: -5% of nominal
- Undervoltage Warning Limit: -10% of nominal
- Undervoltage Fault Limit: -20% of nominal
- Power Good On: -10% of nominal
- Power Good Off: -20% of nominal
Current Sensing:
- Sense Resistor: External (typically 0.1mΩ for input monitoring)
- Calibration: Per-channel gain and temperature coefficient
- Overcurrent Warning Limit: Configurable (default 5A)
Channel Naming Convention
All channels follow the naming pattern: {ModuleIndex}.ESH10000533.{Address}.{ChannelName}
Where:
{ModuleIndex}is the position of the module in the system (e.g., 0, 1, 2...)ESH10000533is the module type identifier{Address}is the PMBus device address (0x4F){ChannelName}is the specific PMBus register/command name
Examples:
- Global register:
0.ESH10000533.0x4F.VIN_ON - CH1 register:
0.ESH10000533.0x4F.CH1.VOUT_COMMAND - CH2 register:
0.ESH10000533.0x4F.CH2.READ_IOUT - Calibration:
0.ESH10000533.CALIBRATION
User-Accessible Channels
The module exposes approximately ~100 PMBus registers as user-accessible channels, organized into three categories:
Global Channels (Applied to entire PSU)
| Channel Name | Code | Access | Description |
|---|---|---|---|
| PAGE | 0x00 | RW | Channel/page selector (0=CH1, 1=CH2) |
| CAPABILITY | 0x19 | RO | PMBus protocol capabilities |
| FREQUENCY_SWITCH | 0x33 | RW | Switching frequency (kHz) |
| VIN_ON | 0x35 | RW | Input voltage threshold to enable conversion (V) |
| VIN_OFF | 0x36 | RW | Input voltage threshold to disable conversion (V) |
| VIN_OV_FAULT_LIMIT | 0x55 | RW | Input overvoltage fault limit (V) |
| VIN_UV_WARN_LIMIT | 0x58 | RW | Input undervoltage warning limit (V) |
| IIN_OC_WARN_LIMIT | 0x5D | RW | Input overcurrent warning limit (A) |
| STATUS_INPUT | 0x7C | RO | Input voltage/current status register |
| STATUS_CML | 0x7E | RO | Communication and memory status |
| READ_VIN | 0x88 | RO | Input voltage measurement (V) |
| READ_IIN | 0x89 | RO | Input current measurement (A) |
| READ_TEMPERATURE_1 | 0x8D | RO | Temperature sensor 1 reading (°C) |
| READ_TEMPERATURE_2 | 0x8E | RO | Temperature sensor 2 reading (°C) |
| MFR_IIN_CAL_GAIN | Mfr | RW | Input current calibration gain (mΩ) |
| ProjectConfig | Special | WO | PMBus project configuration (Base64 encoded) |
| SET_TO_RAM | Special | WO | Apply configuration to RAM (trigger) |
| CLEAR_ERRORS | Special | WO | Clear fault conditions (trigger) |
Per-Channel Registers (CH1 and CH2)
Each channel (CH1, CH2) has the following registers:
Control Registers:
| Channel Name | Code | Access | Description |
|---|---|---|---|
| OPERATION | 0x01 | RW | Operating mode (On/Off, Margin High/Low) |
| ON_OFF_CONFIG | 0x02 | RW | CONTROL pin and PMBus command settings |
| VOUT_MODE | 0x20 | RO | Output voltage data format (L16) |
| VOUT_COMMAND | 0x21 | RW | Output voltage setpoint (V) |
| VOUT_MAX | 0x24 | RW | Maximum allowed output voltage (V) |
| VOUT_MARGIN_HIGH | 0x25 | RW | Margin high voltage setting (V) |
| VOUT_MARGIN_LOW | 0x26 | RW | Margin low voltage setting (V) |
| VOUT_TRANSITION_RATE | 0x27 | RW | Voltage slew rate (V/ms) |
Current Configuration:
| Channel Name | Code | Access | Description |
|---|---|---|---|
| IOUT_CAL_GAIN | 0x38 | RW | Current sense resistor value (mΩ) |
| IOUT_OC_FAULT_LIMIT | 0x46 | RW | Output overcurrent fault limit (A) |
| IOUT_OC_FAULT_RESPONSE | 0x47 | RW | Overcurrent fault action |
| IOUT_OC_WARN_LIMIT | 0x4A | RW | Output overcurrent warning limit (A) |
| MFR_IOUT_CAL_GAIN_TC | Mfr | RW | Current cal temperature coefficient (ppm/°C) |
Voltage Protection:
| Channel Name | Code | Access | Description |
|---|---|---|---|
| VOUT_OV_FAULT_LIMIT | 0x40 | RW | Output overvoltage fault limit (V) |
| VOUT_OV_FAULT_RESPONSE | 0x41 | RW | Overvoltage fault action |
| VOUT_OV_WARN_LIMIT | 0x42 | RW | Output overvoltage warning limit (V) |
| VOUT_UV_WARN_LIMIT | 0x43 | RW | Output undervoltage warning limit (V) |
| VOUT_UV_FAULT_LIMIT | 0x44 | RW | Output undervoltage fault limit (V) |
| VOUT_UV_FAULT_RESPONSE | 0x45 | RW | Undervoltage fault action |
Temperature Protection:
| Channel Name | Code | Access | Description |
|---|---|---|---|
| OT_FAULT_LIMIT | 0x4F | RW | Overtemperature fault limit (°C) |
| OT_FAULT_RESPONSE | 0x50 | RW | Overtemperature fault action |
| OT_WARN_LIMIT | 0x51 | RW | Overtemperature warning limit (°C) |
| UT_FAULT_LIMIT | 0x53 | RW | Undertemperature fault limit (°C) |
| UT_FAULT_RESPONSE | 0x54 | RW | Undertemperature fault action |
Timing Configuration:
| Channel Name | Code | Access | Description |
|---|---|---|---|
| TON_DELAY | 0x60 | RW | Turn-on delay (ms) |
| TON_RISE | 0x61 | RW | Turn-on rise time (ms) |
| TON_MAX_FAULT_LIMIT | 0x62 | RW | Maximum startup time before fault (ms) |
| TON_MAX_FAULT_RESPONSE | 0x63 | RW | TON_MAX fault action |
| TOFF_DELAY | 0x64 | RW | Turn-off delay (ms) |
| TOFF_FALL | 0x65 | RW | Turn-off fall time (ms) |
| TOFF_MAX_WARN_LIMIT | 0x66 | RW | Maximum shutdown decay time (ms) |
Status Registers (Read-Only):
| Channel Name | Code | Access | Description |
|---|---|---|---|
| STATUS_BYTE | 0x78 | RO | One-byte fault summary |
| STATUS_WORD | 0x79 | RO | Two-byte fault summary |
| STATUS_VOUT | 0x7A | RO | Output voltage fault/warning status |
| STATUS_IOUT | 0x7B | RO | Output current fault/warning status |
| STATUS_TEMPERATURE | 0x7D | RO | Temperature fault/warning status |
| STATUS_MFR_SPECIFIC | 0x80 | RO | Manufacturer-specific status |
Telemetry Registers (Read-Only):
| Channel Name | Code | Access | Description |
|---|---|---|---|
| READ_VOUT | 0x8B | RO | Output voltage measurement (V) |
| READ_IOUT | 0x8C | RO | Output current measurement (A) |
| READ_POUT | 0x96 | RO | Output power measurement (W) |
| READ_DUTY_CYCLE | 0x94 | RO | PWM duty cycle (%) |
Special Channels
| Channel Name | Type | Access | Description |
|---|---|---|---|
| CALIBRATION | Calibration | RW | Module calibration table (Base64 encoded) |
Total User-Accessible Channels: ~100 (38 global + ~59 per channel × 2 channels + special channels)
Channel Configuration
Setting Output Voltage
The primary use case is controlling output voltage via VOUT_COMMAND:
// Set CH1 output to 3.3V
SetValues(
new[] { "0.ESH10000533.0x4F.CH1.VOUT_COMMAND" },
new[] { "3.3" }
);
// Set CH2 output to 5.0V
SetValues(
new[] { "0.ESH10000533.0x4F.CH2.VOUT_COMMAND" },
new[] { "5.0" }
);
Reading Telemetry
Monitor voltage, current, and power output:
// Read CH1 output voltage and current
string[] values = GetValues(new[] {
"0.ESH10000533.0x4F.CH1.READ_VOUT",
"0.ESH10000533.0x4F.CH1.READ_IOUT",
"0.ESH10000533.0x4F.CH1.READ_POUT"
});
double voltage = double.Parse(values[0]); // Volts
double current = double.Parse(values[1]); // Amps
double power = double.Parse(values[2]); // Watts
Enabling/Disabling Channels
Control channel operation via OPERATION register:
// Turn CH1 ON (0x80 = On, immediate)
SetValues(
new[] { "0.ESH10000533.0x4F.CH1.OPERATION" },
new[] { "0x80" }
);
// Turn CH1 OFF (0x00 = Off, immediate)
SetValues(
new[] { "0.ESH10000533.0x4F.CH1.OPERATION" },
new[] { "0x00" }
);
Configuring Protection Limits
Set overcurrent protection:
// Set CH1 overcurrent warning to 4.5A
SetValues(
new[] { "0.ESH10000533.0x4F.CH1.IOUT_OC_WARN_LIMIT" },
new[] { "4.5" }
);
// Set CH1 overvoltage fault to 3.6V (for 3.3V nominal)
SetValues(
new[] { "0.ESH10000533.0x4F.CH1.VOUT_OV_FAULT_LIMIT" },
new[] { "3.6" }
);
PMBus Register Access
PMBus registers use Linear11 (L11) or Linear16 (L16) data formats. The module handles conversion automatically:
- L16: Used for VOUT registers (voltage)
- L11: Used for most other registers (current, power, temperature)
- Reg: Binary register values (for control/status registers)
Calibration Channel
The CALIBRATION channel provides access to persistent calibration data:
Calibration Table Structure:
// Default calibration values:
CH1.IOUT_CAL_GAIN = 2.000 mΩ // Current sense resistor
CH2.IOUT_CAL_GAIN = 2.000 mΩ
CH1.MFR_IOUT_CAL_GAIN_TC = 50 ppm/°C // Temperature coefficient
CH2.MFR_IOUT_CAL_GAIN_TC = 50 ppm/°C
MFR_IIN_CAL_GAIN = 2.000 mΩ // Input current sense
CH1.IOUT_OC_WARN_LIMIT = 5.000 A // Overcurrent warning
CH2.IOUT_OC_WARN_LIMIT = 5.000 A
Reading Calibration Data:
string[] values = GetValues(new[] { "0.ESH10000533.CALIBRATION" });
CalibrationTable cal = SerializableHelpers.CreateFromBase64<CalibrationTable>(values[0]);
foreach (var row in cal.CalData)
{
Console.WriteLine($"{row.Key}: Gain={row.Gain}, Offset={row.Offset}");
}
Updating Calibration Data:
// Modify only gain and offset values in the table
cal["CH1.IOUT_CAL_GAIN"].Gain = 2.05; // Adjusted for actual resistor value
cal["CH1.MFR_IOUT_CAL_GAIN_TC"].Gain = 48; // Measured temperature coefficient
// Write back
string base64Cal = SerializableHelpers.AsBase64(cal);
SetValues(
new[] { "0.ESH10000533.CALIBRATION" },
new[] { base64Cal }
);
Important: The module automatically applies calibration values to the hardware registers on startup and after calibration updates.
Internal Channels (Not User-Accessible)
The following PMBus registers are marked as HIDDEN and not exposed to users:
- CLEAR_FAULTS (0x03): Use CLEAR_ERRORS special channel instead
- WRITE_PROTECT (0x10): Internal write protection control
- STORE_USER_ALL (0x15): EEPROM storage
- RESTORE_USER_ALL (0x16): EEPROM restore
- SMBALERT_MASK (0x1B): Alert masking
- Various manufacturer-specific internal registers
These channels are used internally by the module for configuration and fault management.
Programming Interface
Basic Power Output Control:
// Set CH1 to 1.8V, CH2 to 3.3V
SetValues(
new[] {
"0.ESH10000533.0x4F.CH1.VOUT_COMMAND",
"0.ESH10000533.0x4F.CH2.VOUT_COMMAND"
},
new[] { "1.8", "3.3" }
);
// Enable both channels
SetValues(
new[] {
"0.ESH10000533.0x4F.CH1.OPERATION",
"0.ESH10000533.0x4F.CH2.OPERATION"
},
new[] { "0x80", "0x80" } // On, immediate
);
Comprehensive Monitoring:
// Read all telemetry for CH1
string[] ch1Telemetry = GetValues(new[] {
"0.ESH10000533.0x4F.CH1.READ_VOUT",
"0.ESH10000533.0x4F.CH1.READ_IOUT",
"0.ESH10000533.0x4F.CH1.READ_POUT",
"0.ESH10000533.0x4F.READ_TEMPERATURE_1",
"0.ESH10000533.0x4F.READ_VIN",
"0.ESH10000533.0x4F.READ_IIN"
});
double vout = double.Parse(ch1Telemetry[0]);
double iout = double.Parse(ch1Telemetry[1]);
double pout = double.Parse(ch1Telemetry[2]);
double temp = double.Parse(ch1Telemetry[3]);
double vin = double.Parse(ch1Telemetry[4]);
double iin = double.Parse(ch1Telemetry[5]);
Console.WriteLine($"CH1: {vout}V @ {iout}A = {pout}W, Temp: {temp}°C");
Console.WriteLine($"Input: {vin}V @ {iin}A");
Fault Status Checking:
// Check for faults
string[] status = GetValues(new[] {
"0.ESH10000533.0x4F.CH1.STATUS_WORD",
"0.ESH10000533.0x4F.CH1.STATUS_VOUT",
"0.ESH10000533.0x4F.CH1.STATUS_IOUT"
});
// Parse status registers (implementation depends on PMBus handler)
ushort statusWord = ushort.Parse(status[0]);
byte statusVout = byte.Parse(status[1]);
byte statusIout = byte.Parse(status[2]);
if ((statusWord & 0x0010) != 0) // VOUT fault bit
Console.WriteLine("Output voltage fault detected!");
if ((statusWord & 0x0080) != 0) // IOUT/POUT fault bit
Console.WriteLine("Output current fault detected!");
Clearing Faults:
// Clear all fault conditions
SetValues(
new[] { "0.ESH10000533.0x4F.CLEAR_ERRORS" },
new[] { Guid.NewGuid().ToString() } // Trigger channel
);
Margin Testing:
// Configure margin high/low for CH1 (3.3V nominal)
SetValues(
new[] {
"0.ESH10000533.0x4F.CH1.VOUT_COMMAND",
"0.ESH10000533.0x4F.CH1.VOUT_MARGIN_HIGH",
"0.ESH10000533.0x4F.CH1.VOUT_MARGIN_LOW"
},
new[] { "3.3", "3.465", "3.135" } // ±5%
);
// Switch to margin high
SetValues(
new[] { "0.ESH10000533.0x4F.CH1.OPERATION" },
new[] { "0x98" } // On, margin high
);
// Switch to margin low
SetValues(
new[] { "0.ESH10000533.0x4F.CH1.OPERATION" },
new[] { "0xA8" } // On, margin low
);
// Return to normal
SetValues(
new[] { "0.ESH10000533.0x4F.CH1.OPERATION" },
new[] { "0x80" } // On, immediate
);
Error Handling
The module provides comprehensive error detection and reporting:
Voltage Faults:
- Overvoltage fault (VOUT > VOUT_OV_FAULT_LIMIT)
- Overvoltage warning (VOUT > VOUT_OV_WARN_LIMIT)
- Undervoltage warning (VOUT < VOUT_UV_WARN_LIMIT)
- Undervoltage fault (VOUT < VOUT_UV_FAULT_LIMIT)
Current Faults:
- Overcurrent fault (IOUT > IOUT_OC_FAULT_LIMIT)
- Overcurrent warning (IOUT > IOUT_OC_WARN_LIMIT)
Temperature Faults:
- Overtemperature fault (Temp > OT_FAULT_LIMIT)
- Overtemperature warning (Temp > OT_WARN_LIMIT)
- Undertemperature fault (Temp < UT_FAULT_LIMIT)
- Module-level warnings at 60°C, errors at 90°C
Input Faults:
- Input overvoltage fault (VIN > VIN_OV_FAULT_LIMIT)
- Input undervoltage warning (VIN < VIN_UV_WARN_LIMIT)
- Input overcurrent warning (IIN > IIN_OC_WARN_LIMIT)
Startup Faults:
- TON_MAX fault: Output failed to reach regulation within TON_MAX_FAULT_LIMIT
Fault Responses: Each fault type has a configurable response register that determines the action:
- Ignore (continue operating)
- Shutdown (disable output)
- Shutdown and retry
- Shutdown and latch off (requires CLEAR_ERRORS to recover)
Best Practices
- Always check input voltage before enabling outputs: Verify VIN is within VIN_ON and VIN_OFF thresholds
- Set appropriate protection limits: Configure VOUT_OV_FAULT_LIMIT and IOUT_OC_WARN_LIMIT for your application
- Monitor STATUS registers: Regularly poll STATUS_WORD and STATUS_VOUT/IOUT for fault detection
- Use calibration for accuracy: Load and verify calibration data for precise current measurements
- Clear faults after configuration changes: Use CLEAR_ERRORS after modifying limits to reset fault latches
- Apply configuration to RAM: After loading project config, trigger SET_TO_RAM to activate settings
- Monitor temperature: The module reports max temperature across both sensors; ensure adequate cooling
- Use margin testing for validation: Utilize VOUT_MARGIN_HIGH/LOW for power supply acceptance testing
- Implement proper sequencing: Use TON_DELAY and TOFF_DELAY for multi-rail power sequencing
- Handle PMBus exceptions: PMBus operations can fail; implement retry logic with timeouts
Module Initialization Sequence
On Reset(), the module performs the following initialization:
- Call base.Reset() to clear channels and initialize PMBus handler
- Load project configuration file:
psu_r0.2.proj- Contains LTC3889 chip configuration
- Defines register default values
- Configures CH1 and CH2 pages
- Write project configuration to ProjectConfig channel (Base64 encoded)
- Trigger SET_TO_RAM to apply configuration to device RAM
- Clear any existing fault conditions via CLEAR_ERRORS
- Load calibration table from persistent storage
- Create default calibration if none exists
- Default values: 2mΩ sense resistors, 50ppm/°C TC, 5A OC warning
- Apply calibration values to hardware registers
- Create CALIBRATION channel for user access to calibration data
Post-Reset State:
- All PMBus registers accessible as channels
- Device configured per project file defaults
- Calibration factors loaded and applied
- Outputs disabled (require OPERATION command to enable)
- Faults cleared and ready for operation
Temperature Monitoring
The module implements the ITempReporter interface for system-level temperature monitoring:
Temperature Reporting:
- Device Name: PSU1, PSU2, etc. (based on module instance)
- Warning Threshold: 60°C
- Error Threshold: 90°C
- Update Interval: 10 seconds (via Invalidate() method)
Temperature Sources:
- READ_TEMPERATURE_1: Primary temperature sensor
- READ_TEMPERATURE_2: Secondary temperature sensor
- Reports the maximum of all temperature sensors
Integration: Temperature data is automatically reported to the system thermal management subsystem for monitoring and protection.
Revision History
- ESH10000533: Current production version
- Based on Linear Technology LTC3889 PMBus controller
- Dual independent channels (CH1, CH2)
- Maximum 60W per channel
- I²C address: 0x4F
- Silicon revision: 2.0
- Project file: psu_r0.2.proj
- Calibration support for current sensing
- Temperature monitoring and reporting
- Comprehensive PMBus register access (~100 channels)