🛠 Auditer le stepping de son RP2350 : fuite Bank 0 (E9), errata bootrom et parades
Objectifs
Le RP2350 a un passé : le silicium A2 (premiers lots) traîne des errata documentés, le plus célèbre — RP2350-E9 — empoisonne les consommations et les entrées flottantes : une broche du Bank 0 configurée en entrée source ~120 µA quand le potentiel flotte entre les niveaux logiques, et remonte seule vers 2,2 V. D'abord qualifié de « latching pull-down », le problème a été reclassé en « fuite accrue du Bank 0 quand l'entrée du pad est activée », signalé notamment par les développeurs de Bus Pirate, et corrigé dans les steppings A3/A4 annoncés en juillet 2025 (pico-feedback#401 ; annonce A3/A4 + RP2354). Ce tuto : identifier ton stepping, mesurer la fuite, et rendre tout design robuste quel que soit le lot.
Matériel
- 1 × carte RP2350 générique (le stepping est gravé dans le silicium, pas sur le PCB : on le lit par registre)
- 1 × pico-sdk 2.x (C) ou sonde PICOBOOT + picotool
- Idéalement : un µA-mètre ou un shunt 1 kΩ + multimètre pour voir les 120 µA
Identifier le stepping
// stepping.c — CHIP_ID.REVISION : 0x3 = A4 (datasheet Appendix C)
#include "pico/stdlib.h"
#include "hardware/regs/io_bank0.h" // accès registre via SDK/regs
// Lire CHIP_ID.REVISION (bloc sysinfo/CHIP_ID) :
// 0x3 -> A4 ; les A2/A3 ont d'autres valeurs — table Appendix C.
//
// cherche CHIP_ID dans hardware/regs de ton pico-sdk.
picotool info // affiche aussi des infos puce via PICOBOOT
Mesurer la fuite E9 (A2)
// fuite.c — une entrée flottante du Bank 0 vue au multimètre
#include "pico/stdlib.h"
int main(void) {
stdio_init_all;
gpio_init(5); // GP5 = broche basse du Bank 0
gpio_set_dir(5, GPIO_IN); // entrée, SANS pull : cas du bug
sleep_ms(1000);
// Multimètre entre GP5 et GND (haute impédance) :
// A2 fautif : ~2,2 V et ~120 µA SOURCE par la broche (!)
// A3/A4 : potentiel instable mais courant négligeable
gpio_pull_down(5); // la parade : forcer un niveau
// -> la tension s'effondre à 0 V, le courant de fuite n'existe plus
for (;;) { sleep_ms(1000); }
}
Parades conception (valables sur tous les steppings)
- Jamais d'entrée flottante :
gpio_pull_up/gpio_pull_downsur TOUTE broche inutilisée — la règle d'or de l'EMC devient une règle de conso sur A2. - Entrées analogiques : le diviseur/bouche-à-temps qui laisse l'ADC planer à mi-tension réveille la fuite — polarise tes sources.
- Sommeil bas courant : la conso en sleep est dominée par les fuites des pads — sur A2 avec 20 entrées flottantes, 20 × 120 µA = 2,4 mA, soit l'ordre de grandeur de tout ton budget batterie (le LDO a un mode veille à faible consommation, jusqu'à 1 mA pour la rétention en sleep, datasheet §6.3).
- Acheter récent : A3/A4 corrigent E9 et les errata bootrom E13 (IMAGE_DEF invalide bloque le boot), E14 (connect_internal_flash ignore la broche CS1), E15 (permissions OTP pages 62/63), E18 (motif ECC invalide dans le champ partition OTP = boot brické), E22–E23, E25 (datasheet Appendix C/D) — et les mitigations injection de fautes E20/E21/E24/E26.
Vérification attendue
Sur un A2 : GP5 flottant affiche ~2,2 V au multimètre et le courant de fuite se lit au shunt ; gpio_pull_down(5) ramène 0 V et le budget revient à la normale. Sur A3/A4 : le flottant ne source plus ce courant. CHIP_ID.REVISION = 0x3 confirme un A4. Consigne au propre : note le stepping dans la BOM de tes cartes — deux lots peuvent coexister chez ton distributeur.
Erreurs fréquentes
- Conclure à un court-circuit externe : 120 µA SOURCE par une broche en entrée, c'est le RP2350-A2 qui fuit, pas ton PCB — ne remplace pas le régulateur avant d'avoir lu le stepping.
- Croire le bug « latching » (l'ancienne description) : requalifié en fuite simple, il disparaît dès que le pad n'est plus à mi-tension — pas besoin de reset.
- Étendre la panique au Bank 1 : l'errata E9 documenté vise le Bank 0 — teste tes propres broches avant de refondre.
- Ignorer E18 avant d'écrire l'OTP : sur A2, un motif ECC invalide dans le champ partition peut bricker le boot — n'écris l'OTP que sur A3/A4 si possible.
- Compter sur la fréquence : 150 MHz nominaux (pas les 200 MHz du RP2040 overclocké) — un « ralentissement » après migration vient souvent du clock, pas d'un silicium fatigué.
- Oublier la plage -40…85 °C (datasheet §14.9.3) et la coupure thermique de régulateur (jonction 100–150 °C config) dans un boîtier fermé : les mesures de fuite augmentent avec la température — mesure à froid ET à chaud.
Autres tutoriels pour cette carte
- Flasher MicroPython sur une carte RP2350 générique et faire clignoter la première LED
- Console série sur RP2350 : USB CDC natif et UART0 de secours
- Lire l'ADC 12 bits et le capteur de température interne du RP2350
- Exploiter les 3 blocs PIO et 12 machines d'état du RP2350 (avec IRQ dédiées)
- Pico SDK 2.x sur une carte RP2350 générique : CMake, board header et PICO_BOARD
- Basculer les cœurs de Arm Cortex-M33 à Hazard3 RISC-V avec ARCHSEL
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython