🛠 Auditer le stepping de son RP2350 : fuite Bank 0 (E9), errata bootrom et parades
Objetivos
El RP2350 tiene un pasado: el silicio A2 (primeros lotes) arrastra erratas documentadas, la más famosa — RP2350-E9 — afecta al consumo y a las entradas flotantes: un pin del Bank 0 configurado como entrada fuente de ~120 µA cuando el potencial flota entre los niveles lógicos, y sube solo hasta 2,2 V. Inicialmente calificado como «latching pull-down», el problema fue reclasificado como «fuga aumentada del Bank 0 cuando la entrada del pad está activada», reportado especialmente por los desarrolladores de Bus Pirate, y corregido en los steppings A3/A4 anunciados en julio de 2025 (pico-feedback#401 ; anuncio A3/A4 + RP2354). Este tutorial: identificar tu stepping, medir la fuga y hacer cualquier diseño robusto independientemente del lote.
Material
- 1 × tarjeta RP2350 genérica (el stepping está grabado en el silicio, no en el PCB: se lee mediante registro)
- 1 × pico-sdk 2.x (C) o sonda PICOBOOT + picotool
- Idealmente: un microamperímetro o una resistencia shunt de 1 kΩ + multímetro para ver los 120 µA
Identificar el 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
Medir la fuga 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); }
}
Soluciones de diseño (válidas en todos los steppings)
- Nunca entradas flotantes:
gpio_pull_up/gpio_pull_downen CADA pin no utilizado — la regla de oro de la EMC se convierte en una regla de consumo en A2. - Entradas analógicas: el divisor/temporizador que deja al ADC a media tensión despierta la fuga — polariza tus fuentes.
- Sueño de bajo consumo: el consumo en modo sleep está dominado por las fugas de los pads — en A2 con 20 entradas flotantes, 20 × 120 µA = 2,4 mA, lo cual es del orden de magnitud de todo tu presupuesto de batería (el LDO tiene un modo de espera de bajo consumo, hasta 1 mA para la retención en sleep, datasheet §6.3).
- Comprar reciente: A3/A4 corrigen E9 y las erratas de bootrom E13 (IMAGE_DEF inválido bloquea el arranque), E14 (connect_internal_flash ignora el pin CS1), E15 (permisos de páginas OTP 62/63), E18 (patrón ECC inválido en el campo de partición OTP = arranque bloqueado), E22–E23, E25 (datasheet Apéndice C/D) — y las mitigaciones de inyección de fallos E20/E21/E24/E26.
Verificación esperada
En un A2: GP5 flotante muestra ~2,2 V en el multímetro y la corriente de fuga se lee en el shunt; gpio_pull_down(5) devuelve 0 V y el presupuesto vuelve a la normalidad. En A3/A4: la entrada flotante ya no entrega esa corriente. CHIP_ID.REVISION = 0x3 confirma un A4. Consejo: anota el stepping en la BOM de tus tarjetas — dos lotes pueden coexistir en tu distribuidor.
Errores frecuentes
- Concluir en un cortocircuito externo: 120 µA FUENTE por un pin configurado como entrada, es el RP2350-A2 el que tiene fugas, no tu PCB — no reemplaces el regulador antes de haber leído el stepping.
- Creer que el bug es «latching» (la descripción antigua): requalificado como fuga simple, desaparece en cuanto el pad no está a media tensión — no hace falta reset.
- Extender la alarma al Bank 1: la errata E9 documentada afecta al Bank 0 — prueba tus propios pines antes de rediseñar.
- Ignorar E18 antes de escribir en la OTP: en A2, un patrón ECC inválido en el campo de partición puede bloquear el arranque — escribe en la OTP solo en A3/A4 si es posible.
- Confiar en la frecuencia: 150 MHz nominales (no los 200 MHz del RP2040 overclockeado) — una «ralentización» tras la migración suele venir del reloj, no de un silicio cansado.
- Olvidar el rango -40…85 °C (datasheet §14.9.3) y el corte térmico del regulador (unión 100–150 °C según configuración) en una carcasa cerrada: las mediciones de fuga aumentan con la temperatura — mide en frío Y en caliente.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython