Está en la página 1de 6

31/1/23, 5:44 Página de inicio de RayeR/programador FlashROM SPI de puerto paralelo

Programador SPI FlashROM a puerto paralelo


      23.3.2008 Como soy una cucaracha a la que le gusta hurgar en los códigos BIOS de la computadora y no
descansaré hasta que la pantalla se quede en negro para siempre :), también necesito poder reprogramar
manualmente la FlashROM. Anteriormente, para los flashes paralelos que estaban en la placa en el socket
DIL32 o PLCC32, lo solucionaba simplemente con hotflashing, cuando tenía un segundo chip con un BIOS
funcional listo en reserva. Lo inserté en el zócalo, lo reemplacé con un chip mal programado sobre la marcha
y lo reprogramé.
      Ahora conocí un nuevo tipo de memoria en mi nueva placa base Gigabyte GA-P31-DS3L - Winbond
25X40VSIG High Speed ​Serial SPI FlashROM en un paquete SOIC-8 SMD, que se suelda directamente a la
placa. Los puentes sur Intel ICHx han sido compatibles con las variantes FWH y SPI durante mucho tiempo.
Ciertos registros y pines del conjunto de chips se pueden usar para seleccionar cuál de las interfaces se usa
principalmente para el BIOS. Al ahorrar un centavo por zócalo en el componente SMD, el costo total de
producción se reducirá y los gerentes tendrán más dinero para mejores autos y prostitutas;). Todo lo que
tenemos que hacer los manitas es tomar un soldador... Para trabajar razonablemente con el flash, lo soldé a
un zócalo DIL8 preciso. Luego soldé el segundo zócalo DIL8 a la placa base. Como no pude llegar al lugar
con soldadura alrededor del zócalo (frente al conector SATA), lo dejé flotar en dos piezas de cable de 4 hilos:

      Esto fue seguido por la producción del programador. Sin embargo, todo lo que necesita para conectar un
dispositivo SPI a una PC es un puerto paralelo ordinario, 5 cables, un par de resistencias y conectores. La
conexión se basa en un cable de programación SPI tipo BSD para programar microcontroladores Atmel
AVR. La mencionada memoria W25X40V está diseñada para un voltaje de alimentación de 3.3V, por lo que
separé las líneas de datos con resistencias para que no sufran un mayor voltaje de la LPT. Al mismo tiempo,
las resistencias cumplen la función de amortiguación, ya que sin ellas, en un cable plano más largo (aprox.
1,5 m) sin líneas de blindaje entre las líneas de señal, se produciría una diafonía y, por lo tanto, una
transmisión de datos errónea. Interesante que el AVR me funcione con el mismo cable sin ningún problema.
Usé una fuente externa de energía.

rayer.g6.cz/elektro/spipgm.htm 1/6
31/1/23, 5:44 Página de inicio de RayeR/programador FlashROM SPI de puerto paralelo

Todo el asunto valió la pena en un plano universal se parece a esto:

      Lo siguiente es el software que tuve que escribir. Primero, se tuvo que programar la capa más baja, que
