¿Cómo escribo en la memoria flash SPI?

8

Estoy trabajando en una aplicación de audio donde, en lugar de almacenar datos de audio en una tarjeta SD ( Waveshield en Arduino) Lo guardo en un IC de memoria flash SPI y hago rodar mi propia placa con MCU, DAC y amplificador.

Estoy usando un Winbond W25Q80BVSSIG .

Estoy bastante familiarizado con la programación de AVR utilizando AVRISP mkII o USBTiny , ¿se están escribiendo datos en flash con el mismo programador? No he podido encontrar nada cuando busco específicamente programadores de memoria flash SPI.

Esta pregunta es una continuación de esta .

    
pregunta JYelton

7 respuestas

11

Si simplemente está buscando una manera de programar el flash SPI de Winbond con datos "precargados" que su microcontrolador leería para usar cuando se está ejecutando, entonces lo que querrá ver es un programador que pueda hacer -Programación de circuitos del chip flash SPI. Esto también se conoce como programación en el sistema (ISP).

Una opción es el programador de DediProg . Este dispositivo conectado por USB puede programarse en circuito si diseña su tarjeta correctamente. Incluso venden un clip de adaptador que puede adjuntarse al paquete SOW-16 sin tener que diseñar en un encabezado de programación separado en su placa. DediProg tiene boletines de información de aplicación disponibles para ayudar con el diseño correcto para el uso en el circuito. La estrategia principal para el diseño es encontrar una forma sencilla de aislar los controladores de interfaz SPI en su sistema MCU para que no interfieran con los controladores en el pod de programación SPI. La forma más sencilla de hacer esto es colocar resistencias en serie en las líneas controladas por MCU entre la MCU y el SPI Flash. El programador se conectaría en el lado del flash SPI de las resistencias de la serie. Los métodos alternativos podrían incluir agregar un MUX o interruptores analógicos en las líneas de interfaz controladas. Un esquema aún más inteligente es agregar una entrada de "habilitación de programación" a la MCU que haga que el software desconecte todas las E / S SPI del chip SPI Flash (es decir, haga que todos esos GPIOs sean entradas).

Unasegundaopciónaconsiderartambiénes el programador USB de ASIX . Presto puede hacer varios tipos de dispositivos SPI e I 2 C, incluidos los dispositivos SPI Flash. Tengo uno de estos dispositivos específicamente para programar Atmel MCU y varios tipos de dispositivos SPI Flash. Es una solución más rentable que la unidad anterior pero no tan flexible. Su dispositivo más caro llamado strong puede hacer más cosas porque tiene más pines de interfaz de destino.

Avecespuedeserbeneficiosopoderconectarunprogramadoraunaplacadedestinosintenerqueagregarunencabezadodeprogramación.Unabuenasoluciónparaestoescolocarunpequeñoconjuntodealmohadillasenunahuellaespecialdefinidapor una compañía llamada TagConnect . Fabrican y venden una serie de cables de programación de conexión rápida que tienen clavijas de pogo que se adhieren a la huella especial en la placa. Hay disponibles versiones de 6 pines, 10 pines y 14 pines del cable para adaptarse a una amplia gama de aplicaciones. El costo de los cables es muy razonable.

    
respondido por el Michael Karas
7

Nunca he oído hablar de ninguna otra herramienta que comunique SPI directamente a un chip de este tipo, y creo que es imposible ya que "todos" los chips requieren llamadas diferentes para diferentes operaciones.

El chip necesita llamadas SPI para escritura, lectura, cambio de sector, tamaño de datos, etc. En el capítulo 7.2 Instrucciones en la hoja de datos, puede ver todos los comandos SPI que puede enviarle. Por lo tanto, como todas las memorias flash externas no tienen el mismo conjunto de instrucciones, debe escribir una aplicación personalizada para esta.

EDITAR: Siendo un seguimiento, realmente recomendaría una de las memorias flash SPI propias de Atmels, ya que la mayoría de ellas ya ha escrito un código disponible para ellas. Mirando esta publicación de AVRFreaks le proporcionará el código para algunos de los chips flash de serie Atmels AT45xxxx.

    
respondido por el chwi
7

Apuesto a que podrías hacerlo con un Bus Pirate sin pasar por tu MCU ... que te permite realizar una serie algo arbitraria interacciones directamente a un chip utilizando la comunicación SPI, I2C o UART. Puede llevar un poco de trabajo "programarlo", pero probablemente te permita hacer el trabajo.

