This post builds on the EthTrcv core series (Parts 1–4) and the previous post, Hardware Deep Dive. That material covered APIs, the init sequence, ARXML configuration, WakeUp handling, and the physical interfaces of the PHY chip — in other words, everything needed to configure EthTrcv correctly.
This post flips the perspective: what do you do when bring-up on real hardware does not work? In practice, a new board rarely comes up cleanly on the first attempt — and the symptoms tend to repeat themselves closely enough that a systematic checklist is the difference between a five-minute fix and a full day of debugging.
The seven scenarios below are ordered roughly the way you encounter them during a typical bring-up: from "no link at all" through "link is up but nothing gets through" to subtler issues like sporadic link drops or an elevated bit error rate despite an apparently healthy link. For deeper register- and protocol-level detail, this post points to the corresponding deep-dive posts in the series rather than duplicating them.
This post does not replace either of the two core debugging tools: an oscilloscope or logic analyzer for the electrical level, and MDIO register reads for the PHY-internal view. It simply maps out which tool to reach for first for which symptom. |
1. No Link Comes Up At All
The base symptom: EthTrcv_GetLinkState permanently returns ETHTRCV_LINK_STATE_DOWN,
no matter how long you wait. No link training, no autonegotiation activity, nothing.
This is simultaneously the most common and the easiest to narrow down, because the
cause almost always lies on one of the two sides of the link and can be isolated
quickly with a register comparison.
ECU A (Transceiver 1) ECU B (Transceiver 2)
Autoneg: OFF Autoneg: ON
Speed: 100 Mbit/s fixed Speed: Auto
Duplex: Full fixed Duplex: Auto
│ │
└──────────────── Twisted Pair ──────────┘
no common starting point for
link training possiblePossible Causes
| Cause | Recognition Pattern |
|---|---|
Speed/duplex mismatch between the two transceivers | Both sides are fixed (not via autoneg) to different values — there is no common ground for the link to settle on. |
One transceiver on autonegotiation, the other on a fixed mode | A "half-open" autoneg attempt: the autoneg side sends Fast Link Pulses (FLP) but never gets a matching response from the fixed-mode side. 100BASE-T1 has no FLP equivalent, so this combination is even more fatal there — the entire link training protocol depends on a shared starting condition. |
100BASE-T1 master/slave not unambiguously configured (both master or both slave) | Both PHYs try to initiate link training as the clock source, or neither does — either way, no valid symbol synchronization can be established. This scenario has its own dedicated deep dive (see below). |
Cable defective, or the wiring between the two PHYs is faulty at the hardware level | An open circuit, a short between the wires, or a cable that simply does not reach the expected MDI pin of the PHY (e.g. reversed polarity on a hand-built prototype harness). |
100BASE-T1 master/slave role conflicts are their own non-trivial topic — including ARXML parametrization and the pitfalls of automatic role negotiation. This post deliberately does not go deep here; the full treatment lives in the post on master/slave configuration. |
Possible Debugging Approaches
Use the diagnostic APIs — start cable diagnostics (TDR-based, vendor-specific register) and read the result. A healthy cable reports no reflections; a defective one shows a short/open and often even an approximate fault distance in meters. Complementarily, loopback/test modes can isolate the PHY itself from the cable, which separates PHY faults from cable faults.
Check the AUTOSAR tooling configuration against the real hardware — ARXML parameters like
EthTrcvSpeedandEthTrcvDuplexModemust match the actually populated PHY and its capabilities. A common mistake: a parameter was copied from an older board revision that used a different PHY chip with different default capabilities.Read and compare
EthTrcv_GetDuplexMode/EthTrcv_GetBaudRate— on both sides of the link, when both sides are under your control. A discrepancy between what was configured and what the driver actually reports immediately shows whether the problem sits in configuration or in PHY state.Read the pin straps — verify the hardware default configuration directly at the PHY (see the strap-pin deep dive below), independent of whatever software later overwrites via MDIO. If strap and software configuration disagree, depending on the PHY either the last MDIO write wins or the strap value persists until the next reset — this is PHY-specific and documented in the datasheet.
Check whether the transceiver was actually set to
ETH_MODE_ACTIVEviaEthTrcv_SetTransceiverMode— a transceiver stuck inETH_MODE_DOWNshows exactly the same outward symptom as a defective PHY: no link, no activity on the line. The difference lies purely in software control, not in hardware.Check whether the Eth driver’s
ControllerInitcompleted successfully — a failed MAC-side init prevents the link just as reliably as a PHY problem, but typically shows up in a completely different place in the log (the Eth module rather than the EthTrcv module) and is therefore easy to overlook in a first pass.
2. Link Is Active, But No Communication Is Possible
More frustrating than scenario 1, because the obvious indicator is green:
EthTrcv_GetLinkState returns ETHTRCV_LINK_STATE_ACTIVE, autonegotiation has
completed, but no frames arrive — in either direction, or only sporadically and
incompletely. The link layer (PHY-to-PHY) works, but somewhere between PHY and MAC the
actual payload gets lost.
Possible Causes
| Cause | Recognition Pattern |
|---|---|
Speed not configured identically between MAC and PHY (software or hardware strap) | The link between the two PHYs is up at, say, 100 Mbit/s, but the MAC in the SoC expects a 1000 Mbit/s clock over RGMII (or vice versa) — the MAC-PHY interface runs at the wrong clock rate while the line-side signal itself is correct. |
MII interface type (MII/RMII/RGMII) not configured identically between MAC and PHY | The PHY is set to RGMII via strap or software, but the SoC MAC driver speaks RMII (or vice versa) — the same pins carry different signal meanings, producing complete garbage on the bus in practice. |
Pin straps wired incorrectly | The PHY boots into a different operating mode than assumed, because a pull-up/ pull-down resistor on the board was populated incorrectly or is missing (see the deep dive below). |
Mode pins (e.g. STB_N-style standby pins) misconfigured with respect to their level | The PHY sits in a reduced operating mode (standby/silent) in which it can show a link on the line, but passes no data, or only restricted data, through to the MAC. |
Possible Debugging Approaches
Verify the MII interface type on both sides — cross-check the interface type actually used, both in the SoC MAC driver configuration and in the PHY datasheet or read-back strap pins. These two configurations are often maintained by different teams (SoC BSP vs. PHY bring-up) and drift apart easily.
Check clock signals at the interface with an oscilloscope — for RGMII, measure the frequency of
TXC/RXCand compare it against the expected speed (125 MHz at 1 Gbit/s, 25 MHz at 100 Mbit/s, 2.5 MHz at 10 Mbit/s). A wrong clock frequency is the clearest possible proof of a speed mismatch between MAC and PHY.Check mode/standby pins for their actual level — with a multimeter or oscilloscope directly at the pin, not just in the schematic documentation. A pin that the schematic says should be "active" but that hangs at the wrong potential due to an assembly error is a classic board bring-up bug.
Capture raw frame traffic directly at the MII interface — with a logic analyzer that supports an MII/RGMII decoder. This shows immediately whether any bits are moving across the interface at all, and if so, whether they decode as valid frames — independent of what the EthTrcv driver reports in software.
Check the driver/hardware configuration against the actual PCB population — which interface (MII/RMII/RGMII) the driver expects is implicit in the concrete hardware and driver integration (there’s no dedicated ARXML enum for it); this expectation must match the hardware exactly, not just the original design intent.
Deep Dive: How Do Strap Pins Work?
Because "wrong pin straps" shows up as a cause in several scenarios in this post, it is worth taking a closer look at the mechanism behind it.
Many PHY chips do without dedicated configuration pins for rare but essential boot parameters — instead, ordinary I/O pins get "repurposed" during reset and read an external pull-up or pull-down resistor as a configuration bit. After reset, the same pins then take on their actual function (e.g. as an LED output, interrupt pin, or GPIO).
VDD (3.3 V)
│
▲ R_pullup (typ. 4.7–10 kΩ)
│
├────────────● PHY pin (e.g. strap function "PHYAD0")
│
▼ R_pulldown (typ. 4.7–10 kΩ)
│
GND
Only ONE of the two resistors is populated:
Pull-up populated → pin reads "1" at sampling time
Pull-down populated → pin reads "0" at sampling timeThe decisive moment is the sampling window shortly after the hardware reset is deasserted:
RST_N ──────┐ ┌──────────────────────
└──────────────────────────┘
▲
Strap pins are sampled here
(sampling window, typically
< 1 µs after RST_N deassert)
│
▼
After this, the same pins switch to their
functional role (LED, INT_N, GPIO, ...).
The pull resistors are irrelevant for
operation from this point on — they have
already done their job.Typical parameters strapped this way:
| Parameter | Typical Strap Function |
|---|---|
PHY address | Three to five pins encode the 5-bit MDIO address in binary. Each pin carries one bit
— pull-up = 1, pull-down = 0. This value must match the |
MII operating mode | One or two pins select between MII/RMII/RGMII, provided the PHY chip supports multiple interface variants (many modern automotive PHYs are hard-wired to a single variant and do not need this strap). |
Master/slave role (100BASE-T1) | One pin determines which role the PHY starts in after reset, before software optionally overrides the role via MDIO (see the master/slave post for details on role negotiation). |
Speed/autonegotiation default | Pins set the default mode that applies before |
An incorrectly populated strap resistor is not a software bug and generally cannot be fixed by changing a configuration — it requires physical rework on the board (reworking the resistor) or a corrected board revision. Some PHYs do offer an MDIO register that lets you override the strapped value after boot — but that is a workshop workaround, not a production fix, and it only works for the parameters the vendor actually documents as overridable. |
If a strap fault is suspected: evaluate one of the standard register reads (PHY address, master/slave status bit) immediately after reset and compare it against the schematic. If the value read back deviates from the expected strap, either the resistor is populated incorrectly, or another driver on the same pin (e.g. a GPIO that becomes active too early) is overwriting the level during the sampling window. |
3. Link Is Unstable / Flapping
The link comes up but does not stay up — EthTrcv_GetLinkState repeatedly toggles
between ACTIVE and DOWN, sometimes once a second, sometimes only every few minutes.
This scenario is trickier than a permanently dead link because it is often not
reproducible on the bench and only shows up in the vehicle harness or under thermal
stress.
Possible Causes
| Cause | Recognition Pattern |
|---|---|
EMC interference (missing or incorrectly dimensioned common-mode filter) | Link drops correlate in time with switching other loads in the vehicle (ignition system, DC/DC converters, motors) — often inconspicuous on the bench with a lab power supply. |
Cable impedance or length outside specification | The link stands up fundamentally, but with reduced noise immunity — the smallest additional disturbance is enough to briefly interrupt link training. |
Temperature influence | Link is stable at room temperature but flaps in a climate chamber under cold or heat, because attenuation, impedance, and internal PHY timing margins shift with temperature. |
Loose or corroded connector | Mechanically wiggling the connector reproducibly changes the link state; common with prototype wiring or after extended field time due to contact corrosion. |
Signal quality at the edge of specification (marginal link) | No single fault is identifiable, but the noise margin is so small that even minor disturbances trigger a link drop — often a combination of several small deviations that are each unremarkable on their own. |
Possible Debugging Approaches
Poll
EthTrcv_GetLinkStaterepeatedly and log drop timestamps — a simple logging script that records link state together with a timestamp is the foundation for any further correlation. Without timestamps, an EMC-induced drop cannot be distinguished from an intermittent mechanical contact.Correlate drop timestamps with other events — engine start, relay switching, actuator activity on the same harness. If the link drops exactly when a particular load switches on, EMC coupling is the obvious suspect.
Read RMS amplitude or SQI (Signal Quality Index) values — where the PHY offers these vendor-specific diagnostic registers, they give a quantitative measure of signal margin instead of just a binary "link up/down". An SQI value sitting close to the threshold confirms a marginal-link situation even when the link happens to be up at the moment of measurement.
Repeat cable diagnostics (TDR) under operating conditions — not just once at rest, but while the link is actively loaded, and ideally under the same mechanical/thermal conditions under which the drops occur.
Repeat temperature tests deliberately — run defined temperature ramps in a climate chamber while continuously logging link state, to narrow down a temperature threshold at which the drops begin.
Mechanically inspect the connector — gently move the connector (within specified tolerance) while observing link state, plus a visual inspection for corrosion or insufficient contact force.
4. PHY Does Not Respond to MDIO Access At All
A special case of scenario 1, but with its own error class: not only is the link down,
even communication with the PHY itself fails. Register reads consistently return the
same, obviously invalid value — typically 0xFFFF or 0x0000 — no matter which
register is addressed.
Possible Causes
| Cause | Recognition Pattern |
|---|---|
Missing pull-up on the MDIO line | MDIO is stuck permanently at a low level; all reads consistently return |
Reset pin not deasserted, or deasserted for too short a time | The PHY is still in reset and ignores all MDIO activity — a state that software frequently misreads as "PHY dead". |
Power sequencing error | One or more supply domains (core, I/O, analog MDI) do not come up in the order required by the datasheet, or with too little time between them — the PHY boots into an undefined internal state. |
Wrong PHY address configured | Software addresses a different address than the one the PHY is actually strapped to — the real PHY never responds because it never sees a match in the address comparison within the MDIO frame. |
Possible Debugging Approaches
Check register reads against standard registers such as the PHY ID — a consistent
0xFFFFor0x0000across several different registers (not just one) reliably indicates a bus-level problem rather than a configuration problem inside the PHY. If the PHY instead responds with a plausible but wrong value, the issue is more likely addressing-related than electrical.Measure voltage levels and power sequencing — capture all relevant supply domains (see the Hardware Deep Dive) with an oscilloscope during power-on and compare the measured order and timing gaps against the datasheet.
Check reset timing with an oscilloscope — measure the duration of the low level on
RST_Nas well as the time between reset deassertion and the first MDIO access, and compare against the minimum boot time required by the datasheet.Verify the MDIO address via pin-strap readback — where the PHY supports it, read back the actually strapped address independently of software (e.g. via a status register that keeps the strap value visible after boot), instead of relying on the schematic documentation alone.
For register-level diagnosis — which bit in the Basic Status Register means what, how Clause 22 compares to Clause 45, and a full case study of a link that would not come up due to a population fault — see the dedicated MDIO post. This section deliberately stays at the "does the bus even respond" level; register interpretation in detail follows there. |
5. Two PHYs With the Same MDIO Address (Address Conflict)
A special case that shows up particularly on multi-PHY boards (e.g. gateway ECUs with several Ethernet ports): two or more PHYs share the same MDIO bus but are accidentally strapped to the same 5-bit address. Both PHYs "hear" every frame addressed to them and respond simultaneously — with predictably chaotic results.
Possible Causes
| Cause | Recognition Pattern |
|---|---|
Identical PHY-address pin strapping on multiple PHYs on the same bus | A design or copy-paste error in the schematic: the same resistor population was carried over for two PHY instances without shifting the address for one of them. |
Manufacturing or assembly error | The schematic specifies different addresses, but the actual resistor population on the manufactured board deviates from it (e.g. swapped population variants between two otherwise identical PHY footprints). |
Possible Debugging Approaches
Recognize inconsistent or corrupted register reads as the symptom — an address conflict rarely shows up as a clean, unambiguous error; instead it appears as unreliable behavior: sometimes PHY 1 responds, sometimes PHY 2, sometimes both responses overlap into a value that matches neither. This pattern — values that change from read to read with no apparent reason — is the strongest indicator of an address conflict, in contrast to the consistent
0xFFFFof a pure bus problem.Check each PHY’s address strap pins individually — for every PHY on the board, separately verify the strapped address against the schematic and, if possible, by direct pin measurement, rather than relying solely on the ARXML configuration.
Isolate the PHYs individually and verify the address — if the board allows it, electrically disconnect one of the two PHYs from the MDIO bus (e.g. by desoldering or via a populatable isolation point) and read out the remaining PHY’s address in isolation. This conclusively establishes which PHY actually responds on which address.
An address conflict does not just affect the two conflicting PHYs — it can disturb the entire MDIO bus enough that other PHYs on the same bus appear intermittently unreliable as well, even though they themselves are strapped correctly. Before chasing supposedly "also affected" PHYs, it pays to first fully resolve the address conflict or physically disconnect the offending PHY from the bus. |
6. WakeUp Does Not Work
The ECU is supposed to wake up from sleep via Ethernet, but does not — or it wakes up and immediately falls back asleep without the application ever coming up. This scenario is particularly unpleasant because it is hard to reproduce on the bench: the ECU boots fine when kept continuously powered — the actual problem only shows up within the sleep/WakeUp cycle itself.
Possible Causes
| Cause | Recognition Pattern |
|---|---|
WakeUp support misconfigured or not configured at all in ARXML |
|
| Calling it too early (before EcuM validation) loses the actual WakeUp reason before it can be confirmed. Not calling it at all leaves the WakeUp latch — cleared in a vendor-specific way over MDIO — set in the PHY and blocks the next deep-sleep transition. |
WakeUp pin or in-band signal wired incorrectly at the hardware level | The |
EcuM WakeUp validation mapped incorrectly | The ID that |
Possible Debugging Approaches
Debug
EthTrcv_CheckWakeupwithin the EcuM validation cycle — with a breakpoint or tracing directly inside the function, verify whether it is called at all, whether it recognizes a valid WakeUp reason, and whetherEcuM_SetWakeupEventis actually invoked with the expected ID beforeEcuMValidationTimeoutelapses.Check the WakeUp pulse in hardware with an oscilloscope — capture directly at the
WUpin or the MDI wire pair whether a pulse, or TC10 pulse sequence, arrives at all, and whether its shape/timing matches the specification. This reliably separates "the hardware signal never arrives" from "software fails to recognize an arriving signal".Check the EcuM mapping — trace, line by line, the link between
EthTrcvWakeupSourceRefin ARXML and theEcuMWakeupSourceactually configured in EcuM — particularly after configuration changes copy-pasted between multiple ECU variants.
The full EcuM validation cycle — from the hardware WakeUp source through
|
7. High Bit Error Rate Despite Link Up
The subtlest of the seven scenarios: the link is stable, EthTrcv_GetLinkState
consistently reports ACTIVE, and coarse communication apparently works — but CRC
errors, alignment errors, or symbol errors accumulate during operation without the
connection ever fully breaking down. At the higher protocol layers this often shows up
only as occasional packet loss or sporadically elevated latency from retransmissions —
a symptom that is easily blamed on the wrong layer (application instead of physical
layer).
Possible Causes
| Cause | Recognition Pattern |
|---|---|
Cable or connector at the edge of specification | No hard fault, but a reduced noise margin — the link stays up, but every additional disturbance produces measurable symbol errors instead of a complete outage. |
EMC coupling | Error rate correlates with the operation of certain loads in the vehicle, but stays below the threshold that would trigger a full link drop. |
Clock quality or jitter on the MAC-side interface outside tolerance | The line side (MDI) is clean, but the digital interface between MAC and PHY (e.g. RGMII) has timing margins that sit close to or beyond the specification limit — often caused by a PCB layout that does not meet the required RGMII delay tolerance. |
Possible Debugging Approaches
Watch error counters and correlate them with load states — regularly read CRC, alignment, and symbol error counters (usually read-clear-on-read, so log them at a fixed sampling period) and relate them to environmental conditions such as engine load, temperature, or data throughput. An error rate that scales with throughput rather than staying constant points more toward a MAC-interface timing problem; an error rate correlating with external load switching points more toward EMC.
Read signal quality via PHY diagnostic registers — SQI and comparable vendor-specific metrics give a quantitative picture of the line side, independent of the raw error counters, and help narrow down whether the problem sits on the line side (MDI) or the digital MAC interface.
Use loopback tests to narrow it down — by deliberately short-circuiting the data path at different points (internal within the PHY, external at the MDI), you can determine whether errors already occur without a real cable attached (→ pointing to a MAC-interface or internal PHY problem) or only appear with the cable connected (→ pointing to the line side). Details on the available loopback modes and how to activate them via AUTOSAR are in the dedicated loopback post.
An elevated but non-communication-breaking bit error rate is one of the scenarios where
an overly aggressive DEM debounce configuration becomes especially noticeable: the error
rate can be high enough to be felt at the application level, yet too low to trigger
|
Summary
| Scenario | Key Takeaway for Software Developers |
|---|---|
No link comes up at all | Usually a speed/duplex or master/slave mismatch — narrow it down quickly by comparing registers on both sides |
Link active, no communication | MAC and PHY side run with different interface types or speeds — check clock signals and strap pins directly |
Link unstable / flapping | Rarely a pure software bug — systematically correlate EMC, temperature, and cable quality with timestamps |
PHY does not respond to MDIO | Consistent |
MDIO address conflict | Inconsistent values that change from read to read are the tell — isolate PHYs individually to confirm |
WakeUp does not work | Almost always a timing or mapping error in the EcuM validation cycle, not a pure hardware problem |
High bit error rate despite link up | The subtlest scenario — correlate error counters with load states, use loopback to narrow down between MAC interface and line side |
This concludes the EthTrcv series. Back to the series overview.