Come si scrive nella memoria flash SPI?


9

Sto lavorando su un'applicazione audio dove invece di archiviare dati audio su una scheda SD ( Waveshield su Arduino), sto memorizzandoli su un IC con memoria flash SPI e facendo rotolare la mia scheda con MCU, DAC e amplificatore.

Sto usando un Winbond W25Q80BVSSIG .

Conosco abbastanza bene la programmazione di AVR usando AVRISP mkII o USBTiny , la scrittura di dati su Flash è fatta con lo stesso programmatore? Non sono stato in grado di trovare nulla quando cercavo specificamente i programmatori di memoria flash SPI.

Questa domanda è un seguito a questo .


Non so se esiste un programmatore che specificamente può farlo facilmente per te, da un PC o qualcosa del genere, ma se nel tuo circuito è coinvolto un CPLD, potresti configurarlo per scrivere dati nella memoria flash.
deed02392,

Penso che i moduli flash spi siano progettati ormai da un giorno per archiviare firmware / BIOS utilizzati dalla cpu nella maggior parte dei PC. Non per dispositivo di archiviazione robusto.
Maresciallo artigianale

Risposte:


12

Se stai semplicemente cercando un modo per programmare il flash SPI di Winbond con dati "precaricati" che il tuo microcontrollore leggerebbe per l'uso quando è in esecuzione, quello che vorrai esaminare è un programmatore che può fare la programmazione in-circuit del chip SPI Flash. Questo è noto anche come programmazione in-system (ISP).

Una scelta è il programmatore di DediProg. Questo dispositivo USB collegato può programmare in circuito se la scheda è stata progettata correttamente. Vendono anche una clip adattatore che può essere collegata al pacchetto SOW-16 senza dover progettare un'intestazione di programmazione separata sulla scheda. DediProg ha bollettini informativi sull'applicazione disponibili per aiutare con la progettazione corretta per l'uso in circuito. La strategia principale per la progettazione è quella di trovare un modo semplice per isolare i driver dell'interfaccia SPI nel sistema MCU in modo che non interferiscano con i driver nel pod di programmazione SPI. Il modo più semplice per farlo è quello di inserire resistori in serie nelle linee guidate MCU tra MCU e SPI Flash. Il programmatore si collegherebbe sul lato flash SPI delle resistenze serie. Metodi alternativi potrebbero includere l'aggiunta di un interruttore MUX o analogico nelle linee di interfaccia pilotate. Uno schema ancora più intelligente è quello di aggiungere un "

inserisci qui la descrizione dell'immagine

Una seconda scelta da considerare è anche il programmatore USB di ASIX . Presto è in grado di eseguire vari tipi di dispositivi SPI e I 2 C, inclusi i dispositivi SPI Flash. Ho uno di questi dispositivi appositamente per la programmazione di MCU Atmel e vari tipi di dispositivi SPI Flash. È una soluzione più economica rispetto all'unità precedente ma non altrettanto flessibile. Il loro dispositivo più costoso chiamato Forte è in grado di fare più cose perché ha più pin di interfaccia target.

inserisci qui la descrizione dell'immagine

A volte può essere utile poter collegare un programmatore a una scheda target senza dover aggiungere un'intestazione di programmazione. Una buona soluzione per questo è quella di posizionare un piccolo set di pad in un footprint speciale definito da una società chiamata TagConnect . Producono e vendono una serie di cavi di programmazione a connessione rapida che hanno pin pogo che coinvolgono il footprint speciale sulla scheda. Sono disponibili versioni a 6, 10 e 14 pin del cavo per soddisfare una vasta gamma di applicazioni. Il costo dei cavi è molto ragionevole.

inserisci qui la descrizione dell'immagine


Questo è molto utile Sto programmando di programmare la memoria flash prima di saldarla sul PCB finale. Finora l'ho fatto per MCU e ha funzionato bene. Sono indeciso se fornire pin ISP sul PCB sia una buona idea o meno, dal momento che non dovrebbero essere riprogrammati una volta completato.
JYelton,

1
@JYelton - Nella mia esperienza è una buona idea pianificare l'ISP per diversi motivi. Gli ECO (ordini di cambiamento di ingegneria) sono un fatto vitale nel ciclo del prodotto. Qualcuno o qualcosa richiederà un cambiamento nel contenuto Flash una volta entrato in produzione. I chip flash sono talvolta suscettibili a disturbi del rumore inattesi nel circuito e finiscono per comprometterne il contenuto. Un altro motivo per prevedere l'ISP.
Michael Karas,

1
Esiste un'intestazione "standard" compatibile con la maggior parte di questi programmatori almeno tramite cavi adattatori in bundle? Ho visto 2x4 e 2x5 pin header con un mazzo di diversi pinouts anche vedere flashrom.org/Supported_hardware
Kert

Ognuno ha la propria idea di ragionevole. I cavi Tag-connect sono $ 35 ~ $ 40.
segna il

1
@markrages - Ma per un determinato laboratorio di sviluppo o stazione di programmazione di fabbrica è necessario acquistare un solo cavo. Non è necessario uno per ogni prodotto. Inoltre, questi cavi sono molto più economici rispetto al tentativo di arrotolare il proprio pin pogo per consentire ISP senza un connettore.
Michael Karas,

8

Scommetto che potresti farlo con un Bus Pirate senza passare attraverso la tua MCU ... che ti consente di eseguire interazioni seriali in qualche modo arbitrarie direttamente su un chip usando la comunicazione SPI, I2C o UART. Potrebbe volerci un po 'di lavoro per "copiarlo", ma probabilmente ti farebbe il lavoro.

Ho anche visto strumenti specializzati per caricare direttamente EEPROM su I2C, ma non flash e SPI in particolare.


Sto cominciando a chiedermi se la mia selezione di SPI flash sia buona, dato quanto (apparentemente) oscuro i metodi sono scrivere sulle cose esplose.
JYelton,

1
Ciò richiederebbe alcuni script seri, ma comunque una buona idea. Un po 'complicato per i miei gusti. Forse dovresti prendere in considerazione una scheda SD? Quindi devi solo preoccuparti della lettura, scrivendoci con un computer
chwi

L'attuale prototipo utilizza un Arduino e Waveshield (che ha un lettore di schede SD). Voglio allontanarmi dalla scheda SD perché credo che il costo sarà inferiore (nessun lettore e scheda) e anche più a prova di manomissione.
JYelton,

7

Non ho mai sentito parlare di altri strumenti che parlano SPI direttamente con un tale chip e penso che sia impossibile poiché "tutti" i chip richiedono chiamate diverse per operazioni diverse.

Il chip necessita di chiamate SPI per scrivere, leggere, cambiare settore, dimensione dei dati, ecc. Nel capitolo 7.2 Istruzioni nel foglio dati è possibile vedere tutti i comandi SPI che è possibile inviargli. Quindi, poiché tutte le memorie flash esterne non hanno lo stesso set di istruzioni, è necessario scrivere un'applicazione personalizzata per questo.

EDIT: essendo un follow-up, consiglierei davvero una delle memorie flash SPI di Atmels, dal momento che la maggior parte di loro ha già scritto un codice aperto disponibile per loro. Guardando questo post da AVRFreaks ti forniremo il codice per alcuni chip flash seriali Atmels AT45xxxx.


Se ti capisco correttamente, dovrei scrivere un programma per il mio MCU che quindi scriva i dati nella memoria flash? Il problema è che l'MCU ha meno memoria del flash esterno, quindi sono un po 'in perdita.
JYelton,

Sì. È possibile inviare dati dalla linea seriale del computer con UART che si scrive sul flash. Inoltre, è possibile scrivere diversi programmi per l'MCU, programmando il flash alcuni blocchi alla volta. Potrebbe richiedere un po 'di tempo, ma funziona poiché il flash esterno non verrà cancellato fintanto che tieni traccia dei cambiamenti di settore correttamente
chwi

2
Questa è la risposta corretta Quindi avrai bisogno di un programma sul tuo PC per scaricare blocchi nell'MCU che li scriverà in flash. Aiuta se si verifica un errore e non è necessario scrivere un nuovo programma sul PC; quindi ti suggerisco di trovare del codice per XMODEM o simili.
pjc50,

@ pjc50 ... non così in fretta nel dichiarare la "risposta corretta" :)
vicatcu,

In realtà molti programmatori possono programmare memorie flash; e uno dei più comuni schemi di programmazione utilizzati con i micro atmel è abbastanza vicino a SPI per cominciare.
Chris Stratton,

4

Ho acquistato un programmatore " FlashCAT " da Embedded Computers per circa $ 30 USA. È stato sorprendentemente facile collegarsi al PC tramite USB e scrivere file nella memoria flash di Winbond. I metodi e i programmatori in altre risposte sono probabilmente altrettanto buoni, alcuni più costosi o fai-da-te, ma questo è un modo economico e semplice che si adatta a quello che stavo cercando.

Ecco un'immagine dell'installazione:

Programmazione con FlashCAT

Il programmatore FlashCAT è a sinistra, collegato a USB. Sta eseguendo il firmware di programmazione SPI (al contrario di JTAG) e fornisce energia alla memoria flash. L'alimentazione fornita è selezionabile (3,3 V o 5 V) con un ponticello.

Ho una presa SOIC su DIP sulla breadboard per semplificare la programmazione di più chip. (Puoi vedere anche un altro IC di memoria flash seduto sulla breadboard.)

Software FlashCAT

Non ho ancora convertito il mio file audio nel formato binario appropriato, ma ho scritto un file WAV da 211 KB in memoria solo per testarlo, nella foto sopra. L'ho quindi riletto e salvato come nuovo file, rinominato in .wav e riprodotto correttamente sul PC.

Il prossimo passo sarà codificare correttamente il file e scrivere il software AVR per leggere i dati e inviarlo tramite un DAC.

Disclaimer: non sono affiliato con Embedded Computers, sono solo un cliente che ha scelto qualcosa di economico e sto condividendo informazioni sull'esperienza con il prodotto.


4

Un po 'tardi alla discussione, ma per chiunque lo legga dopo una ricerca ....

Una cosa che non ho visto menzionato, che è assolutamente fondamentale durante la programmazione dei chip SPI Flash è il controllo del pin Chip Select (CS_). Il pin Chip Select viene utilizzato per punteggiare i comandi su SPI Flash. In particolare, una transizione da CS_ high a CS_ low deve precedere immediatamente l'emissione di qualsiasi codice op di operazione di scrittura (WREN, BE, SE, PP). Se c'è attività tra la transizione CS_ (cioè dopo che CS_ è diventato basso) e prima che il codice operativo di scrittura venga trasmesso, il codice operativo di scrittura verrà generalmente ignorato.

Inoltre, ciò che non è comunemente spiegato nei fogli dati SPI Flash, poiché è una parte intrinseca del protocollo SPI, che è anche fondamentale, è che per ogni byte che si trasmette sul bus SPI, si riceve un byte in cambio. Inoltre, non è possibile ricevere byte, a meno che non si trasmetta un byte.

In genere, il Master SPI che l'utente sta comandando ha un Buffer di trasmissione, che invia i byte sulla linea MOSI del bus SPI e un Buffer di ricezione, che riceve byte dalla linea MISO del bus SPI.

Affinché i dati vengano visualizzati nel buffer di ricezione, alcuni dati devono essere stati inviati al buffer di trasmissione. Allo stesso modo, ogni volta che si inviano dati dal buffer di trasmissione, i dati verranno visualizzati nel buffer di ricezione.

Se non si è attenti al bilanciamento delle scritture di trasmissione e delle letture di ricezione, non si saprà cosa aspettarsi nel buffer di ricezione. Se l'overflow del buffer di ricezione, i dati vengono generalmente versati e persi.

Pertanto, quando si invia un comando di lettura, che è un codice operativo a un byte e tre byte di indirizzo, si riceveranno innanzitutto quattro byte di "immondizia" nel buffer di ricezione principale SPI. Questi quattro byte di immondizia corrispondono al codice operativo e a tre byte di indirizzo. Mentre vengono trasmessi, Flash non sa ancora cosa leggere, quindi restituisce solo quattro parole di immondizia.

Dopo che queste quattro parole di immondizia vengono restituite, al fine di ottenere qualsiasi altra cosa nel buffer di ricezione, è necessario trasmettere una quantità di dati pari alla quantità che si desidera leggere. Dopo il codice operativo e l'indirizzo, non importa ciò che si trasmette, è solo un riempimento per inviare il DAta di lettura dal flash SPI al buffer di ricezione.

Se non hai tenuto traccia delle prime quattro parole spazzatura restituite, potresti pensare che una o più di esse facciano parte dei dati di lettura restituiti.

Quindi, per sapere cosa stai effettivamente ricevendo dal buffer di ricezione, è importante conoscere la dimensione del buffer, sapere come è vuoto o pieno (di solito c'è un bit di stato del registro per segnalarlo) e tenere traccia di come molte cose che hai trasmesso e quanto hai ricevuto.

Prima di avviare qualsiasi operazione SPI Flash, è consigliabile "svuotare" il FIFO di ricezione. Ciò significa controllare lo stato del buffer di ricezione e svuotarlo (di solito eseguito eseguendo una 'lettura' del buffer di ricezione) se non è già vuoto. Di solito, svuotare (leggere) un buffer di ricezione già vuoto non fa male.

Le seguenti informazioni sono disponibili dai diagrammi di temporizzazione nei fogli di dati di SPI Flash, ma a volte le persone trascurano i bit. Tutti i comandi e i dati vengono inviati al flash SPI utilizzando il bus SPI. La sequenza per leggere un Flash SPI è:

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.

Si noti che i passaggi 6 e 7 devono essere intercalati e ripetuti a seconda della dimensione della lettura e della dimensione dei buffer di ricezione e trasmissione. Se si trasmette un numero maggiore di parole in una volta sola, rispetto a quanto può contenere il buffer di ricezione, si riverseranno alcuni dati.

Per preformare un programma Page Program o Write, eseguire questi passaggi. Dimensione pagina (in genere 256 byte) e Dimensione settore (in genere 64 KB) e i limiti associati sono proprietà dell'SPI Flash in uso. Queste informazioni dovrebbero essere nel foglio dati per Flash. Ometterò i dettagli del bilanciamento dei buffer di trasmissione e ricezione.

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.

Infine, se il tuo indirizzo di scrittura non si trova su un limite di pagina (in genere un multiplo di 256 byte) e scrivi dati sufficienti per attraversare il limite di pagina seguente, i dati che devono attraversare il limite verranno scritti all'inizio della pagina in cui l'indirizzo del tuo programma cade. Quindi, se si tenta di scrivere tre byte per l'indirizzo 0x0FE. I primi due byte verranno scritti su 0x0fe e 0x0ff. Il terzo byte verrà scritto all'indirizzo 0x000.

Se si trasmette un numero di byte di dati maggiore di una dimensione di pagina, i byte iniziali verranno eliminati e solo i byte finali 256 (o dimensioni di pagina) verranno utilizzati per programmare la pagina.

Come sempre, non è responsabile per le conseguenze di eventuali errori, errori di battitura, sviste o disordini di cui sopra, né nel modo in cui lo utilizzi.


"Prima di iniziare qualsiasi operazione SPI Flash, è una buona idea" svuotare "il file FIFO di ricezione. Ciò significa controllare lo stato del buffer di ricezione e svuotarlo (di solito eseguito eseguendo una" lettura "del buffer di ricezione) se non lo è già vuoto. Di solito, svuotare (leggere) un buffer di ricezione già vuoto non fa male. " quali passi devo prendere per leggere lo stato del buffer di ricezione e svuotare il buffer di ricezione?

3

Contrariamente ad alcune delle affermazioni qui, mentre ci sono alcune PROM SPI stravaganti là fuori, ci sono anche alcune istruzioni standard utilizzate da una grande varietà di PROM SPI, inclusa quella che hai scelto.

Come già accennato da Vicatcu, sono disponibili buoni cavi "bit-bash" che possono programmare direttamente SPI. Per quanto riguarda il segnale, SPI assomiglia molto a JTAG, quindi qualsiasi tipo di cavo bit-bash dovrebbe essere in grado di essere utilizzato a condizione che l'interfaccia sia open source. Il protocollo interno del flash è abbastanza semplice.

Usiamo il fratello maggiore della parte che stai guardando per avviare le nostre schede FPGA (256M - 2G). L'indirizzamento ha un byte extra per gestire il volume di archiviazione, ma per il resto i comandi sono sostanzialmente identici.

Il tipo di PROM che stai utilizzando deve essere cancellato per settore, quindi programmato per pagina. La lettura è significativamente più veloce della scrittura (nel caso di quelli che utilizziamo, la programmazione può richiedere mezz'ora, ma la lettura dell'intera PROM richiede meno di un secondo a 108 MHz).

Ora, per i comandi: Ci sono modo più comandi disponibili in questi dispositivi rispetto a quelle effettivamente necessario programmarli. In realtà hai solo bisogno di quanto segue:

  • RDID (leggi ID) - solo per verificare la PROM e la segnalazione prima di fare qualcosa di più complesso.
  • WREN (abilitazione scrittura) - necessario prima di ogni scrittura.
  • PP (0x02 - programma pagina) - necessario per programmare una pagina.
  • SE (0x20 - cancellazione settore) - riporta i bit nel settore su '1'.
  • RDSR (0x05 - lettura del registro di stato) - necessario per monitorare il ciclo di cancellazione / scrittura.
  • FREAD (0x0B - lettura veloce) - legge i dati della PROM e verifica la scrittura.

Per ulteriori informazioni, consultare le note di risposta sulla programmazione SPI per FPGA Xilinx sul proprio sito Web (http://www.xilinx.com). Implementano un sottoinsieme ridotto di comandi in modo che i loro FPGA possano avviarsi da questi dispositivi.

Ho progettato il mio programmatore per farlo in base a ciò che ho a disposizione e ho scritto uno script per programmatore in Python, ma puoi fare lo stesso usando un cavo. Nel tuo caso, prenderei seriamente in considerazione di fare tutto indirettamente attraverso l'MCU, come suggerisce Michael Karas. Non è necessario programmare l'intera PROM dall'MCU in una volta sola: è possibile farlo per settore.


2

Dovresti essere in grado di riutilizzare USBtiny per programmare una memoria flash invece di un MCU target se ti senti a tuo agio nel cambiarne la programmazione. Tuttavia, potrebbe non esserci memoria sufficiente per renderlo abbastanza versatile da programmare sia l'MCU che il flash.

Da qualche parte ho una scheda da un progetto che ha sia un flash ATTINY che un SPI e usa come Arduino come "programmatore" prontamente disponibile. Una leggera modifica dello schizzo ISP viene utilizzata per programmare l'MCU con avrdude, quindi un'utilità personalizzata invia una sequenza che mette lo schizzo in una modalità speciale e scrive blocchi di dati nel flash SPI.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.