Lire un refus UDS : les codes NRC
Quand un calculateur refuse une requête UDS, il ne tombe pas en panne : il répond. Il renvoie une réponse négative qui dit, avec précision, pourquoi il n'a pas exécuté la demande. Ce message porte un code de réponse négative — un NRC, pour Negative Response Code. Confondre un refus avec une défaillance, c'est chercher un problème là où le calculateur donne déjà la réponse.
La forme d'un refus
Une réponse négative tient en trois octets : 0x7F, suivi du service refusé (par exemple 0x34 pour un RequestDownload), suivi du NRC qui donne le motif. Ainsi, « 7F 34 33 » se lit : le RequestDownload est refusé, motif securityAccessDenied. À l'inverse, une réponse positive vaut le service plus 0x40. Le NRC est donc l'information la plus utile d'une trace qui coince.
Les NRC courants et ce qu'ils disent
| NRC | Nom | Ce que ça signifie |
|---|---|---|
| 0x10 | generalReject | rejet général, sans motif plus précis |
| 0x11 | serviceNotSupported | le calculateur ne connaît pas ce service |
| 0x12 | subFunctionNotSupported | la sous-fonction n'existe pas pour ce service |
| 0x13 | incorrectMessageLengthOrInvalidFormat | longueur ou format du message incorrect |
| 0x14 | responseTooLong | la réponse dépasse la taille transportable |
| 0x21 | busyRepeatRequest | serveur occupé, requête à répéter |
| 0x22 | conditionsNotCorrect | les conditions ne sont pas réunies (moteur tournant, tension, mauvais état) |
| 0x24 | requestSequenceError | requête arrivée hors de la séquence attendue |
| 0x25 | noResponseFromSubnetComponent | un composant du sous-réseau ne répond pas |
| 0x31 | requestOutOfRange | paramètre, adresse ou identifiant hors plage autorisée |
| 0x33 | securityAccessDenied | il faut d'abord réussir le SecurityAccess |
| 0x35 | invalidKey | la clé envoyée ne correspond pas |
| 0x36 | exceedNumberOfAttempts | trop de tentatives de clé |
| 0x37 | requiredTimeDelayNotExpired | délai d'attente non écoulé après échecs |
| 0x70 | uploadDownloadNotAccepted | download ou upload non accepté |
| 0x72 | generalProgrammingFailure | erreur pendant l'effacement ou l'écriture de la flash |
| 0x73 | wrongBlockSequenceCounter | compteur de bloc erroné pendant le transfert |
| 0x78 | requestCorrectlyReceived-ResponsePending | « bien reçu, je travaille, patiente » — ce n'est pas une erreur |
| 0x92 / 0x93 | voltageTooHigh / voltageTooLow | tension d'alimentation trop haute / trop basse pour l'opération |
Lire, et non paniquer
Quelques réflexes transforment ces codes en diagnostic immédiat :
- 0x78 est normal. Sur les opérations longues — un effacement de secteur, par exemple — le calculateur répond responsePending pour dire qu'il n'a pas fini. L'outil attend, tout simplement. Voir dans quel enchaînement il tombe dans la séquence de flash UDS.
- 0x33, c'est l'ordre. Un securityAccessDenied ne signifie pas « impossible » : il signifie « pas encore ». Le service demandé exige un SecurityAccess réussi au préalable. On revient d'un cran dans la séquence.
- 0x22, ce sont les préconditions. conditionsNotCorrect pointe presque toujours un état non conforme : mauvaise session, moteur qui tourne alors qu'il devrait être coupé, tension insuffisante. Voir les sessions de diagnostic et la chute de tension.
- 0x31, c'est souvent le mauvais fichier. requestOutOfRange sur un RequestDownload ou une lecture par identifiant signale une adresse, une taille ou un DID hors plage — le symptôme classique d'un fichier ou d'une variante qui ne correspond pas au calculateur en face.
- 0x35 / 0x36 / 0x37, c'est la clé. Clé invalide, puis trop de tentatives, puis délai imposé : le calculateur se protège des essais répétés. La bonne réponse est de s'arrêter et de vérifier l'identification, pas d'insister.
- 0x72 et 0x92 / 0x93, c'est physique. generalProgrammingFailure survient pendant l'effacement ou l'écriture ; voltageTooHigh et voltageTooLow disent explicitement que la tension est hors plage. Dans les deux cas, on suspecte d'abord l'alimentation avant la mémoire. Si le calculateur ne répond plus du tout ensuite, voir calculateur muet après écriture.
- 0x73, c'est la reprise. wrongBlockSequenceCounter concerne le compteur de blocs du TransferData ; la norme prévoit qu'un renvoi du même bloc soit accepté. Un outil correct gère cette reprise seul.
NRC et code défaut : ne pas confondre
Un NRC n'est pas un DTC. Un code défaut est mémorisé dans le calculateur, horodaté, associé à des conditions gelées, et relu plus tard ; un NRC est une réponse vivante, échangée sur le bus au moment même de la requête, et qui ne survit pas à la conversation. Le premier se lit dans l'onglet défauts d'un outil de diagnostic ; le second n'apparaît que dans la trace de communication. Certains outils traduisent le NRC en clair, d'autres n'affichent que les trois octets bruts : savoir décoder soi-même « 7F xx yy » évite de dépendre de la qualité d'un logiciel. Enfin, un 0x13 (longueur ou format incorrect) ou un 0x11 / 0x12 (service ou sous-fonction inconnus) pointent souvent une incompatibilité d'outil ou de variante plutôt qu'un vrai problème véhicule : le calculateur en face n'implémente tout simplement pas ce qu'on lui demande.
La leçon d'ensemble : un refus UDS est un diagnostic offert. Le plus souvent, il dit « mauvaise session », « sécurité manquante », « mauvaise variante » ou « tension ». Aucun de ces cas n'est une panne du calculateur — ce sont des conditions à corriger avant de recommencer proprement. C'est la même logique de lecture que pour un code défaut, appliquée à la couche protocolaire.
Un dernier conseil de méthode : noter systématiquement le triplet complet — service, NRC, étape de la séquence — dans le compte rendu d'intervention. C'est une trace précieuse si le dossier doit être repris plus tard, ou transmis à un confrère.
Voir aussi la séquence de flash UDS, seed & key et la prise OBD et ses protocoles.
Sur ANP Engineering — file service de reprogrammation moteur pour professionnels : file service ECU, correction de checksum, calculateurs pris en charge, tarifs.
