Live demo — data resets daily at 03:00 UTC. Nothing you enter is saved. Server UI →

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 PoETester instrument 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...)
  • ESH10000534 is 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:

  1. Pre-Reset: All LEDs undefined
  2. LED Setup: ETH_IN=Black, ETH_OUT_R=Blue, ETH_OUT_L=Blue, VIN=Blue
  3. LTC2992 Setup: LEDs unchanged
  4. VIN Check: VIN changes to Green (>42V) or Red (<42V)
  5. PoE Setup Success: ETH_OUT_R=Green, ETH_OUT_L=Yellow, VIN=Green
  6. 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

  1. Verify VIN voltage: Always check VIN > 42V before expecting PoE operation

    • Read TELEMETRY channels to get GPIO1_Value
    • Multiply by 280.48 to get actual voltage
    • Confirm voltage in 42-57V range for PoE
  2. 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)
  3. Use Auto mode for standard operation: Set OperatingMode to "Auto" for automatic PD detection and power delivery

  4. Enable auto-class: Set AAC1 and AAC2 to true for precise power negotiation with IEEE 802.3bt PDs

  5. Configure appropriate power allocation: Set PortPowerAllocationRegister to match expected PD power class

    • Use QP90W for Class 8 PDs (up to 90W)
    • Use lower classes for lower-power devices to optimize efficiency
  6. Monitor power telemetry: Regularly read CURRENT_SUM and POWER_SUM to track total power delivery

    • Current per channel: typically 0-2A for high-power PoE
    • Total power: up to 90W for Class 8
  7. Track peak currents: Use MAX_CURRENT1/2 and MIN_CURRENT1/2 for inrush/dropout analysis

    • Clear peaks with CLEAR_PEAKS at start of test periods
  8. Monitor fault conditions: Check interrupt and fault registers for abnormal conditions

    • SUPF: Supply fault or memory error
    • IFAULT: Overcurrent (tOVLD/tLIM exceeded)
    • STRTF: Start-up fault (tSTART exceeded)
    • TSD: Thermal shutdown
    • OVLO/UVLO: Voltage out of range
  9. Handle disconnect events: Monitor DISF register to detect PD disconnection

    • Automatic reconnection in Auto mode
    • Manual intervention may be required in SemiAuto/Manual modes
  10. 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
  11. Power budget management: Sum of CH1 and CH2 power should not exceed port maximum (90W for QP90W)

  12. Temperature monitoring: Read TemperatureRegister.Value to 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)
An unhandled error has occurred. Reload 🗙

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.