Lorsque le voyant Link d'un équipement réseau s'allume mais que les transmissions sont instables, ou que les résultats d'auto-négociation sont incorrects, se fier uniquement aux indicateurs physiques est insuffisant. Les ingénieurs hardware expérimentés savent que l'interface MDIO est l'outil clé pour diagnostiquer les puces PHY.
Pourquoi le débogage via MDIO est plus fiable
Le voyant Link indique seulement la connectivité physique, tandis que l'interface MDIO permet d'accéder à des dizaines de registres d'état internes de la puce PHY. Par exemple, pour une puce B50610, le registre Auxiliary Status Summary (adresse 0x19) fournit des informations détaillées :
- bit 2 : état réel du lien (au-delà de la simple couche physique)
- bit 15 : état de complétion de l'auto-négociation
- bits 10:8 : mode opérationnel actuel (vitesse, duplex)
- bit 5 : indication de panne distante
- bit 4 : état de détection Jabber
Cas pratique : un switch industriel présentait des déconnexions fréquentes malgré un voyant Link normal. La lecture MDIO a révélé une augmentation continue des erreurs CRC dans le registre Auxiliary Status, pointant vers une inadéquation d'impédance du transformateur réseau.
Configuration de l'environnement de débogage MDIO
Matériel nécessaire
- Carte de développement FPGA (ex. : Xilinx Artix-7)
- Carte d'évaluation de la puce PHY cible (ex. : B50610)
- Câble torsadé (Cat5e minimum)
- Analyseur logique (optionnel, pour la capture des signaux)
Implémentation FPGA de base
Le code Verilog suivant illustre une implémentation simplifiée de li'nterface MDIO :
module mdio_handler (
input sys_clk, // Horloge système
output mdc_pin, // Signal MDC
inout mdio_pin, // Signal MDIO bidirectionnel
output [15:0] reg_data // Données de registre lues
);
reg [31:0] counter = 0;
reg mdc_val = 0;
assign mdc_pin = mdc_val;
// Génération de l'horloge MDC à 2.5 MHz
always @(posedge sys_clk) begin
counter <= (counter >= 19) ? 0 : counter + 1;
mdc_val <= (counter < 10) ? 1 : 0;
end
// Machine d'états pour les opérations MDIO
reg [4:0] current_state = 0;
reg [15:0] read_buffer;
always @(negedge mdc_pin) begin
case(current_state)
0: begin /* Initialisation */ end
// ... implémentation complète de la machine d'états ...
31: read_buffer <= mdio_in_data;
endcase
current_state <= (current_state == 31) ? 0 : current_state + 1;
end
assign reg_data = read_buffer;
endmodule
Table des registres clés
| Adresse | Nom | Bits importants | Signification diagnostique |
|---|---|---|---|
| 0x19 | Auxiliary Status | bits [15:8] | État du lien et résultats d'auto-négociation |
| 0x01 | Control | bit 9 (Restart AN) | Relance de l'auto-négociation |
| 0x15 | Error Counter | bits [15:0] | Compteur d'erreurs CRC accumulées |
| 0x1A | Cable Diagnostics | bits [7:0] | Détection de longueur de câble et défauts (ouvert/court-circuit) |
Procédures de diagnostic typiques
Investigation des déconnexions fréquentes
- Lire en continu le bit 2 du registre 0x19 : les fluctuations suggèrent un problème de connexion physique.
- Consulter le compteur d'erreurs CRC (registre 0x15) : une augmentation continue peut indiquer des interférences EMI.
- Lancer un diagnostic câble (écriture dans 0x1A).
Exemple d'export des données via JTAG :
$ fpgatool -read_register 0x19
> 0x19: 0x8102 // Indique 100M full-duplex, lien actif
Analyse des échecs d'auto-négociation
Lorsque le mode négocié est inattendu :
- Vérifier le bit 15 du registre 0x19 pour confirmer la complétion de l'AN.
- Comparer les registres Advertisement (0x04) entre les équipements local et distant.
- Forcer une relance de l'AN en écrivant le bit 9 du registre 0x01.
Note : certaines puces PHY nécessitent de désactiver puis réactiver l'AN pour réinitialiser correctement l'état de négociation.
Techniques avancées
Surveillance en temps réel
Intégrer un buffer circulaire dans le FPGA pour stocker périodiquement les valeurs de registres critiques :
reg [15:0] log_buffer [0:255];
reg [7:0] index_ptr = 0;
always @(posedge event_clock) begin
log_buffer[index_ptr] <= {phy_state, err_count};
index_ptr <= index_ptr + 1;
end
Automatisation avec des scripts
Utiliser un script Tcl pour scanner plusieurs registres :
set PHY_ADDRESS 0x01
for {set addr 0} {$addr < 32} {incr addr} {
set result [access_mdio $PHY_ADDRESS $addr]
puts [format "Adresse 0x%02X: 0x%04X" $addr $result]
}
Vérification de l'intégrité du signal
Si les lectures MDIO sont instables :
- Capturer les formes d'onde MDC/MDIO avec un analyseur logique.
- Vérifier les temps de setup/hold conformément aux spécifications de la puce PHY.
- Mesurer l'amplitude des oscillations sur la ligne MDIO (recommandé < 0.3V).
Lors d'un cas réel, des taux d'erreur élevés ont été observés lorsque MDC dépassait 8 MHz, dû à des traces de circuit imprimé trop longues (> 15 cm). La solution a été de réduire la fréquence d'horloge et d'ajouter une résistance de terminaison.
Des registres aux solutions
| Symptôme | Cause possible | Solution |
|---|---|---|
| AN terminé mais vitesse incorrecte | Erreurs dans les capacités annoncées par le distant | Vérifier les registres Advertisement aux deux extrémités |
| Augmentation continue des erreurs CRC | Mauvaise qualité de câble ou interférences EMI | Utiliser un câble blindé torsadé, vérifier la masse |
| Lien instable (up/down fréquents) | Alimentation instable du port | Mesurer les ondulations d'alimentation de la puce PHY |
| Diagnostic câble indique un court-circuit | Pins du connecteur collés | Inspecter l'interface RJ45 et le transformateur |
Exemple industriel : un appareil se connectait parfois en mode 10M uniquement. Les journaux MDIO ont montré des bits Speed[1:0] anormaux après l'AN, finalement attribués à une résistance pull-up mal soudée sur les broches de configuration de la puce PHY.