También he visto herramientas especializadas para cargar EEPROM sobre I2C directamente, pero no flash y no SPI específicamente.

    
respondido por el vicatcu
4

Compré un programador " FlashCAT " de Embedded Computers por aproximadamente $ 30 US. Fue sorprendentemente fácil conectarse a la PC a través de USB y escribir archivos en la memoria flash de Winbond. Los métodos y programadores en otras respuestas probablemente sean igual de buenos, algunos más caros o de bricolaje, pero esta es una forma barata y simple que se ajusta a lo que estaba buscando.

Aquí hay una imagen de la configuración:

ElprogramadorFlashCATestáalaizquierda,conectadoaUSB.EstáejecutandoelfirmwaredeprogramaciónSPI(adiferenciadeJTAG)ysuministrandoalimentaciónalamemoriaflash.Lapotenciasuministradaesseleccionable(3.3Vo5V)conunpuente.

TengounconectorSOICaDIPenlaplacaparafacilitarlaprogramacióndevarioschips.(TambiénpuedeverotroICdememoriaflashsentadoenlaplacabase).

Todavía no he convertido mi archivo de audio al formato binario adecuado, pero escribí un archivo WAV de 211 KB en la memoria solo para probar, como se muestra en la imagen de arriba. Luego lo volví a leer y lo guardé como un archivo nuevo, lo cambié de nombre a .wav y se reproduce correctamente en la PC.

El siguiente paso será codificar correctamente el archivo y escribir el software AVR para leer los datos y enviarlos a través de un DAC.

Descargo de responsabilidad: no estoy afiliado a Embedded Computers, solo soy un cliente que eligió algo barato y estoy compartiendo información sobre la experiencia con el producto.

    
respondido por el JYelton
4

Es un poco tarde para la discusión, pero para cualquiera que lo lea después de una búsqueda ...

Una cosa que no vi mencionada, que es absolutamente crítica cuando se programan chips SPI Flash es el control del pin Chip Select (CS_). El pin de selección de chip se usa para puntuar los comandos al SPI Flash. En particular, una transición de CS_ high a CS_ low debe preceder inmediatamente a la emisión de cualquier código de operación de escritura (WREN, BE, SE, PP). Si hay actividad entre la transición CS_ (es decir, después de que CS_ se haya agotado) y antes de que se transmita el código de operación de escritura, el código de operación de escritura generalmente se ignorará.

Además, lo que no se explica comúnmente en las hojas de datos de SPI Flash, porque es una parte inherente del protocolo SPI, que también es fundamental, es que por cada byte que se transmite en el bus SPI, se recibe un byte a cambio. Además, uno no puede recibir bytes, a menos que uno transmita un byte.

Normalmente, el SPI Master que el usuario está ordenando, tiene un búfer de transmisión, que envía bytes a la línea MOSI del bus SPI y un búfer de recepción, que recibe bytes desde la línea MISO del bus SPI. / p>

Para que los datos aparezcan en el búfer de recepción, algunos datos deben enviarse al búfer de transmisión. De manera similar, cada vez que uno envía datos fuera del búfer de transmisión, los datos aparecerán en el búfer de recepción.

Si uno no tiene cuidado al equilibrar las escrituras de transmisión y las lecturas de recepción, no sabrá qué esperar en el búfer de recepción. Si se recibe el desbordamiento del búfer, los datos generalmente se derraman y se pierden.

Entonces, cuando uno envía un comando de lectura, que es un código de operación de un byte y tres bytes de dirección, uno recibirá primero cuatro bytes de "basura" en el búfer de recepción maestro de SPI. Estos cuatro bytes de basura corresponden al código de operación y tres bytes de dirección. Mientras se transmiten, el Flash aún no sabe qué leer, por lo que solo devuelve cuatro palabras de basura.

Después de que se devuelvan esas cuatro palabras de basura, para obtener algo más en el búfer de recepción, debe transmitir una cantidad de datos igual a la cantidad que desea leer. Después del código de operación y la dirección, no importa lo que transmita, solo es un relleno empujar el DAta de lectura desde el SPI Flash al Buffer de Recepción.

