Copia card to card I2C

Salve a tutti,

Ho creato un programmatore di memorie per dei computer che leggono dati da chip 24lc64.
E' risultato un bel progetto semplice e funzionale e collaudato. Già in produzione da me sviluppato per poche unità, mi ritrovo ora a dover gestire quantitativi maggiori: fuori dalla semplice portata di una singola persona che utilizza shield prototipi collegati con dei fili rigidi unifilari.
E' stato contattato un esterno per gestire questa produzione, e dopo aver visto il prodotto, ha suggerito diverse migliorie: una mi piace molto e ha posto un dubbio. Le memorie sopracitate in I2C, sono acquistate da un fornitore già preconfigurate ad indirizzo fisso. L'idea sarebbe di gestire una coppia diretta tra 2 memorie senza usare il pc come tramite (un po' come una dock station con due hd). Pensavo di alimentare le memorie tramite due pin diversi dell'arduino, ed eseguire la copia dalla sorgente alla destinazione passando per l'eeprom alimentando di proposito l'opportuna memoria. Questa operazione viene eseguita in più passaggi (a pagine), per la limitatezza dell'eeprom dell'arduino.
E' fattibile oppure posso avere problemi di conflitti indirizzi anche se una memoria non è alimentata?

Tasto 1: quando premuto legge il contenuto di una eeprom e la salva in file dentro una SD.
Tasto 2: quando premuto legge il contenuto del file nella SD e lo riversa nella eeprom.

Forse potresti emulare una seconda I2C via software e trasferire i dati da una memoria all'altra senza doverle accendere e spegnere ogni volta poiché hanno lo stesso indirizzo.
Dai uno sguardo qui --> New i2c libraries with 'softi2c' - adafruit industries

sul discorso eeprom ricorda che il limite di scrittura e' molto inferiore al limite della flash, indi se vuoi seguire questa strada consiglierei di passare attraverso la flash, con progman, invece della eeprom

Non capisco i problemi che vi fate.

  1. sul I2C si possono metter piú dispositivi.
  2. se hai 2 dispositivi con l' indirizzo uguale perché giá fissato e non selezionabile con i piedini A0 A1 e A2 allora ci sono integrati che generano un subramo sul Bus I2C dove possono esserci dispositivo con lo stesso indirizzo come su quello principale. Per esempio il PCA9543 HTTP 301 This page has been moved
    Un alternativa é usare un FRAM I2C oppure SPI per memorizzare in modo temporaneo i dati. Il vantaggio é che la velocitá di scrittura é alta e il numero di scritture non é limitato. Ha anche un indirizzo I2C diverso dal EEprom da programmare. Visto che non é volatile puoi riuttilizzare i dati per fare piú copie del EEprom sorgente anche dopo spegnimento del Arduino.
  3. visto che la scrittura del EEPROM é molto piú lenta della letura puoi usare il Page Write di 32 Byte alla volta.
    Leggi 32 byte del EEprom sorgente e li scrivi sul I2C del destinatario. Nel fratempo che il EEprom destinatario fa la scrittura leggi i prossimi 32 Byte. Non serve tenere niente in memoria EEprom o FLash di Arduino e velocizzi anche la scrittura perché elimini l'attesa della scrittura interna.

Ciao Uwe

bella la storia del page write .
uwe eccezionale come al solito :slight_smile:

Testato:
sul discorso eeprom ricorda che il limite di scrittura e' molto inferiore al limite della flash, indi se vuoi seguire questa strada consiglierei di passare attraverso la flash, con progman, invece della eeprom

Veramente è alla rovescia. Se parliamo di EEPROM interna, il limite è di 100.000 scritture mentre la Flash ne "regge" 10.000.
Se parliamo di EEPROM esterne il limite è mediamente di 1.000.000 di scritture.

Il problema non é il numero di scritture, ma lo spazio disponible e il tempo. Se memorizzi i dati nella EEPROM interna ci metti il doppio del tempo per la copia che lo fai direttamente.
Un EEPROM da 8kByte programmato con pagine da 32 Byte e un tempo di scrittura di 5ms ci mette ca 1,3 secondi.
Non é tanto ma se non si deve aspettare il doppio é sempre meglio.
Ciao Uwe

leo ha ragione, thanks :slight_smile:

Write/Erase Cycles: 10,000 Flash/100,000 EEPROM

Ringrazio tutti per le risposte.

Mi ha incuriosito:

uwefed:
visto che la scrittura del EEPROM é molto piú lenta della letura puoi usare il Page Write di 32 Byte alla volta.
Leggi 32 byte del EEprom sorgente e li scrivi sul I2C del destinatario. Nel fratempo che il EEprom destinatario fa la scrittura leggi i prossimi 32 Byte. Non serve tenere niente in memoria EEprom o FLash di Arduino e velocizzi anche la scrittura perché elimini l'attesa della scrittura interna.

Non ho ben capito: avendo prefissati gli indirizzi a livello di hardware: quando leggo dal chip sorgente come posso essere sicuro di farlo dal chip interessato se hanno stessi indirizzi?, o forse intendevi, con l'opzione due, a indirizzi separati?
Probabilmente non ho capito.
Pensavo anche ad una soluzione del tipo: mi salvo una pagina per volta in RAM (32 byte in array), in lettura uso il chip1, in scrittura uso il chip2.

se hanno gli stessi indirizzi vanno in conflitto e l'i2c non funziona, e devi inventarti un sistema usando transistor/mosfet per alimentare solo un chip alla volta.

lesto:
se hanno gli stessi indirizzi vanno in conflitto e l'i2c non funziona, e devi inventarti un sistema usando transistor/mosfet per alimentare solo un chip alla volta.

Come immaginavo. Se anziche' di un Mosfet, usassi due pin I/O differenti? Per fortuna, i chip non usano una corrente altissima di lavoro, quindi un'out dell'arduino dovrebbe essere sufficiente, giusto?

il discorso di alimentare prima una memoria e poi l'altra obbliga di avere un buffer che puo' essere appunto la eeprom del 328, mentre l'idea di uwe e' diversa, leggere e scrivere contemporaneamente, sfruttando la differenza di tempi delle due operazioni. Se vuoi seguire questa strada devi usare il gia' citato PCA9543
io credo sia piu' interessante come progetto, anche piu' pulito, senza forzature come possono essere lo spegnere e riaccendere fisicamente le memorie

sì, non dovrebbero esseri controindicazioni, assicurati che il pin arduino riesca a fornire abbastanza mA, ma in effetti dovrebbe farcela

asamlink:
Non ho ben capito: avendo prefissati gli indirizzi a livello di hardware: quando leggo dal chip sorgente come posso essere sicuro di farlo dal chip interessato se hanno stessi indirizzi?, o forse intendevi, con l'opzione due, a indirizzi separati?
Probabilmente non ho capito.

Per quello Ti ho consigliato il PCA9543 HTTP 301 This page has been moved . Il PCA9543 ha 2 canali I2C che puó collegare a piacimento al I2C del Master. Cosí puoi leggere prima 32 Byte dal EEprom sorgente e poi scrivere i 32 Byte al EEprom di destinazione. Guardati lo schemino a pagina 8 del datasheet e i comandi a pagina 4. A pagina 7 é descritto come scrivere il registro di controllo. I bit 0 e 1 determinano se i due canali sono attivi o disattivati.

Non ritengo una buona idea togliere l'alimentazione agli EEProm per selezionare l'uno o l'altro.

Pensavo anche ad una soluzione del tipo: mi salvo una pagina per volta in RAM (32 byte in array), in lettura uso il chip1, in scrittura uso il chip2.

Il Bus I2C non ha previsto questo. non puoi avere 2 dispositivi con lo stesso indirizzo sullo stesso bus. Come spiegato prima con un integrato puoi avere dei rami del Bus I2C che si possono attivare e disattivare a piacimento.

Ciao Uwe