ESH10000534 - PoE M.2 Module
Overview
The ESH10000534 is a compact IEEE 802.3bt-compliant Power over Ethernet (PoE) Power Sourcing Equipment (PSE) controller module in M.2 form factor, providing single-port PoE power delivery with integrated telemetry monitoring and LED status indication.
Description
The PoE M.2 module delivers up to 90W (Class 8, Type 4) PoE power to connected Powered Devices (PDs) through a single Ethernet port using four differential pairs. The module features comprehensive PoE management through the Texas Instruments TPS23881 PSE controller with full IEEE 802.3bt compliance, real-time current and voltage monitoring via the LTC2992 power monitor, and visual status indication through four RGB LEDs.
Key Features:
IEEE 802.3bt Compliant: Full support for 802.3af/at/bt standards
- Single port configuration (4 pairs, channels 1-2)
- Up to 90W power delivery (Class 8, Type 4 / QP90W)
- Automatic classification and detection
- Auto-class support for precise power negotiation
Comprehensive PoE Control: Via TPS23881 PSE controller
- Per-pair power enable/disable control
- Detection and classification enable
- Configurable operating modes (Auto/Semi-Auto/Manual)
- Disconnect detection
- Overcurrent and overload protection (tOVLD, tLIM monitoring)
- Start-up fault detection (tSTART monitoring)
- Power priority and allocation configuration
Real-Time Telemetry: Via LTC2992 power monitor
- Dual-channel current measurement (0-3A per channel)
- Current min/max tracking with peak detection
- Total current summation
- Calculated power measurement per channel and total
- Input voltage monitoring (42-57V PoE range)
- One-shot peak clearing capability
Visual Status Indication: Via LP5012 RGB LED driver
- ETH_IN: Ethernet input status
- ETH_OUT_R: Right output status (PoE initialization feedback)
- ETH_OUT_L: Left output status (PoE operational feedback)
- VIN: Input voltage status (Green >42V, Red <42V)
- Color-coded operation states
Instrument Classification: Identified as
PoETesterinstrument type for test system integration
Hardware Details
TPS23881 PoE PSE Controller:
- Chip: Texas Instruments TPS23881
- I²C Address: 0x3E
- Channels: 2 active (4 pairs = 1 port)
- Standards: IEEE 802.3af/at/bt compliant
- Max Power: 90W (Class 8, Type 4)
- Communication: I²C bus
- Features:
- Automatic detection and classification
- Auto-class support (AAC)
- Quad-pair operation (90W delivery)
- Integrated MOSFETs
- Comprehensive fault protection
- Register-based configuration and monitoring
LTC2992 Power Monitor:
- Chip: Analog Devices (Linear Technology) LTC2992
- I²C Address: 0x6F
- Channels: 2 current sense inputs
- Current Range: 0-3A per channel (typical PoE range)
- GPIO1: ADC mode for VIN voltage measurement
- Voltage divider ratio: 280.48× (1MΩ + 3.57kΩ / 3.57kΩ)
- Measurement range: ~0-100V (PoE 42-57V nominal)
- GPIO3: General purpose output (low during operation)
- GPIO4: General purpose output (high during operation)
- Features:
- 12-bit ADC resolution
- Min/max value tracking
- Automatic peak detection
- Delta-sigma ADC architecture
LP5012 LED Driver:
- Chip: Texas Instruments LP5012
- I²C Address: 0x14
- Channels: 4 RGB LEDs (12 outputs)
- LEDs:
- ETH_IN (LED 0): Ethernet input indicator
- ETH_OUT_R (LED 1): PoE controller right status
- ETH_OUT_L (LED 2): PoE controller left status
- VIN (LED 3): Input voltage indicator
- Luminance Ratio: 0.2 (20% brightness)
- Communication: I²C bus
- Usage: System control only (not user-accessible)
Channel Naming Convention
All channels follow the naming pattern: {ModuleIndex}.ESH10000534.{ChannelName}
Where:
{ModuleIndex}is the position of the module in the system (e.g., 0, 1, 2...)ESH10000534is the module type identifier{ChannelName}is the specific channel name from the tables below
Example: Module at position 0, interrupt SUPF flag would be: 0.ESH10000534.InterruptRegister.SUPF
Note: TPS23881 register channels use hierarchical naming: {Register}.{Field}
User-Accessible Channels
Instrument Channel (1 channel)
| Channel Name | Type | Direction | Usage | Description |
|---|---|---|---|---|
| ESH10000534 | Instrument | N/A | UserAllocatable | PoETester instrument classification |
Total Instrument Channels: 1
Telemetry Channels (11 channels)
Power monitoring channels from LTC2992:
| Channel Name | Type | Direction | Device | Unit | Usage | Description |
|---|---|---|---|---|---|---|
| TELEMETRY.CURRENT1 | Analog | IN | LTC2992 | A | UserAllocatable | Channel 1 (pair 1-2) current measurement |
| TELEMETRY.CURRENT2 | Analog | IN | LTC2992 | A | UserAllocatable | Channel 2 (pair 3-4) current measurement |
| TELEMETRY.MAX_CURRENT1 | Analog | IN | LTC2992 | A | UserAllocatable | Channel 1 maximum current (peak tracking) |
| TELEMETRY.MAX_CURRENT2 | Analog | IN | LTC2992 | A | UserAllocatable | Channel 2 maximum current (peak tracking) |
| TELEMETRY.MIN_CURRENT1 | Analog | IN | LTC2992 | A | UserAllocatable | Channel 1 minimum current (valley tracking) |
| TELEMETRY.MIN_CURRENT2 | Analog | IN | LTC2992 | A | UserAllocatable | Channel 2 minimum current (valley tracking) |
| TELEMETRY.CURRENT_SUM | Analog | IN | LTC2992 | A | UserAllocatable | Total current (CURRENT1 + CURRENT2) |
| TELEMETRY.POWER1 | Analog | IN | Calculated | W | UserAllocatable | Channel 1 power (CURRENT1 × InputVoltage) |
| TELEMETRY.POWER2 | Analog | IN | Calculated | W | UserAllocatable | Channel 2 power (CURRENT2 × InputVoltage) |
| TELEMETRY.POWER_SUM | Analog | IN | Calculated | W | UserAllocatable | Total power (POWER1 + POWER2) |
| TELEMETRY.CLEAR_PEAKS | Digital | OUT | LTC2992 | - | UserAllocatable | Clear min/max peak tracking (write true) |
Total Telemetry Channels: 11
TPS23881 Register Channels
The TPS23881 PSE controller exposes numerous configuration and monitoring channels through its register map. Channels are organized by register category for clarity.
Interrupt and Event Monitoring (12 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| InterruptRegister | SUPF | Digital | IN | Supply Event Fault or SRAM memory fault occurred |
| InterruptRegister | STRTF | Digital | IN | tSTART Fault occurred on at least one channel |
| InterruptRegister | IFAULT | Digital | IN | tOVLD or tLIM Fault occurred on at least one channel |
| InterruptRegister | CLAC | Digital | IN | Classification cycle occurred on at least one channel |
| InterruptRegister | DETC | Digital | IN | Detection cycle occurred on at least one channel |
| InterruptRegister | DISF | Digital | IN | Disconnect event occurred on at least one channel |
| InterruptRegister | PGC | Digital | IN | Power good status change occurred on at least one channel |
| InterruptRegister | PEC | Digital | IN | Power enable status change occurred on at least one channel |
| PowerEventRegister | PGC1 | Digital | IN | Channel 1 power good status change |
| PowerEventRegister | PEC1 | Digital | IN | Channel 1 power enable status change |
| PowerEventRegister | PGC2 | Digital | IN | Channel 2 power good status change |
| PowerEventRegister | PEC2 | Digital | IN | Channel 2 power enable status change |
Detection and Classification Events (8 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| DetectionEventRegister | DETC1 | Digital | IN | Channel 1 detection event occurred |
| DetectionEventRegister | DETC2 | Digital | IN | Channel 2 detection event occurred |
| DetectionEventRegister | CLAC1 | Digital | IN | Channel 1 classification event occurred |
| DetectionEventRegister | CLAC2 | Digital | IN | Channel 2 classification event occurred |
| DetectionEventRegister | DISF1 | Digital | IN | Channel 1 disconnect fault occurred |
| DetectionEventRegister | DISF2 | Digital | IN | Channel 2 disconnect fault occurred |
| DetectionEventRegister | DETAS1 | Digital | IN | Channel 1 detection assessment complete |
| DetectionEventRegister | DETAS2 | Digital | IN | Channel 2 detection assessment complete |
Fault Event Monitoring (8 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| FaultEventRegister | TSD | Digital | IN | Thermal shutdown occurred |
| FaultEventRegister | OVLO | Digital | IN | Over/under voltage lockout occurred |
| FaultEventRegister | UVLO | Digital | IN | Under voltage lockout occurred |
| FaultEventRegister | OSC | Digital | IN | Short circuit fault occurred |
| FaultEventRegister | IFAULT4 | Digital | IN | Channel 4 current fault (not used, 2-channel config) |
| FaultEventRegister | IFAULT3 | Digital | IN | Channel 3 current fault (not used, 2-channel config) |
| FaultEventRegister | IFAULT2 | Digital | IN | Channel 2 current fault (tOVLD/tLIM exceeded) |
| FaultEventRegister | IFAULT1 | Digital | IN | Channel 1 current fault (tOVLD/tLIM exceeded) |
Start/Current Limit Faults (6 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| StartIlimEventRegister | ILIM2 | Digital | IN | Channel 2 ILIM fault occurred |
| StartIlimEventRegister | ILIM1 | Digital | IN | Channel 1 ILIM fault occurred |
| StartIlimEventRegister | START4 | Digital | IN | Channel 4 tSTART fault (not used) |
| StartIlimEventRegister | START3 | Digital | IN | Channel 3 tSTART fault (not used) |
| StartIlimEventRegister | START2 | Digital | IN | Channel 2 tSTART fault occurred |
| StartIlimEventRegister | START1 | Digital | IN | Channel 1 tSTART fault occurred |
Supply Fault Events (4 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| SupplyFaultEventRegister | VPUV | Digital | IN | VDD under-voltage fault |
| SupplyFaultEventRegister | VDUV | Digital | IN | VDD digital under-voltage fault |
| SupplyFaultEventRegister | TSD | Digital | IN | Thermal shutdown event |
| SupplyFaultEventRegister | SRAMF | Digital | IN | SRAM fault detected |
Power Status (12 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| PowerStatusRegister | PG4 | Digital | IN | Channel 4 power good (not used) |
| PowerStatusRegister | PG3 | Digital | IN | Channel 3 power good (not used) |
| PowerStatusRegister | PG2 | Digital | IN | Channel 2 power good status |
| PowerStatusRegister | PG1 | Digital | IN | Channel 1 power good status |
| PowerStatusRegister | STATPWR4 | Digital | IN | Channel 4 power status (not used) |
| PowerStatusRegister | STATPWR3 | Digital | IN | Channel 3 power status (not used) |
| PowerStatusRegister | STATPWR2 | Digital | IN | Channel 2 power status |
| PowerStatusRegister | STATPWR1 | Digital | IN | Channel 1 power status |
| PowerStatusRegister | FOUR_PAIR4 | Digital | IN | Channel 4 four-pair status (not used) |
| PowerStatusRegister | FOUR_PAIR3 | Digital | IN | Channel 3 four-pair status (not used) |
| PowerStatusRegister | FOUR_PAIR2 | Digital | IN | Channel 2 four-pair mode active |
| PowerStatusRegister | FOUR_PAIR1 | Digital | IN | Channel 1 four-pair mode active |
Pin Status (5 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| PinStatusRegister | PWGD | Digital | IN | Power good indicator |
| PinStatusRegister | FWFLT | Digital | IN | Firmware fault status |
| PinStatusRegister | PGDET | Digital | IN | Power good detection status |
| PinStatusRegister | SMDAT | Digital | IN | SMDAT pin status |
| PinStatusRegister | NFLT | Digital | IN | Fault output pin status |
Operating Mode Configuration (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| OperatingModeRegister | CH1 | Enumeration | IN/OUT | Channel 1 operating mode (Auto/SemiAuto/Manual/...) |
| OperatingModeRegister | CH2 | Enumeration | IN/OUT | Channel 2 operating mode (Auto/SemiAuto/Manual/...) |
Power Enable Control (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| PowerEnableRegister | CH1 | Digital | IN/OUT | Channel 1 power enable (true=enabled) |
| PowerEnableRegister | CH2 | Digital | IN/OUT | Channel 2 power enable (true=enabled) |
Disconnect Enable Control (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| DisconnectEnableRegister | CH1 | Digital | IN/OUT | Channel 1 disconnect detection enable |
| DisconnectEnableRegister | CH2 | Digital | IN/OUT | Channel 2 disconnect detection enable |
Detection/Classification Enable (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| DetectClassEnableRegister | CH1 | Digital | IN/OUT | Channel 1 detection and classification enable |
| DetectClassEnableRegister | CH2 | Digital | IN/OUT | Channel 2 detection and classification enable |
Port Power Allocation (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| PortPowerAllocationRegister | CH1 | Enumeration | IN/OUT | Channel 1 power class allocation (QP90W/...) |
| PortPowerAllocationRegister | CH2 | Enumeration | IN/OUT | Channel 2 power class allocation (QP90W/...) |
Auto-Class Control (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| AutoclassCtrlRegister | AAC1 | Digital | IN/OUT | Channel 1 auto-class enable |
| AutoclassCtrlRegister | AAC2 | Digital | IN/OUT | Channel 2 auto-class enable |
Current Measurement (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| ChannelCurrentRegister | CH1_CURRENT | Analog (Float) | IN | Channel 1 measured current (mA) |
| ChannelCurrentRegister | CH2_CURRENT | Analog (Float) | IN | Channel 2 measured current (mA) |
Voltage Measurement (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| ChannelVoltageRegister | CH1_VOLTAGE | Analog (Float) | IN | Channel 1 output voltage (V) |
| ChannelVoltageRegister | CH2_VOLTAGE | Analog (Float) | IN | Channel 2 output voltage (V) |
Global Monitoring (3 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| TemperatureRegister | Value | Analog | IN | Die temperature (°C) |
| InputVoltageRegister | Value | Analog (Float) | IN | Input supply voltage (V) |
| IdRegister | Value | Digital | IN | Device ID register |
Device Information (2 channels):
| Register | Channel Name | Type | Direction | Description |
|---|---|---|---|---|
| FirmwareRevisionRegister | Value | Digital | IN | Firmware revision number |
| DeviceIdRegister | Value | Digital | IN | Device identifier |
Additional Registers: The TPS23881 provides numerous additional configuration registers including timing configuration, power priority, reset control, connection check, disconnect policing, capacitance detection, power-on fault configuration, remapping, foldback selection, I²C watchdog, detection resistance, detected capacitance, assigned class, and auto-class channel power. Each register exposes field-level channels following the pattern {RegisterName}.{FieldName}.
Total TPS23881 Channels (2-channel configuration): ~100+ channels (exact count depends on all register field expansions)
LED Status Indication
The module provides visual feedback through four RGB LEDs:
| LED | Location | Default Color on Reset | PoE Success | PoE Failure | VIN Status |
|---|---|---|---|---|---|
| ETH_IN | Ethernet input | Black (off) | Black | Black | - |
| ETH_OUT_R | Right PoE output | Blue | Green | Red | - |
| ETH_OUT_L | Left PoE output | Blue | Yellow | Red | - |
| VIN | Power input | Blue | Green (>42V) | Red (<42V) | Voltage indicator |
LED Behavior During Initialization:
- Pre-Reset: All LEDs undefined
- LED Setup: ETH_IN=Black, ETH_OUT_R=Blue, ETH_OUT_L=Blue, VIN=Blue
- LTC2992 Setup: LEDs unchanged
- VIN Check: VIN changes to Green (>42V) or Red (<42V)
- PoE Setup Success: ETH_OUT_R=Green, ETH_OUT_L=Yellow, VIN=Green
- PoE Setup Failure: ETH_OUT_R=Red, ETH_OUT_L=Red, VIN=Green (if voltage OK)
LED Behavior During Operation:
- SetValues: ETH_OUT_R=Yellow, ETH_OUT_L=Green
- After SetValues: ETH_OUT_R=Green, ETH_OUT_L=Yellow
- GetValues: ETH_OUT_R=Blue, ETH_OUT_L=Blue
- After GetValues: ETH_OUT_R=Green, ETH_OUT_L=Yellow
Internal Channels (Not User-Accessible)
The following channels are used for internal system control and are hidden from users:
- LP5012 LED Channels (all
HiddenSystemControl):- ETH_IN_R/G/B: Ethernet input LED RGB control
- ETH_OUT_R_R/G/B: Right output LED RGB control
- ETH_OUT_L_R/G/B: Left output LED RGB control
- VIN_R/G/B: Input voltage LED RGB control
- Total: 12 LED control channels
Channel Configuration
PoE Operating Modes
Configure PoE channel operating modes:
ConfigureChannels(new[] {
new Channel {
NetName = "0.ESH10000534.OperatingModeRegister.CH1",
Value = "Auto" // Options: Auto, SemiAuto, Manual, Shutdown
}
});
Operating Mode Options:
- Auto: Automatic detection, classification, and power delivery
- SemiAuto: Semi-automatic operation (manual intervention required)
- Manual: Full manual control of detection and power states
- Shutdown: Channel disabled
Power Allocation
Set maximum power allocation per port:
SetValues(
new[] {
"0.ESH10000534.PortPowerAllocationRegister.CH1",
"0.ESH10000534.PortPowerAllocationRegister.CH2"
},
new[] { "QP90W", "QP90W" } // Class 8, 90W per pair set
);
Power Class Options:
- QP90W: Class 8, Type 4 (90W)
- QP75W: Class 7, Type 4 (75W)
- QP60W: Class 6, Type 4 (60W)
- DP30W: Dual pair 30W (802.3at)
- Additional 802.3af/at/bt classes available
Programming Interface
Basic PoE Initialization
// Set channel 1 and 2 to Auto mode with 90W allocation
SetValues(
new[] {
"0.ESH10000534.OperatingModeRegister.CH1",
"0.ESH10000534.OperatingModeRegister.CH2",
"0.ESH10000534.PortPowerAllocationRegister.CH1",
"0.ESH10000534.PortPowerAllocationRegister.CH2",
"0.ESH10000534.AutoclassCtrlRegister.AAC1",
"0.ESH10000534.AutoclassCtrlRegister.AAC2",
"0.ESH10000534.DisconnectEnableRegister.CH1",
"0.ESH10000534.DisconnectEnableRegister.CH2",
"0.ESH10000534.PowerEnableRegister.CH1",
"0.ESH10000534.PowerEnableRegister.CH2",
"0.ESH10000534.DetectClassEnableRegister.CH1",
"0.ESH10000534.DetectClassEnableRegister.CH2"
},
new[] {
"Auto", // CH1 operating mode
"Auto", // CH2 operating mode
"QP90W", // CH1 power allocation
"QP90W", // CH2 power allocation
"true", // CH1 auto-class enable
"true", // CH2 auto-class enable
"true", // CH1 disconnect detection
"true", // CH2 disconnect detection
"true", // CH1 power enable
"true", // CH2 power enable
"true", // CH1 detection/classification
"true" // CH2 detection/classification
}
);
// Read back configuration to verify
string[] values = GetValues(new[] {
"0.ESH10000534.PowerStatusRegister.PG1",
"0.ESH10000534.PowerStatusRegister.PG2",
"0.ESH10000534.ChannelCurrentRegister.CH1_CURRENT",
"0.ESH10000534.ChannelCurrentRegister.CH2_CURRENT"
});
bool powerGood1 = bool.Parse(values[0]);
bool powerGood2 = bool.Parse(values[1]);
float current1 = float.Parse(values[2]); // mA
float current2 = float.Parse(values[3]); // mA
Console.WriteLine($"CH1: PG={powerGood1}, I={current1}mA");
Console.WriteLine($"CH2: PG={powerGood2}, I={current2}mA");
Reading Telemetry
// Read comprehensive power telemetry
string[] telemetry = GetValues(new[] {
"0.ESH10000534.TELEMETRY.CURRENT1",
"0.ESH10000534.TELEMETRY.CURRENT2",
"0.ESH10000534.TELEMETRY.CURRENT_SUM",
"0.ESH10000534.TELEMETRY.POWER1",
"0.ESH10000534.TELEMETRY.POWER2",
"0.ESH10000534.TELEMETRY.POWER_SUM",
"0.ESH10000534.InputVoltageRegister.Value"
});
double current1 = double.Parse(telemetry[0]); // Amps
double current2 = double.Parse(telemetry[1]); // Amps
double currentSum = double.Parse(telemetry[2]); // Amps
double power1 = double.Parse(telemetry[3]); // Watts
double power2 = double.Parse(telemetry[4]); // Watts
double powerSum = double.Parse(telemetry[5]); // Watts
double inputVoltage = double.Parse(telemetry[6]); // Volts
Console.WriteLine($"Total Power: {powerSum:F2}W @ {inputVoltage:F1}V");
Console.WriteLine($" CH1: {power1:F2}W ({current1:F3}A)");
Console.WriteLine($" CH2: {power2:F2}W ({current2:F3}A)");
Peak Current Tracking
// Monitor peak currents over time
string[] peaks = GetValues(new[] {
"0.ESH10000534.TELEMETRY.MAX_CURRENT1",
"0.ESH10000534.TELEMETRY.MAX_CURRENT2",
"0.ESH10000534.TELEMETRY.MIN_CURRENT1",
"0.ESH10000534.TELEMETRY.MIN_CURRENT2"
});
double maxCurrent1 = double.Parse(peaks[0]);
double maxCurrent2 = double.Parse(peaks[1]);
double minCurrent1 = double.Parse(peaks[2]);
double minCurrent2 = double.Parse(peaks[3]);
Console.WriteLine($"CH1 Range: {minCurrent1:F3}A - {maxCurrent1:F3}A");
Console.WriteLine($"CH2 Range: {minCurrent2:F3}A - {maxCurrent2:F3}A");
// Clear peak tracking for new measurement period
SetValues(
new[] { "0.ESH10000534.TELEMETRY.CLEAR_PEAKS" },
new[] { "true" }
);
Fault Monitoring
// Check for PoE faults
string[] faults = GetValues(new[] {
"0.ESH10000534.InterruptRegister.SUPF",
"0.ESH10000534.InterruptRegister.STRTF",
"0.ESH10000534.InterruptRegister.IFAULT",
"0.ESH10000534.FaultEventRegister.IFAULT1",
"0.ESH10000534.FaultEventRegister.IFAULT2",
"0.ESH10000534.FaultEventRegister.TSD",
"0.ESH10000534.FaultEventRegister.OVLO"
});
bool supplyFault = bool.Parse(faults[0]);
bool startFault = bool.Parse(faults[1]);
bool currentFault = bool.Parse(faults[2]);
bool ch1CurrentFault = bool.Parse(faults[3]);
bool ch2CurrentFault = bool.Parse(faults[4]);
bool thermalShutdown = bool.Parse(faults[5]);
bool voltageOutOfRange = bool.Parse(faults[6]);
if (supplyFault) Console.WriteLine("WARNING: Supply or SRAM fault detected");
if (startFault) Console.WriteLine("WARNING: Start-up fault (tSTART exceeded)");
if (currentFault) Console.WriteLine("WARNING: Overcurrent fault (tOVLD/tLIM exceeded)");
if (thermalShutdown) Console.WriteLine("ERROR: Thermal shutdown occurred");
if (voltageOutOfRange) Console.WriteLine("ERROR: Input voltage out of range");
Event Detection
// Monitor PoE detection and classification events
string[] events = GetValues(new[] {
"0.ESH10000534.InterruptRegister.DETC",
"0.ESH10000534.InterruptRegister.CLAC",
"0.ESH10000534.InterruptRegister.DISF",
"0.ESH10000534.DetectionEventRegister.DETC1",
"0.ESH10000534.DetectionEventRegister.CLAC1",
"0.ESH10000534.DetectionEventRegister.DISF1"
});
bool detectionOccurred = bool.Parse(events[0]);
bool classificationOccurred = bool.Parse(events[1]);
bool disconnectOccurred = bool.Parse(events[2]);
bool ch1Detection = bool.Parse(events[3]);
bool ch1Classification = bool.Parse(events[4]);
bool ch1Disconnect = bool.Parse(events[5]);
if (ch1Detection) Console.WriteLine("CH1: PD detected");
if (ch1Classification) Console.WriteLine("CH1: PD classified");
if (ch1Disconnect) Console.WriteLine("CH1: PD disconnected");
Internal Operation
Module Initialization Sequence
The module follows this reset sequence:
public override void Reset()
{
// 1. Clear existing channels
m_Channels.Clear();
// 2. Add instrument channel (PoETester classification)
m_Channels.Add(new InstrumentChannel(..., InstrumentTypes.PoETester, ...));
// 3. Setup and initialize LP5012 LED driver
SetupLed();
UpdateLEDColor(LEDs.ETH_IN, Color.Black, true);
UpdateLEDColor(LEDs.ETH_OUT_R, Color.Blue, true);
UpdateLEDColor(LEDs.ETH_OUT_L, Color.Blue, true);
UpdateLEDColor(LEDs.VIN, Color.Blue, false); // Commits all LED updates
// 4. Setup LTC2992 power monitor
SetupLtc2992();
// - Configure GPIO1 as ADC (VIN voltage measurement)
// - Configure GPIO2 as disabled
// - Configure GPIO3 as output (set low)
// - Configure GPIO4 as output (set high)
// - Add 11 telemetry channels (CURRENT1/2, MAX/MIN, SUM, POWER, CLEAR_PEAKS)
// 5. Measure VIN voltage and check minimum requirement
double vpwr = tel.GPIO1_Value * 280.48; // Apply voltage divider ratio
Logger.Info($"Measured VIN voltage: {vpwr:F2} V");
bool pok = vpwr > 42.0; // Minimum voltage for PoE operation (42-57V range)
// 6. Attempt PoE controller initialization
bool poeOk = false;
try {
SetupPoe(poe1);
// - poe1.Reset() creates RegisterMap with all TPS23881 registers
// - Configure OperatingMode = Auto for CH1 and CH2
// - Configure PortPowerAllocation = QP90W for CH1 and CH2
// - Enable AutoClass (AAC) for CH1 and CH2
// - Enable DisconnectDetection for CH1 and CH2
// - Enable PowerEnable for CH1 and CH2
// - Enable DetectClassEnable for CH1 and CH2
// - poe1.Update() commits configuration to hardware
// - Add all TPS23881 register channels to m_Channels
poeOk = true;
}
catch (Exception ex) {
Logger.Error(ex);
base.Status.AddHardwareIssue(Error, "PoE Initialization failed");
}
// 7. Update LED status to indicate initialization result
UpdateLEDColor(LEDs.ETH_IN, Color.Black, true);
UpdateLEDColor(LEDs.ETH_OUT_R, poeOk ? Color.Green : Color.Red, true);
UpdateLEDColor(LEDs.ETH_OUT_L, poeOk ? Color.Yellow : Color.Red, true);
UpdateLEDColor(LEDs.VIN, pok ? Color.Green : Color.Red, false);
}
Critical Requirements:
- VIN voltage must exceed 42V for successful PoE operation
- If VIN < 42V, PoE initialization may fail (VIN LED shows Red)
- If PoE initialization fails, hardware issue is logged and status LEDs show Red
Power Calculation
Power values are calculated from current and voltage measurements:
// GetValues() implementation for power channels
var voltage = GetValFromPoe(InputVoltageRegister.Value); // In Volts
var current1 = tel.CURRENT1; // In Amps (LTC2992 measurement)
var current2 = tel.CURRENT2; // In Amps (LTC2992 measurement)
// Calculate power for each channel
POWER1 = current1 × voltage; // Watts
POWER2 = current2 × voltage; // Watts
POWER_SUM = (current1 + current2) × voltage; // Total watts
Note: Power calculations use:
- Voltage from TPS23881 InputVoltageRegister (PoE supply voltage)
- Current from LTC2992 (actual measured load current)
Best Practices
Verify VIN voltage: Always check VIN > 42V before expecting PoE operation
- Read
TELEMETRYchannels to get GPIO1_Value - Multiply by 280.48 to get actual voltage
- Confirm voltage in 42-57V range for PoE
- Read
Monitor initialization status: Check LED colors after reset
- VIN Green: Voltage OK (>42V)
- ETH_OUT_R/L Green/Yellow: PoE initialized successfully
- ETH_OUT_R/L Red: PoE initialization failed (check logs)
Use Auto mode for standard operation: Set
OperatingModeto "Auto" for automatic PD detection and power deliveryEnable auto-class: Set
AAC1andAAC2to true for precise power negotiation with IEEE 802.3bt PDsConfigure appropriate power allocation: Set
PortPowerAllocationRegisterto match expected PD power class- Use QP90W for Class 8 PDs (up to 90W)
- Use lower classes for lower-power devices to optimize efficiency
Monitor power telemetry: Regularly read
CURRENT_SUMandPOWER_SUMto track total power delivery- Current per channel: typically 0-2A for high-power PoE
- Total power: up to 90W for Class 8
Track peak currents: Use
MAX_CURRENT1/2andMIN_CURRENT1/2for inrush/dropout analysis- Clear peaks with
CLEAR_PEAKSat start of test periods
- Clear peaks with
Monitor fault conditions: Check interrupt and fault registers for abnormal conditions
SUPF: Supply fault or memory errorIFAULT: Overcurrent (tOVLD/tLIM exceeded)STRTF: Start-up fault (tSTART exceeded)TSD: Thermal shutdownOVLO/UVLO: Voltage out of range
Handle disconnect events: Monitor
DISFregister to detect PD disconnection- Automatic reconnection in Auto mode
- Manual intervention may be required in SemiAuto/Manual modes
Observe LED status during operation: LEDs provide real-time visual feedback
- Blue during GetValues (reading telemetry)
- Yellow/Green during normal operation
- Red indicates faults or failures
Power budget management: Sum of CH1 and CH2 power should not exceed port maximum (90W for QP90W)
Temperature monitoring: Read
TemperatureRegister.Valueto monitor TPS23881 die temperature- Ensure adequate cooling if operating near thermal limits
Module Information Summary
Module Type: ESH10000534 - PoE M.2 Module
Primary Function: IEEE 802.3bt PoE PSE Control and Power Delivery
Form Factor: M.2 module
PoE Standard: IEEE 802.3af/at/bt compliant
Max Power Delivery: 90W (Class 8, Type 4)
Port Configuration: Single port, 4-pair (channels 1-2)
Total User Channels: ~125 channels
- 1 Instrument channel
- 11 Telemetry channels (LTC2992)
- ~100+ TPS23881 register channels (configuration, monitoring, events)
Key Devices: - TPS23881 PoE PSE controller (I²C 0x3E)
- LTC2992 power monitor (I²C 0x6F)
- LP5012 RGB LED driver (I²C 0x14, system control) Telemetry: Real-time current (2 channels), voltage, power, min/max tracking Visual Indication: 4 RGB LEDs (ETH_IN, ETH_OUT_R, ETH_OUT_L, VIN) Operating Voltage: 42-57V input (PoE supply range)