Internal & external calibration
A photodiode does not output dBm and a thermistor does not output °C. Somewhere the raw sensor reading has to be turned into an engineering value — and SFF-8472 allows that to happen either inside the module or on the host, using constants the module provides. Getting this wrong is the usual reason a switch displays absurd DDM values for a module that works perfectly.
Two calibration modes
| Mode | Declared by | Who converts | What the monitor bytes contain |
|---|---|---|---|
| Internal | A0h byte 92 bit 5 | the module's microcontroller | final values in standard units (1/256 °C, 100 µV, 2 µA, 0.1 µW) |
| External | A0h byte 92 bit 4 | the host | raw A/D counts; host applies constants from A2h 56–95 |
Almost every modern module is internally calibrated. Externally calibrated modules are older or cost-optimised designs; their values read as garbage on hosts that skip the conversion.
External calibration constants — A2h bytes 56–95
| Bytes | Constant | Format | Applies to |
|---|---|---|---|
| 56–75 | Rx_PWR(4) … Rx_PWR(0) | five IEEE-754 single-precision floats | Rx power (4th-order polynomial) |
| 76–77 | Tx_I slope | unsigned fixed-point 8.8 | Tx bias |
| 78–79 | Tx_I offset | signed 16-bit | Tx bias |
| 80–81 | Tx_PWR slope | unsigned 8.8 | Tx power |
| 82–83 | Tx_PWR offset | signed 16-bit | Tx power |
| 84–85 | T slope | unsigned 8.8 | temperature |
| 86–87 | T offset | signed 16-bit | temperature |
| 88–89 | V slope | unsigned 8.8 | Vcc |
| 90–91 | V offset | signed 16-bit | Vcc |
| 92–94 | reserved | — | — |
| 95 | CC_DMI | checksum of bytes 0–94 | — |
The conversion formulas
Rx_PWR (µW) = Rx4·raw⁴ + Rx3·raw³ + Rx2·raw² + Rx1·raw + Rx0
Tx_I (µA) = Tx_I_slope · raw + Tx_I_offset
Tx_PWR (0.1 µW) = Tx_PWR_slope · raw + Tx_PWR_offset
T (1/256 °C)= T_slope · raw + T_offset
V (100 µV) = V_slope · raw + V_offset
For an internally calibrated module the constants are ignored; many vendors still fill them with identity values (slope 1.0, offset 0, Rx polynomial 0,0,0,1,0) so that a host applying them anyway gets the right answer.
Average vs OMA
A0h byte 92 bit 3 says how Rx power is expressed: average power (1) or OMA — optical modulation amplitude (0). Nearly all modules report average power; OMA appears on some multi-mode Ethernet optics where the standard specifies sensitivity that way. Comparing an OMA figure with an average-power sensitivity spec misleads by up to ~3 dB.
Symptoms of a calibration problem
| What you see | Likely cause |
|---|---|
| Temperature of 0 °C or −128 °C, Vcc 0.00 V | host reads raw counts from an externally calibrated module without converting |
| Rx power impossibly high (+10 dBm) or always −40 dBm | wrong calibration mode assumed, or zeroed constants |
| Values differ wildly between two switch models with the same module | one host honours byte 92, the other assumes internal |
| Tx power identical on every module of a batch | not calibration — a constant Tx (DDM levels) |
In CodingBox
CodingBox reads byte 92, applies external calibration constants when the module declares them, and shows both raw and converted values, so a module that a switch displays wrongly can be judged on the bench. The constants block 56–95 is editable in the EEPROM editor with CC_DMI recalculated automatically — useful for repairing modules whose calibration area was overwritten.