Si no realizó un seguimiento cuidadoso de las primeras cuatro palabras de basura devueltas, podría pensar que una o más de ellas forman parte de los datos de lectura devueltos.

Por lo tanto, para saber qué obtiene realmente del búfer de recepción, es importante conocer el tamaño de su búfer, saber cómo está vacío o lleno (generalmente hay un bit de estado de registro para informar de esto) y mantener realizar un seguimiento de la cantidad de cosas que ha transmitido y la cantidad que ha recibido.

Antes de iniciar cualquier operación de SPI Flash, es una buena idea "drenar" el FIFO de recepción. Esto significa que debe verificar el estado del búfer de recepción y vaciarlo (por lo general, se realiza una 'lectura' del Búfer de recepción) si aún no está vacío. Por lo general, vaciar (leer) un Buffer de recepción ya vacío no hace daño.

La siguiente información está disponible en los diagramas de tiempo en las hojas de datos de SPI Flashes, pero a veces la gente pasa por alto los bits. Todos los comandos y datos se envían al flash SPI utilizando el bus SPI. La secuencia para leer un SPI Flash es:

1) Start with CS_ high.
2) Bring CS_ low.
3) Issue "Read" op code to SPI Flash.
4) Issue three address bytes to SPI Flash.
5) "Receive" four garbage words in Receive Buffer.
6) Transmit as many arbitrary bytes (don't cares) as you wish to receive. 
Number of transmitted bytes after address equals size of desired read.
7) Receive read data in the Receive Buffer.
8) When you've read the desired amount of data, set CS_ high to end the Read command.
If you skip this step, any additional transmissions will be interpreted as 
request for more data from (a continuation of) this Read.

Tenga en cuenta que los pasos 6 y 7 se deben intercalar y repetir según el tamaño de la lectura y el tamaño de sus búferes de recepción y transmisión. Si transmite un número mayor de palabras de una vez, de lo que puede contener su búfer de recepción, podrá derramar algunos datos.

Para realizar un programa de página o comando de escritura, realice estos pasos. El tamaño de página (normalmente 256 bytes) y el tamaño de sector (típicamente 64K) y los límites asociados son propiedades del SPI Flash que está utilizando. Esta información debe estar en la hoja de datos de Flash. Omitiré los detalles de equilibrar los búferes de transmisión y recepción.

1) Start with CS_ high.
2) Change CS_ to low.
3) Transmit the Write Enable (WREN) op code.
4) Switch CS_ to high for at least one SPI Bus clock cycle.  This may be tens or
hundreds of host clock cycles.  All write operations do not start until CS_ goes high.  
The preceding two notes apply to all the following 'CS_ to high' steps.
5) Switch CS_ to low.
6) Gadfly loop:   Transmit the 'Read from Status Register' (RDSR) op code and 
one more byte.   Receive two bytes.  First byte is garbage.  Second byte is status.
Check status byte.  If 'Write in Progress' (WIP) bit is set, repeat loop. 
(NOTE:  May also check 'Write Enable Latch' bit is set (WEL) after WIP is clear.)
7) Switch CS_ to high.
8) Switch CS_ to low.
9) Transmit Sector Erase (SE) or Bulk Erase (BE) op code.  If sending SE, then follow
it with three byte address.
10) Switch CS_ to high.
11) Switch CS_ to low.
12) Gadfly loop:  Spin on WIP in Status Register as above in step 6.  WEL will
be unset at end.
13) Switch CS_ to high.
14) Switch CS_ to low.
15) Transmit Write Enable op code (again).
16) Switch CS_ to high.
17) Switch CS_ to low.
18) Gadfly loop:  Wait on WIP bit in Status Register to clear. (WEL will be set.)
19) Transmit Page Program (PP = Write) op code followed by three address bytes.
20) Transmit up to Page Size (typically 256 bytes) of data to write.  (You may allow
Receive data to simply spill over during this operation, unless your host hardware
has a problem with that.)
21) Switch CS_ to high.  
22) SWitch CS_ to low.
23) Gadfly loop:  Spin on WIP in the Status Register.
24) Drain Receive FIFO so that it's ready for the next user.
25)  Optional:  Repeat steps 13 to 24 as needed to write additional pages or
page segments.

