Proceso de Programación de Memorias SPI Flash para Manufactura Electrónica
Contenido del artículo
La memoria SPI Flash externa aparece en equipos industriales, gateways IoT, sistemas automotrices, dispositivos de red, plataformas Linux embebidas y tarjetas con FPGA. Puede almacenar desde unas tablas de configuración hasta el código completo que permite arrancar al producto. Por esa razón, programar una SPI Flash en producción no consiste únicamente en copiar un archivo binario: exige controlar el dispositivo correcto, el mapa de memoria, la alimentación, los registros de protección, los tiempos internos de borrado y grabado, la integridad de señal y la evidencia de verificación.
Un archivo correcto puede generar una unidad defectuosa si se carga en el offset equivocado, si se borra una zona reservada o si el programador comparte el bus con un procesador que permanece activo. Del mismo modo, una operación que termina con el mensaje “PASS” puede no ser suficiente si no se confirma el arranque, la versión, el identificador del dispositivo y el contenido de las regiones críticas.
Esta guía describe un proceso reproducible para programación SPI Flash en manufactura, desde la preparación de la imagen hasta la validación posterior al grabado. Los comandos y tamaños mostrados son habituales en memorias SPI NOR, pero siempre deben confirmarse contra la hoja de datos de la referencia exacta.
SPI Flash externa frente a Flash interna del microcontrolador

La Flash interna está fabricada dentro del mismo encapsulado del microcontrolador y normalmente se programa mediante una interfaz de depuración o boot ROM, como SWD, JTAG o UART. El fabricante del MCU define el algoritmo de borrado, las regiones de seguridad, el mapa de direcciones y los mecanismos de protección.
La SPI Flash externa es un circuito independiente conectado al host mediante SPI, Dual SPI, Quad SPI u Octal SPI. El procesador puede leerla como almacenamiento de datos, copiar su contenido a RAM durante el arranque o ejecutar código directamente desde ella mediante XIP. También puede actuar como memoria de configuración para una FPGA o CPLD.
| Criterio | Flash interna del MCU | SPI Flash externa |
|---|---|---|
| Ubicación física | Dentro del microcontrolador | Componente separado en el PCB |
| Acceso de programación | SWD, JTAG, boot ROM o ISP del MCU | Acceso directo al bus SPI o acceso indirecto mediante el host |
| Uso típico | Firmware principal, bootloader y datos internos | Boot image, firmware, bitstream, recursos, sistema de archivos y calibración |
| Riesgo de contención | Normalmente administrado por el MCU | Alto si el host y el programador controlan el mismo bus |
| Protección | Readout protection, option bytes o seguridad propietaria | Status registers, BP bits, WP#, locks por sector y regiones OTP |
Esta diferencia obliga a tratar la SPI Flash como un subsistema propio. Antes de ejecutar cualquier operación destructiva, el programador debe conocer la tensión correcta, la densidad, el tamaño de página, la geometría de borrado, el modo de direccionamiento y el estado de protección.
Qué contiene una imagen de producción

En productos sencillos, la imagen puede ser un único archivo de firmware que comienza en la dirección cero. En sistemas más complejos, la memoria contiene varias regiones independientes. Una imagen de producción típica puede incluir un bootloader, uno o dos bancos de aplicación, una tabla de particiones, datos de configuración, certificados, recursos gráficos, parámetros de radio y constantes de calibración.
La documentación de Renesas muestra, por ejemplo, imágenes multiparte en las que el bootloader, los bancos de aplicación, la configuración y el encabezado de producto se colocan en offsets específicos. Cambiar uno de esos offsets sin actualizar el software de arranque puede impedir que el dispositivo encuentre una imagen válida.[1]
También importa el formato del archivo. Un archivo BIN contiene una secuencia de bytes sin información de dirección; por lo tanto, el proyecto de programación debe proporcionar el offset de inicio. Intel HEX, Motorola S-record y ELF pueden conservar direcciones o segmentos. Herramientas de producción como J-Flash SPI admiten BIN, HEX, SREC, ELF y otros formatos, pero la compatibilidad no elimina la obligación de validar las direcciones, los huecos y el tamaño final.[2]
| Región posible | Contenido | Riesgo si se programa incorrectamente |
|---|---|---|
| Bootloader | Secuencia inicial y validación de aplicación | El equipo no arranca o pierde la recuperación |
| Aplicación A/B | Firmware activo y respaldo | Rollback imposible o banco inválido |
| Configuración | Modelo, región, opciones y parámetros | Producto con variante equivocada |
| Calibración | Constantes medidas por unidad | Pérdida de precisión o incumplimiento funcional |
| Identidad y seguridad | Serial, MAC, certificados o llaves | Duplicidad, pérdida de trazabilidad o vulnerabilidad |
Antes de liberar una imagen, conviene generar un manifiesto que incluya nombre, versión, tamaño, offset de cada región, hash criptográfico, referencia de memoria compatible y política de protección final. La imagen debe construirse de forma reproducible y mantenerse bajo control de versiones.
Secuencia segura: identificar, borrar, programar y verificar

Una celda NOR puede programarse de “1” a “0”, pero necesita un ciclo de borrado para regresar de “0” a “1”. Por ello, el proceso debe respetar la geometría del dispositivo. En muchas memorias son comunes páginas de 256 bytes y sectores de 4 KiB, aunque no deben asumirse como universales. Enviar datos más allá del límite de una página puede producir wrap-around en ciertas referencias y sobrescribir el inicio de la misma página.[3]
La secuencia de producción recomendada comprende los siguientes controles:
- Estabilizar la alimentación. Aplicar la tensión nominal con límite de corriente y esperar el tiempo de power-up especificado.
- Identificar el dispositivo. Leer JEDEC ID mediante RDID y, cuando esté disponible, consultar SFDP. El estándar JESD216 define una base de datos interna que describe parámetros de la memoria.[4]
- Leer registros de estado y configuración. Registrar protección, Quad Enable, modo de dirección y otros bits que influyen en el acceso.
- Ejecutar blank check o compare. Determinar si los sectores afectados ya están vacíos o coinciden con la imagen.
- Desbloquear únicamente lo necesario. Limpiar temporalmente las protecciones que impidan borrar las regiones autorizadas.
- Borrar por sector o bloque. Evitar Chip Erase cuando existan datos de fábrica o calibración que deban conservarse.
- Programar respetando páginas y offsets. Dividir la imagen en transacciones válidas y no cruzar límites de página.
- Verificar por lectura. Comparar byte a byte o por bloques y calcular CRC o hash sobre el rango esperado.
- Restaurar la protección. Configurar los sectores de boot y las zonas reservadas según la política del producto.
- Realizar prueba de arranque. Confirmar que el host identifica la Flash, localiza la imagen y ejecuta el firmware correcto.

Cada operación de borrado, programación o modificación de registros debe ir precedida por Write Enable. Después, el equipo debe leer el bit WEL para confirmar que la orden fue aceptada y sondear WIP/BUSY hasta que la operación interna termine. Sustituir este sondeo por un retardo fijo es arriesgado: el tiempo real varía con tensión, temperatura, desgaste y lote del semiconductor.
Velocidad de reloj, integridad de señal y cableado

Una memoria cuyo datasheet anuncia lectura a decenas o cientos de megahercios no necesariamente puede programarse a esa frecuencia en un fixture. La frecuencia máxima del chip se mide bajo condiciones controladas; la instalación de producción añade cables, conectores, pogo pins, adaptadores, stubs y planos de retorno imperfectos.
La falla típica es intermitente: el equipo lee correctamente el JEDEC ID a baja velocidad, pero presenta errores de verificación al aumentar SCK. También puede funcionar con la placa fría y fallar después de varios ciclos. El problema no está en el archivo, sino en el margen eléctrico del enlace.
| Síntoma | Causa probable | Acción técnica |
|---|---|---|
| ID incorrecto o 0xFF | CS# abierto, alimentación ausente, HOLD# activo o MISO sin retorno | Verificar pinout, niveles y estado de control |
| Programa pero no verifica | SCK excesivo, cable largo, rebotes o mala tierra | Reducir frecuencia, acortar fixture y mejorar retorno |
| Falla sólo in-circuit | Contención con el procesador anfitrión | Mantener host en reset o aislar el bus |
| Falla después de varios ciclos | Caída de tensión o calentamiento del adaptador | Medir VCC en el dispositivo durante erase/program |
| Escritura ignorada | WEL no activo o región protegida | Leer status registers antes y después del comando |
La calificación del proceso debe buscar una frecuencia robusta, no la cifra máxima. Es recomendable revisar SCK, CS#, MOSI y MISO con osciloscopio en el punto más cercano al componente, verificar que la tensión se mantenga dentro del rango durante el borrado y documentar la longitud máxima del fixture. Si el margen sólo existe al reducir drásticamente la frecuencia, el problema debe resolverse en el diseño de acceso o en el fixture, no ocultarse aumentando reintentos.
Protección de sectores y status registers

