Estoy trabajando en una aplicación de audio donde, en lugar de almacenar datos de audio en una tarjeta SD ( Waveshield en Arduino), la estoy almacenando en un IC de memoria flash SPI y estoy rodando mi propia placa con MCU, DAC y amplificador.
Estoy usando un Winbond W25Q80BVSSIG .
Estoy bastante familiarizado con la programación de AVR utilizando el AVRISP mkII o el USBTiny , ¿escribir datos en flash se realiza con el mismo programador? No he podido encontrar nada cuando busqué específicamente a los programadores de memoria flash SPI.
Esta pregunta es un seguimiento de esta .
spi
programming
flash
JYelton
fuente
fuente
Respuestas:
Si simplemente está buscando una forma de programar el flash Winbond SPI con datos "precargados" que su microcontrolador leería para usarlos cuando esté funcionando, entonces lo que querrá buscar es un programador que pueda hacer programación en circuito del chip SPI Flash. 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 placa correctamente. Incluso venden un clip adaptador que se puede conectar al paquete SOW-16 sin tener que diseñar un encabezado de programación separado en su placa. DediProg tiene boletines de información de aplicaciones disponibles para ayudar con el diseño correcto para el uso en circuito. La estrategia principal para el diseño es encontrar una manera simple 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 MCU y SPI Flash. El programador se conectaría en el lado del flash SPI de las resistencias en serie. Los métodos alternativos podrían incluir agregar un MUX o conmutadores analógicos en las líneas de interfaz activadas. Un esquema aún más inteligente es agregar un "
Una segunda opción a considerar también es el programador USB de ASIX . El 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 Forte puede hacer más cosas porque tiene más pines de interfaz de destino.
A veces puede ser beneficioso poder conectar un programador a una placa de destino sin tener que agregar un encabezado de programación. Una buena solución para esto es colocar un pequeño conjunto de almohadillas en una huella especial definida por una compañía llamada TagConnect . Fabrican y venden una serie de cables de programación de conexión rápida que tienen pines pogo que se dedican a la huella especial en el tablero. Hay versiones de 6 pines, 10 pines y 14 pines del cable disponibles para adaptarse a una variedad de aplicaciones. El costo de los cables es muy razonable.
fuente
Apuesto a que podría hacerlo con un Bus Pirate sin pasar por su MCU ... que le permite realizar interacciones en serie algo arbitrarias directamente a un chip utilizando la comunicación SPI, I2C o UART. Puede tomar un poco de trabajo "escribirlo", pero probablemente le permita hacer el trabajo.
También he visto herramientas especializadas para cargar EEPROM sobre I2C directamente, pero no flash y no SPI específicamente.
fuente
Nunca he oído hablar de ninguna otra herramienta que comunique SPI directamente a dicho chip, y creo que es imposible ya que "todos" los chips requieren diferentes llamadas 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 de la hoja de datos puede ver todos los comandos SPI que puede enviarle. Por lo tanto, dado que 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 de Atmels, ya que la mayoría de ellas ya ha escrito un código abierto disponible para ellas. Al mirar esta publicación de AVRFreaks, se le proporcionará un código para algunos de los chips flash serie AT45xxxx de Atmels.
fuente
Compré un programador " FlashCAT " de Embedded Computers por alrededor de $ 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 son probablemente 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 foto de la configuración:
El programador FlashCAT está a la izquierda, conectado a USB. Está ejecutando el firmware de programación SPI (a diferencia de JTAG) y suministra energía a la memoria flash. La potencia suministrada es seleccionable (3.3V o 5V) con un puente.
Tengo un zócalo SOIC a DIP en la placa para facilitar la programación de múltiples chips. (También puede ver otro IC de memoria flash en el tablero).
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 probarlo, como se muestra arriba. Luego lo leí y lo guardé como un archivo nuevo, lo renombré 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 las computadoras integradas, solo soy un cliente que eligió algo barato y estoy compartiendo información sobre la experiencia con el producto.
fuente
Un poco tarde para la discusión, pero para cualquiera que lo lea después de una búsqueda ...
Algo que no vi mencionado, que es absolutamente crítico cuando se programan chips SPI Flash es el control del pin Chip Select (CS_). El pin Chip Select se usa para puntuar comandos en el SPI Flash. En particular, una transición de CS_ high a CS_ low debe preceder inmediatamente a la emisión de cualquier código operativo de operación de escritura (WREN, BE, SE, PP). Si hay actividad entre la transición CS_ (es decir, después de que CS_ ha bajado) y antes de que se transmita el código operativo de escritura, el código operativo de escritura generalmente se ignorará.
Además, lo que no se explica comúnmente en las hojas de datos SPI Flash, porque es una parte inherente del protocolo SPI, que también es crítico, es que por cada byte que se transmite en el bus SPI, uno recibe un byte a cambio. Además, no se pueden recibir bytes, a menos que se transmita un byte.
Típicamente, el SPI Master que el usuario está ordenando, tiene un Buffer de transmisión, que envía bytes en la línea MOSI del bus SPI y un Buffer de recepción, que recibe bytes desde la línea MISO del bus SPI.
Para que los datos aparezcan en el búfer de recepción, algunos datos deben haberse enviado al búfer de transmisión. Del mismo modo, cada vez que se envían datos desde el búfer de transmisión, los datos aparecerán en el búfer de recepción.
Si uno no tiene cuidado al equilibrar las transmisiones de escritura y las lecturas de recepción, no sabrá qué esperar en el búfer de recepción. Si el búfer de recepción se desborda, los datos generalmente se derraman y se pierden.
Entonces, cuando uno envía un comando de lectura, que es un código operativo de un byte y tres bytes de dirección, primero recibirá cuatro bytes de "basura" en el búfer de recepción maestro SPI. Estos cuatro bytes de basura corresponden al código operativo y tres bytes de dirección. Mientras se transmiten, Flash aún no sabe qué leer, por lo que solo devuelve cuatro palabras basura.
Después de que se devuelvan esas cuatro palabras de basura, para obtener cualquier otra cosa 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, es solo relleno para empujar el DAta de lectura desde el SPI Flash al búfer de recepción.
Si no realizó un seguimiento cuidadoso de esas primeras cuatro palabras basura devueltas, podría pensar que una o más de ellas son parte de sus Datos leídos devueltos.
Entonces, para saber lo que realmente está obteniendo del búfer de recepción, es importante saber el tamaño de su búfer, saber cómo saber si está vacío o lleno (generalmente hay un bit de estado de registro para informar esto) y realizar un seguimiento de cómo muchas cosas que has transmitido y cuánto has recibido.
Antes de comenzar cualquier operación de SPI Flash, es una buena idea "drenar" el FIFO de recepción. Esto significa verificar el estado del búfer de recepción y vaciarlo (por lo general, realizando una 'lectura' del búfer de recepción) si aún no está vacío. Por lo general, vaciar (leer) un búfer de recepción ya vacío no hace daño.
La siguiente información está disponible en los diagramas de tiempos en las hojas de datos de los flashes SPI, pero a veces la gente pasa por alto los bits. Todos los comandos y datos se emiten al flash SPI utilizando el bus SPI. La secuencia para leer un SPI Flash es:
Tenga en cuenta que los pasos 6 y 7 deben ser intercalados y repetidos según el tamaño de la lectura y el tamaño de sus Buffers de recepción y transmisión. Si transmite una cantidad mayor de palabras de una vez, de lo que puede contener su búfer de recepción, derramará algunos datos.
Para preformar un programa de página o un comando de escritura, realice estos pasos. El tamaño de página (típicamente 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 Transmitir y Recibir.
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 deberían cruzar el límite se escribirán al comienzo de la página en la que la dirección de su programa cae. Entonces, si intenta escribir tres bytes para 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 mayor que el tamaño de una página, los bytes anteriores se descartarán y solo se usarán los 256 bytes finales (o tamaño de página) para programar la página.
Como siempre, no somos responsables de las consecuencias de los errores, errores tipográficos, descuidos o alteraciones en lo anterior, ni de cómo lo pones en uso.
fuente
Contrariamente a algunas de las declaraciones aquí, si bien hay algunas SPM PROM extravagantes, también hay algunas instrucciones estándar utilizadas por una gran variedad de SPI PROM, incluida la que ha elegido.
Como vicatcu ya 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 bit-bash debe poder utilizarse siempre que la interfaz sea de código abierto. El protocolo interno del flash es bastante simple.
Utilizamos el hermano mayor de la parte que está buscando 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 los que usamos, la programación puede tomar media hora, pero la lectura de toda la PROM toma menos de un segundo a 108MHz).
Ahora para los comandos: Hay manera más comandos disponibles en estos dispositivos que realmente se necesitan para programarlos. En realidad solo necesitas lo siguiente:
Si desea obtener más información, consulte las notas de respuesta sobre la programación SPI para FPGA Xilinx 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 en función de lo que tengo disponible y escribí un script de programador en Python, pero puedes hacer lo mismo con un cable. En su caso, consideraría seriamente hacer todo indirectamente a través del MCU como sugiere Michael Karas. No necesita programar toda la PROM desde la MCU de una sola vez; puede hacerlo por sector.
fuente
Debería poder reutilizar el USBtiny para programar una memoria flash en lugar de un MCU de destino si se siente cómodo cambiando su programación. Sin embargo, es posible 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 una placa de un proyecto que tiene un flash ATTINY y un SPI, y usa como Arduino como un "programador" fácilmente disponible. Se utiliza una ligera modificación del boceto del ISP para programar la 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 el flash SPI.
fuente