Finalmente, si su dirección de escritura no está en un límite de página (generalmente un múltiplo de 256 bytes) y escribe suficientes datos para cruzar el siguiente límite de página, los datos que deben cruzar el límite se escribirán al comienzo del Página en la que cae su dirección de programa. Por lo tanto, si intenta escribir tres bytes en la dirección 0x0FE. Los primeros dos bytes se escribirán en 0x0fe y 0x0ff. El tercer byte se escribirá en la dirección 0x000.

Si transmite una cantidad de bytes de datos más grande que el tamaño de una página, los bytes iniciales se descartarán y solo se utilizarán los 256 bytes finales (o tamaño de página) para programar la página.

Como siempre, no es responsable de las consecuencias de los errores, errores tipográficos, descuidos o desajustes en lo que antecede, ni en la forma en que lo utiliza.

    
respondido por el Jeff Walther
3

Al contrario de algunas de las afirmaciones de este documento, aunque hay algunas PROM SPI extravagantes, también hay algunas instrucciones estándar utilizadas por una gran variedad de PROM SPI, incluida la que ha elegido.

Como vicatcu ya se mencionó, hay buenos cables 'bit-bash' disponibles que pueden programar directamente SPI. En cuanto a la señal, SPI se parece mucho a JTAG, por lo que cualquier tipo de cable de tipo bit bash debería poder utilizarse siempre que la interfaz sea de código abierto. El protocolo interno del flash es bastante simple.

Usamos el hermano mayor de la parte que estás mirando para arrancar nuestras placas FPGA (256M - 2G). El direccionamiento tiene un byte adicional para manejar el volumen de almacenamiento, pero por lo demás, los comandos son básicamente idénticos.

El tipo de PROM que está utilizando debe borrarse por sector y luego programarse por página. La lectura es significativamente más rápida que la escritura (en el caso de las que usamos, la programación puede demorar media hora, pero la lectura de la PROM completa es inferior a 108MHz)

Ahora para los comandos: hay way más comandos disponibles en estos dispositivos de los que realmente se requieren para programarlos. En realidad solo necesitas lo siguiente:

  • RDID (ID de lectura): solo para verificar la PROM y la señalización antes de hacer algo más complejo.
  • WREN (habilitación de escritura): es necesario antes de cada escritura.
  • PP (0x02 - programa de página) - necesario para programar una página.
  • SE (0x20 - borrado de sector): devuelve los bits en el sector a '1'.
  • RDSR (0x05 - leer registro de estado) - necesario para monitorear el ciclo de borrado / escritura.
  • FREAD (0x0B - lectura rápida): lea los datos de la PROM y verifique la escritura.

Si desea obtener más información, consulte las notas de respuesta sobre la programación SPI para Xilinx FPGA en su sitio web (http://www.xilinx.com). Implementan un subconjunto reducido de comandos para que sus FPGA puedan arrancar desde estos dispositivos.

Diseñé mi propio programador para hacer esto basado en lo que tengo disponible y escribí un script de programador en Python, pero puedes hacer lo mismo usando un cable. En su caso, consideraría seriamente hacer todo indirectamente a través del MCU como sugiere Michael Karas. No es necesario programar toda la PROM de la MCU de una sola vez, puede hacerlo por sector.

    
respondido por el Jxj
2

Debería poder reutilizar el USBtiny para programar una memoria flash en lugar de una MCU de destino si se siente cómodo cambiando su programación. Sin embargo, puede que no haya suficiente memoria para que sea lo suficientemente versátil como para programar tanto la MCU como el flash.

En algún lugar tengo un tablero de un proyecto que tiene tanto ATTINY como SPI flash, y lo utiliza como Arduino como un "programador" disponible. Una pequeña modificación del boceto del ISP se usa para programar el MCU con avrdude, luego una utilidad personalizada envía una secuencia que coloca el boceto en un modo especial y escribe bloques de datos en la memoria SPI.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas

Comentarios Recientes

En este capítulo veremos los aspectos buenos y malos de hacer que los programas escriban en la memoria flash en lugar de la memoria almacenada para que los usuarios la ejecuten. La buena razón para escribir es como una memoria flash intermedia de solo lectura. Usar la memoria flash como memoria flash intermedia en el inicio es más sensato que comenzar con una memoria flash que no tiene un lector, pero hablaremos de eso en breve. Aquí hay una lista de las nuevas clases UART (programas inalámbricos) que asumen que... Lees verder