funciona con los registros LPT y establece/lee los niveles requeridos en las líneas SPI dadas. Sobre este
tema, puedo consultar el libro Burkhard Kainka: uso de la interfaz de PC de la editorial HEL 1997, del cual
una vez aprendí cómo encender mi primer LED en un LPT. Pero incluso en Internet hay recursos más que
suficientes sobre este tema.
      También me gustaría decir algo sobre el propio bus SPI. Consta de tres líneas: SCK - Serial Clock (hasta
decenas de MHz), MISO - Master Input Slave Output, MOSI - Master Output Slave Input y en este caso
también hay una línea de control auxiliar CS# - Chip Select. La comunicación suele ser entre dos
dispositivos, uno de los cuales es el Maestro (en este caso, la PC) que controla el reloj SCK (nivel de reposo
log.0 aquí) y envía comandos/datos a la línea MOSI mientras lee simultáneamente datos de la línea MISO . El
dispositivo esclavo (memoria en este caso) luego responde al reloj SCK enviando un bit a la línea MISO en el
flanco descendente del reloj y leyendo un bit de la línea MOSI en el flanco ascendente del reloj. Los bytes se
envían en MSB primero, LSB en último orden. Una vez completada la transferencia, el maestro devuelve el
reloj al nivel inactivo (log. 0). A diferencia de I2C, el bus es totalmente dúplex. Los dispositivos esclavos no se
identifican con ninguna dirección. Para poder conectar varios dispositivos esclavos a las líneas SPI, el
maestro debe estar conectado a cada dispositivo mediante una línea de control CS# independiente, que se
encuentra en el nivel de registro. 0 activa un dispositivo zn Slave (otros tienen salidas SPI en estado de alta
impedancia para no afectar la comunicación en curso (los dispositivos SPI tienen salidas de 3 estados, no
se necesitan pull-ups). En el caso de la memoria Flash SPI, CS# es se utiliza para el inicio y el final del
cuadro, por lo que no se puede conectar simplemente a tierra. para que no afecten la comunicación en curso
(los dispositivos SPI tienen salidas de 3 estados, no se necesitan pull-ups). En el caso de SPI Flash, CS# se
usa para el inicio y el final del cuadro, por lo que no se puede vincular simplemente a tierra. La siguiente
imagen muestra más cómo se lleva a cabo la lectura de la memoria: para que no afecten la comunicación en
curso (los dispositivos SPI tienen salidas de 3 estados, no se necesitan pull-ups). En el caso de SPI Flash,
CS# se usa para el inicio y el final del cuadro, por lo que no se puede vincular simplemente a tierra. La
siguiente imagen muestra más cómo se lleva a cabo la lectura de la memoria:

rayer.g6.cz/elektro/spipgm.htm 2/6
31/1/23, 5:44 Página de inicio de RayeR/programador FlashROM SPI de puerto paralelo

      En primer lugar, el Maestro inicia el marco con la transición de CS# a registro. 0 y esto activa la memoria.
Luego, el maestro inicia el reloj y envía el primer comando de byte 3h: lectura de la memoria. La memoria
descubre lo que queremos de ella y sabe que aún necesita obtener una dirección. Este es enviado por el
maestro en los siguientes 3 Bytes. La memoria decodifica la dirección e inmediatamente comienza a enviar
datos en el siguiente Byte. Si el Máster también solicita datos de las siguientes direcciones, deja el reloj en
marcha y la memoria incrementa automáticamente la dirección. Se ignoran los datos entrantes adicionales
del maestro. Luego, el maestro finaliza el final de la trama al hacer la transición del reloj al estado inactivo del
registro. 0 y haciendo la transición de CS# al estado inactivo de registro. 1.
      La memoria admite un determinado conjunto estándar de comandos, que incluyen, por ejemplo, leer,
escribir, borrar página, borrar sector, borrar todo el chip, bloquear, desbloquear, identificar el fabricante y tipo
de chip JEDEC ID, leer el registro de estado, . .. Algunos comandos son de un solo byte, otros tienen
parámetros y datos. Para algunos, la memoria responde enviando datos, para otros no. Para obtener más
detalles, consulte la hoja de datos de la memoria específica.
      El siguiente paso fue escribir funciones para enviar y recibir Bytes y bloques de datos, y finalmente
funciones para procesar comandos de memoria Flash individuales. La versión actual del programa le
permite identificar el tipo de memoria /i , leer y mostrar un bloque de datos de un tamaño dado desde una
dirección dada /r , leer toda la memoria en un archivo /d , programar toda la memoria desde un archivo/p ,
borra toda la memoria /e y desbloquea los bits de protección contra escritura /u . Se pueden usar parámetros
adicionales /l= para configurar la dirección base LPT y /d= para extender la duración del pulso SCK en
microsegundos. Hay 4 versiones disponibles en el paquete SPIPGM para DOS, Windows, Linux 32b y Linux
64b. Si tiene alguna pregunta, lea primero las preguntas frecuentes detenidamente .
      Debido a la velocidad limitada de LPT y el método de transferencia en serie, la lectura o escritura tarda
de decenas de segundos a minutos. El tiempo de borrado del chip depende de la velocidad de los
mecanismos internos en la memoria y toma aproximadamente unidades a decenas de segundos. Se podría
lograr una comunicación más rápida utilizando un microcontrolador, preferiblemente con un controlador SPI
de hardware, que se comunicaría con la PC ya sea de 8 bits a través de LPT o USB. Ejemplo de acción del
programa con memoria ST M25P32:

Programador SPI FlashROM 1.0 (C) 2008 por Martin Rehak; rayer^lista*cz
Compilado por GCC 3.4.5 (mingw especial) a las 18:41:28, 26 de marzo de 2008

SPI conectado al puerto LPT en la dirección base de E/S: 378h, ancho de pulso SCK: t+0us
ID de FlashROM JEDEC, tipo: 202016h
ST Microelectrónica M25P32 (4 MB)
Sector de lectura en: 00396000h (89%)

      21/7/2010 En cooperación con la gente de los proyectos Flashrom y Coreboot , a quienes les
proporcioné el código fuente de SPIPGM, se ha agregado soporte para mi programador SPI a esta
herramienta de flasheo universal. Al mismo tiempo, también se creó una versión para DOS (compilada en
DJGPP ) , que puedes descargar aquí . Por lo tanto, los usuarios de flashrom obtuvieron la posibilidad de
programar a través del puerto LPT y los usuarios de SPIPGM obtuvieron un amplio soporte para varios tipos
de memoria flash. El programador SPI en el puerto LPT se selecciona con un interruptor:
flashrom -p rayer_spi [más comandos]

Hice una prueba comparativa con una FlashROM ST M25P32 de 4 MB:

programa lectura lubricación


SPIPGM 2:41 a.m. 0:21 (sin verificación)
flashrom 2:44 a.m. 3:34 (con verificación)

rayer.g6.cz/elektro/spipgm.htm 3/6
31/1/23, 5:44 Página de inicio de RayeR/programador FlashROM SPI de puerto paralelo

La velocidad de lectura es, por lo tanto, totalmente comparable, mientras que el borrado es más lento en
flashrom, ya que también incluye verificación forzada (es decir, lectura completa). Además, uso un comando
de borrado de un solo chip. La versión actual del flashrom aún no tiene ningún indicador de progreso, así que
no te asustes y ve a tomar un café mientras tanto :)

      19.3.2011 Para no tener que avergonzarme del bastl que se muestra arriba (además de en una placa
poco práctica), decidí construir un nuevo programador SPI FlashROM. Sin embargo, el principal motivo fue la
necesidad de poder programar cómodamente memorias SMD en paquete SOIC-8, que actualmente son las
más extendidas. Así que hubo un problema de dónde conseguir un zócalo ZIF adecuado, que resultó ser un
hueso duro de roer. Los enchufes son producidos, por ejemplo, por la empresa taiwanesa LOTES Co., Ltd. ,
que no tiene un distribuidor aquí, o se puede comprar min. después de 1000 uds. en la compañía
estadounidense Larsen Associates o por una reducción de $48 en DigiKey . ACTUALIZACIÓN: Ya han
aparecido rebajas baratas en eBay .