Las memorias SPI NOR suelen incluir bits de protección por bloque y mecanismos de bloqueo. En familias Winbond, por ejemplo, los bits BP seleccionan una fracción protegida; SEC cambia la granularidad a sectores; TB elige si la protección comienza en la parte superior o inferior; y CMP puede complementar la región. El pin WP# puede impedir que se modifiquen los registros que gobiernan la protección, en lugar de bloquear directamente todos los datos.[5]
Este detalle explica muchos falsos diagnósticos. Un operador puede interpretar un “erase failed” como daño del dispositivo cuando en realidad intenta escribir una región protegida. En el extremo contrario, borrar todos los registros de protección sin registrar su estado puede dejar expuesto el boot code al terminar el proceso.
Los locks permanentes u OTP requieren especial cautela. Deben aplicarse únicamente después de completar la verificación, la prueba de arranque y la aprobación de la política de actualizaciones. Un bloqueo irreversible aplicado a una imagen equivocada convierte una memoria funcional en material no recuperable.
Programación in-circuit frente a programación por socket

La programación por socket trabaja con el componente antes del ensamble. El programador controla directamente VCC, CS#, SCK, MOSI, MISO, WP# y HOLD#/RESET#. Esto simplifica el diagnóstico y evita interferencia del host. Además, permite utilizar estaciones gang y cargar varias memorias en paralelo.
La programación in-circuit elimina el manejo adicional de componentes y permite asociar el contenido de la Flash con el serial del PCB. Sin embargo, el bus SPI ya está conectado al microprocesador, FPGA u otros periféricos. Si el host está parcialmente alimentado o sus salidas no permanecen en alta impedancia, puede conducir las mismas líneas que el programador y producir contención.
| Criterio específico | Socket | In-circuit |
|---|---|---|
| Control eléctrico | Directo y aislado | Compartido con el circuito anfitrión |
| Velocidad potencial | Alta y estable | Limitada por layout, fixture y carga del bus |
| Programación paralela | Natural mediante gang programmer | Requiere múltiples canales o panelización |
| Manipulación del componente | Mayor; exige ESD y control del socket | Nula después del ensamble |
| Trazabilidad por PCB | Requiere correlación posterior | Directa durante la programación |
| Diseño para prueba | No requiere pads en el PCB | Requiere acceso, reset del host y aislamiento |

Para ISP directo a la memoria, el diseño debe permitir mantener al host en reset, controlar los chip select de otros esclavos y evitar alimentación simultánea desde dos fuentes. Resistencias serie, jumpers, buffers tri-state o switches analógicos pueden aportar aislamiento. Las herramientas de programación directa pueden acceder a la Flash sin depender del soporte del procesador anfitrión, pero el diseño eléctrico sigue siendo responsabilidad del sistema.[6]
Validación después del grabado

La verificación debe confirmar cuatro dimensiones diferentes: identidad, contenido, configuración y función. Leer el JEDEC ID confirma que el dispositivo responde y que su densidad coincide con el proyecto. La comparación byte a byte confirma que el rango programado coincide con la imagen. Un CRC o hash permite registrar una huella compacta del contenido. La lectura de status registers confirma que el modo de dirección y la protección quedaron en el estado esperado.
Finalmente, la prueba de arranque valida algo que ninguna comparación de memoria puede demostrar por sí sola: que el procesador interpreta correctamente el encabezado, los offsets, el modo de lectura, los dummy cycles y la estructura de la imagen. Cuando el producto utiliza firmas digitales, el hash demuestra integridad, pero la autenticidad sólo se confirma verificando la firma contra una raíz de confianza.
Una evidencia mínima por unidad debe incluir el ID del programador, número de parte de la memoria, JEDEC ID leído, versión de imagen, hash esperado, resultado de verify, registros finales, fecha, hora y serial del producto. Estos datos convierten un “PASS” aislado en un registro trazable de manufactura.
Errores que deben bloquear la liberación
Una operación debe detenerse si la densidad leída no coincide con el proyecto, si el BIN excede la memoria, si el offset no está documentado, si existe una región reservada sin respaldo, si el host no puede aislarse del bus o si la verificación falla aun una sola vez. Tampoco deben aceptarse reintentos indefinidos como solución: un proceso robusto identifica la causa eléctrica, lógica o de configuración.
Entre los riesgos más costosos están programar una imagen en la revisión de hardware equivocada; borrar MAC, seriales, calibración o llaves; modificar Quad Enable o el modo de 3/4 bytes sin considerar el boot ROM; y cortar alimentación mientras WIP sigue activo. Todos son prevenibles mediante identificación previa, límites de dirección, manifests aprobados, fixtures calificados y validación funcional.

Conoce más
Para ampliar los fundamentos y consultar documentación primaria, revise los siguientes recursos:
- JEDEC JESD216H: Serial Flash Discoverable Parameters (SFDP).
- SEGGER J-Flash SPI: programación, borrado, verify y readback.
- Winbond: protección de boot code y datos críticos en SPI NOR.
- Memorias No Volátiles en Sistemas Embebidos: Flash, EEPROM, eMMC y UFS.
- Programación In-System vs Preprogramación de ICs.