Pages: [1]   Go Down
Author Topic: Copia card to card I2C  (Read 1165 times)
0 Members and 1 Guest are viewing this topic.
Copparo
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 115
Posts: 7257
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 --> http://forums.adafruit.com/viewtopic.php?f=25&t=13722
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Online Online
Faraday Member
**
Karma: 49
Posts: 6017
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21936
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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://www.datasheetcatalog.org/datasheet/philips/PCA9543_1.pdf
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
Logged

0
Online Online
Faraday Member
**
Karma: 49
Posts: 6017
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bella la storia del page write .
uwe eccezionale come al solito  smiley
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21936
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: May 27, 2012, 05:36:37 am by uwefed » Logged

0
Online Online
Faraday Member
**
Karma: 49
Posts: 6017
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

leo ha ragione, thanks  smiley
Quote
Write/Erase Cycles: 10,000 Flash/100,000 EEPROM
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Copparo
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ringrazio tutti per le risposte.

Mi ha incuriosito:
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.
Logged

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Copparo
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

0
Online Online
Faraday Member
**
Karma: 49
Posts: 6017
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21936
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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://www.datasheetcatalog.org/datasheet/philips/PCA9543_1.pdf . 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.

Quote
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
Logged

Pages: [1]   Go Up
Jump to: