Vai al contenuto
PLC Forum


memoria SPI - indirizzamento


DG.M

Messaggi consigliati

Salve a tutti,

devo usare una memoria flash seriale SPI, ma non ho capito molto bene come fare l'indirizzamento.. La memoria è la M25P16 della ST http://www.st.com/stonline/products/litera...0027/m25p16.pdf

ed è organizzata in 32 settori da 256 pagine, ciascuna da 256 byte.

Da quanto ho capito l'unico modo in cui posso scrivere i dati è fornendo l'indirizzo di inizio pagina e tutti i byte che invio da lì in avanti vengono scritti fino al fondo della pagina, dopodichè ricomincia dall'inizio sovrascrivendo i primi.

L'indirizzo è a 24 bit e la memoria a 16Mbit, devo indirizzare il byte od il bit?

L'organizzazione in pagine serve per la scrittura e in settori per la cancellazione?

E' possibile indicare l'indirizzo di partenza e scrivere senza essere limitati ad una pagina?

Disponendo di microcontrollore ad 8 bit quanta memoria posso indirizzare al massimo? Il microcontrollore a disposizione ha un contatore interno a 21 bit, ma ho visto che anche la memoria a 16MB (128Mbit) ha un indirizzamento a 24 bit.. Viene quindi indirizzato il byte?

E' possibile inviare 3 byte concatenati dal microcontrollore, senza pause che falserebbero il valore?

Sono domande un po' specifiche, ma se qualcuno avesse usato questo tipo di memorie e fosse in grado di rispondermi gli sarei grato..

Domenico

Link al commento
Condividi su altri siti


Ciao mimmux

come puoi vedere nei diagrammi delle temporizzazioni tutto è controllato dal tuo clock

quindi devi essere certo che ad ogni fronte sia presente sulla linea dati il bit 0/1 corretto Se il clock è irregolare e lo tieni alto o basso più a lungo non cambia nulla. L'importante è che la sequenza sia corretta.

Come dici giustamente tu puoi scrivere 256 bytes alla volta. Quindi nella procedura di scrittura devi inserire il controllo se address && 0x0000FF = 0 sospendi scrittura per il tempo necessario alla programmazione. Ricordati di disabilitare il chip select altrimenti non parte l'algoritmo interno di programmazioen. Ricordati anche di ablitare la scrittura con il comando WREN

Per la lettura invece leggi in modo lineare inviato il primo indirizzo autoincrementa la flash internamente ad ogni richiesta.

Per la cancellazione puoi farla solo a settori da 64KB alla volta oppure l'intera flash con il bulk erase.

Nel tuo driver tinei una variabile a 24bit o se ti va meglio gestisci l'indrizzo spezzato in pagina e offset = 32pagine da 64KByte poi quando lo invii mandi prima la pagina poi l'offset

Ultima cosa per non impazzire e verificare che HW e la comunicazione SPI sia ok realizza pewr primo il comando RDID che ti restitusice il codice d'identificazione.

Link al commento
Condividi su altri siti

Ciao HH,

grazie per la risposta.

Uso questa memoria per registrare i dati acquisiti da un sistema a microcontrollore che dispone di registri ad 8 e 16 bit più un contatore a 21bit, utile per indirizzare una memoria esterna fino a 2MB.

Avevo scelto questa memoria flash proprio per i 2MB, ma ora vedo che l'indirizzamento è comunque a 24 bit, ed un registro così non ce l'ho; devo vedere, come mi suggerisci, se è possibile interrompere l'SPI clock, in modo da far risultare una catena di 24 bit usando 3 byte in sequenza. Non ho capito però perchè nel frattempo dovrei disabilitare il chip select, non basta congelare l'SPI CK? Penso che ad una nuova riattivazione del chip select la memoria richieda nuovamente tutta la procedura.. ..se così fosse, dato che devo registrare dati a 16 bit, potrei azzardare il montaggio di 2 memorie ed alternare il chip select per memorizzare la parte alta e la parte bassa del dato ed averlo quindi allo stesso indirizzo, ma forse mi complico solo la vita..

Per quanto riguarda l'indirizzamento sul data sheet ho visto che viene indicato solo di inserire l'indirizzo di3 byte, mentre mi farebbe comodo poter indirizzare separatamente pagina e settore, non avendo un contatore a 24 bit potrei così con 3 byte indirizzare fino a 16MByte.. La memoria da 128Mbit (16MB) è indicata come "multilevel", sai mica che significa?

Ancora una cosa:

volevo usare la M25PE16, mentre riesco ad avere solo la M25P16. La differenza dovrebbe essere soltanto la possibilità di poter scrivere nella P una pagina alla volta senza poter modificare il singolo byte.. E' questa l'unica differenza tra flash memories for code/data storage?

Sarà un casino controllare la comunicazione in base ai dati scritti: non ho display, non ho niente, solo microcontrollore memoria e sensori vari..

Grazie infinite!

Domeinco

Link al commento
Condividi su altri siti

Ciao domenico

mi sono spiegato male il chip enable lo devi disabilitare alla fine quando hai inviato tutti i bytes. Non nel mezzo tra un byte e l'altro.

Non vedo il problema per gestire l'indrizzo a 24bit. LA tua SPI probabilmente invia 1byte alla volta perciò utlizzi tre locazioni di ram per l'indrizzo e le invii una dopo l'altra.

Non so se lavori in asm o C. In C definisci un long in asm ti basta crearti una macro per l'incremento dell'indrizzo che propaga 'eventuale overflow come riporto nei bytes successivi.

Se non ricordo male la differenza tra P e PE è la cancellazione che in un caso può avvenire solo a pagina e nell'altro anche a settori. Non solo ma nella flash dati non serve cancellare esplicitamente il settore prima di riscriverlo. La nuova scrittura cancella automaticamente i dati.

Comunque se vuoi ho un driver pronto scritto in C non garantisco bug-free se serve ti passo il file

ciao

Link al commento
Condividi su altri siti

fantastico!!! Grazie!!! e sì che mi torna utile, quantomeno per avere una idea di come farlo..

Penso lo farò in C, solo che non l'ho ancora installato e provato perchè dal sito microchip ho scaricato la versione per studenti che è in prova per 2 mesi, e non ho ancora i componenti.

Da quel che ho capito nella PE si può modificare anche solo un singolo byte alla volta, mentre nella P solo una pagina alla volta. A me non importa perchè tanto devo prima memorizzare tutti i dati e poi scaricarli su pc via USB.. Tra l'altro sai come si fanno a leggere i dati sulla porta usb? Qual è il passaggio tra un programma in C ed i driver della porta USB? Ho provato a cercare sul sito microzozz qualcosa sulle API, ma a parte la funzione generale a queste domande non ho trovato risposta.. Se è troppo lungo da spiegare hai dei link o delle parole chiave con cui cercare il materiale per documentarmi?

Ari-grazie

Domenico

Link al commento
Condividi su altri siti

USB

libusb_win32 per il driver lato PC

Per il driver USB lato micro devi avere qualcosa di pronto altrimenti perdi solo tempo.

Non è semplice realizzare il driver USB dovresti conoscere le modalità di trasferimento dati cosa sono gli endpoint come compilare i descrittori.

Se fai qualcosa per hobby io opterei per la comunicazioen seriale.

Se vuoi studiare scegli USB eventualmente chiedi Per quello che posso ti aiuto io ho sviluppato comunicazione USB con dispositivi classe HID.

Spero di non incapapre nelle ire del moderatore ma se vuoi sviluppare la scheda con USB io darei un occhiata al sito www.silabs.com. hanno tutto il necessario e ti forniscono driver firmware lato dispositivo e una libreria per il driver di comunicazione lato PC che riduce il tutto a due chiamate Read per leggere dal dispositivo e Write per inviare i dati.

Per il driver flash come faccio ti mando un PM ci provo eventualmente mi fai sapere

ciao

Link al commento
Condividi su altri siti

Grazie!

Non è da fare per hobby e siccome dovrà essere portato in giro e la seriale sta scomparendo dai portatili è meglio sia usb.

Da quel che ho letto gli endpoint sono i numeri identificativi dei vari dispositivi usb, dato che quando se ne connette più di uno lo si fa in parallelo, ma potrei aver detto una cavolata..

Purtroppo ho già scelto un micro della microchip, sarebbe preferibile usassi questo, quindi cerco i driver firmware lato micro e se non li trovo sudo freddo unsure.gif

Domanda: qual è l'ordine di grandezza di firmware usb e comunicazione spi? ho disponibili 32k di memoria per il programma e devo farci stare anche il mio.. Data la presenza di queste caratteristiche del micro penso siano sufficienti, anche se non è detto..

Grazie ancora per la disponibilità

Domenico

Link al commento
Condividi su altri siti

Scusa mimmux ma il micro ha la perfiferica USB vero.

Silabs per i suoi 8051 ha una librieria da 3KB per gestire dispositivo classe HID

quindi non è molto . Ti assicuro però che il protocollo è piuttosto complesso e difficile da realizzare. Io ti consilgio le appnote della silabs hanno degli esempi in C che puoi adattare al tuo micro.

Che sciocco ! non ci ho pensato prima utilizza un bridge CP21xx sempre silabs.

(guarda sul sito la doc)

Tu gli passi i dati in seriale e lui si occupa dell'interfaccia USB

In questo caso sul PC puoi utilizzare la loro libreria USBExpress che scarichi liberamente e puoi scrivere il programma PC in un attimo.

(In questo mondo di PIChettari parlo (solo) di silabs perchè li utilizzo molto ma non ho interssi in comune con silabs)

Link al commento
Condividi su altri siti

Sì sì ha la porta usb con transceiver interno oppure collegabile esternamente ed ha anche 8bit per l'accesso parallelo alla USB RAM, che potrebbe tornarmi utile per controllarlo in debug.. Preferirei comunque non usare troppi componenti, già il prof mi ha sconsigliato per motivi di spazio un filtro prima dell'A/D, che io consideravo fondamentale per l'aliasing (i sensori comunque hanno già di loro una uscita con banda limitata).. Darò comunque un'occhiata giusto per sapere che esiste in commercio e ricorrerò a questo in caso di panico, anche se sarebbe una scelta didatticamente opinabile..

Cercando da zero il materiale ho trovato per primi i PIC, sono talmente famosi quasi da cercarmi loro, e poi il tutorial Tanzilli per imparare a programmare un microcontroller programma proprio un microcontrollore della microchip.

Quel che più mi ha convinto a scegliere questo è il contatore a 21 bit per la memoria che altri non avevano (ovviam non è stato l'unico parametro, ed adesso ho pure scoperto che non è necessario per la memoria esterna), non fosse stato per questo avrei preso un atmel con bootloader e quindi senza spese aggiuntive per il programmatore (che per fortuna riusciremo ad avere in prestito).

Grazie ancora

Ciao

Domeinco

Modificato: da mimmux
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...