cuervo blanco: Advantech AIMB-766 con enchufe ZIF

      No quería aceptar estas condiciones, así que investigué cómo hacer el ZIFka en casa en mi rodilla.
Examiné mi reserva de varios conectores de computadora y seleccioné 3 posibles candidatos: un conector
RJ-45 de una tarjeta Ethernet, una ranura DIMM y una ranura PCI. La ranura PCI resultó ser la mejor porque
tiene una pluma larga y flexible y no se deshace después de cortarla. Corté una pieza con 2 x 4 pines de la
ranura PCI y luego la corté por la mitad. También lijé parcialmente la parte superior del conector para que
sobresalieran los extremos de los pines. Durante esta operación, saqué la pluma del conector y luego la volví
a colocar. Es bastante fácil con Peán. En el plano, las dos mitades del conector están separadas por el
ancho del chip, es decir, unos 5,5 mm con un margen, y así definen su posición horizontal. Cuando se coloca
en la pluma, el chip se empuja hacia abajo para que que los tabiques de plástico entre las aletas definen
claramente la posición vertical de las patas y en esta posición se asegura el chip deslizando el perfil en "C"
de plexiglás. La desviación de las plumas es de aproximadamente 1 mm hacia abajo. Arrancar el chip
requiere un poco de práctica, pero ahora puedo hacerlo bastante rápido.
      Hice la cabeza plana con un método rápido a partir de la cabeza con un marcador de alcohol y la grabé
en FeCl 3 . Aumenté los valores de resistencia para las líneas MISO, MOSI, SCK y CS# a 220 Ω. El tantalio
de 100 µF y 3 cerámicas se encargan del bloqueo de energía. También puse un estabilizador LDO LE33CZ
de 3.3V en el tablero. Se puede obtener energía para ello, por ejemplo, de una fuente de PC, un puerto USB
o un puerto PS/2. El programador me funciona sin problemas a toda velocidad. Intenté programar y verificar
varios chips y no hubo ningún desajuste (esto me sucedió ocasionalmente con el bastle anterior). También
verifiqué la señal SCK en el osciloscopio digital, en cuyos bordes hay fluctuaciones de un máximo de 0,4 V,
lo cual está bien. Si quisiera ser un perfeccionista, agregaría un búfer de 3,3 V separado a la placa, lo que
ayudaría a algunas PC con LPT en problemas, pero hasta ahora no he tenido ningún problema. SPIPGM
también trabajó en una nueva computadora en el trabajo, donde hay un adaptador PCI-E con 2x COM y 1x
LPT en la dirección E/S alta E800h. La versión actual de SPIPGM 1.9c se puede descargar aquí .

      24.10.2014 Anteriormente, recibí varias preguntas sobre cómo programar memorias de 1.8V, por lo que

rayer.g6.cz/elektro/spipgm.htm 4/6
31/1/23, 5:44 Página de inicio de RayeR/programador FlashROM SPI de puerto paralelo
les dije que eligieran un traductor de nivel de voltaje, por ejemplo, de Texas Instruments . Ahora me encontré
en una situación en la que necesitaba actualizar la memoria Macronix MX25U6435F cuando bloqueé mi
86Duino ZERO mientras intentaba con Coreboot . Encontré un convertidor de caja TXS0108E TSSOP20 de
muestra en un cajón en el trabajo (no hay mucho para retocar), pero pensé que al menos lo probaría.
      Es un convertidor con detección automática de la dirección del flujo, al que solo necesita conectar 2
fuentes de alimentación y encender habilitar. Corté un trozo de tablero universal y le até la cucaracha con
alambres delgados. Ella era toda una perra. Hice un voltaje de suministro de 1.8V desde 5V usando un
pequeño LDO TLV70018. Conecté las líneas de datos del LPT al puerto B y la placa del programador de
memoria existente al puerto A. Medí los valores inactivos sin la memoria conectada y todo parecía estar bien.
Entonces lo conecté a la memoria y a la PC, pero la memoria no pudo detectar. Así que tomé un
osciloscopio digital y descubrí que el circuito se comporta de manera algo errática; por ejemplo, la señal
SCK tenía una amplitud de aproximadamente 1,2 V en el lado de 1,8 V de la señal SCK, y solo los
siguientes tenían los 1,8 V correctos. MISO nuevamente en la salida del convertidor B (en el lado LPT) no
alcanzó v log. 0 voltaje suficientemente bajo. A pesar de que puse a tierra la línea del puerto A, había
alrededor de 0,5 V en la salida B, y si la bajé a través de la resistencia de 220 Ω, la salida B ya era de 2,6 V,
lo que no es un registro. 0. Si desconecté la salida B del LPT, el voltaje cayó a 35 mV. Dado que la entrada
LPT se activa, parece que que el convertidor probablemente no tenga salidas lo suficientemente duras.
Finalmente, después de otra hora de trabajo de laboratorio, desoldé la cucaracha con enojo y la tiré. Quizás
un circuito sería más apropiado TXB0104 , (o un par de traductores unidireccionales), pero no lo tenía
disponible y no quería esperarlo.
      Resulta que, a veces, las soluciones más simples funcionan mejor, así que volví a limitar pasivamente el
voltaje del LPT usando resistencias y diodos. Soldé los diodos en la placa del programador existente, vea el
diagrama actualizado arriba . Elevé la salida de memoria MISO usando una cascada de 2 transistores
BC547 .

Junto con el programador conectado se ve así:

rayer.g6.cz/elektro/spipgm.htm 5/6
31/1/23, 5:44 Página de inicio de RayeR/programador FlashROM SPI de puerto paralelo

Con esta conexión, ya no tuve problemas para programar la memoria. También me gustaría señalar la última
actualización de mi programa SPIPGM 2.22 , donde agregué soporte experimental del modo de
direccionamiento de 32 bits para memorias de más de 16 MB.

      10.4.2019 Si ya no tiene un puerto paralelo en ninguna PC, se ofrece una alternativa económica en forma
de convertidor USB chino CH341A con interfaces UART, SPI e I2C. Los controladores para Windows, Linux,
MAC OS, Android y una biblioteca para desarrolladores están disponibles. Descubrí un pequeño
programador USB en eBay SPI FlashROM y I2C EEPROM con este chip para CZK 56, que pedí para probar
y ahora llegó. El zócalo ZIF solo hace que valga la pena el precio. El bajo precio afectó un poco la calidad de
la soldadura. Como puede ver en la foto, los encabezados de los pines junto al zócalo están soldados
torcidos, por lo que tuve que volver a soldarlos, por lo que me quejé con los chinos y obtuve un pequeño
descuento. Otro problema es que al diseñar el programador, alguien debe haberlo pensado: la placa
contiene un estabilizador LDO de 3,3 V desde el cual se alimenta la memoria en el zócalo, pero el chip en sí
se alimenta con 5 V desde USB y, por lo tanto, se alimenta al memoria al nivel de 5V a través de las líneas
MOSI, SCK, CS#. Al mismo tiempo, el chip puede funcionar tanto con 5 V como con 3,3 V (tiene un
regulador interno de 3,3 V). Así que apliqué una pequeña solución, que consiste en levantar el pin 28 - VCC y
conectarlo a la salida LDO de 3,3 V y también conectar el pin 9 - V3 (o su condensador de bloqueo) a la
salida LDO. Entonces todo está bien, al menos podrían agregarle puentes. Como software de control se
puede utilizar AsProgrammer o flashrom . La lectura de 1 MB de memoria EN25T80 con AsProgrammer
tomó 8 s, es decir, a una velocidad de 125 kB/s.

Volver

Actualizado el 12 de abril de 2019 a las 23:43

rayer.g6.cz/elektro/spipgm.htm 6/6

También podría gustarte