Pages: 1 [2]   Go Down
Author Topic: Come collego più dispositivi I2C?  (Read 2810 times)
0 Members and 1 Guest are viewing this topic.
Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9505
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se colleghi dispositivi I2C che funzionano solo a 3,3 V e le cui entrate non reggono 5V devi mettere un adattatore di livello come detto sopra.

Se colleghi solo device I2C a 3.3V, cioè sul bus non ci sono device a 5V, non serve nessun adattatore di livello, basta collegare le due pull up a 3.3V invece che a 5V, ti rammento che i due pin per l'I2C sono degli open drain come tipologia OUT.
Logged

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

Se colleghi solo device I2C a 3.3V, cioè sul bus non ci sono device a 5V, non serve nessun adattatore di livello, basta collegare le due pull up a 3.3V invece che a 5V, ti rammento che i due pin per l'I2C sono degli open drain come tipologia OUT.
Ciao astrobeed
Ok, sono d'accordo in questo, ma allora nei ATmega devi disattivare le due resistenze pullup interne che vengono messe in automatico (dalla libreria??).
Questo é possibile? o é automatico quando attivi la I2C? o devi solo modificare la libreria?
Ciao Uwe
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9505
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le pull up sugli input non sono attive di default, vanno attivate esplicitamente in questo modo:

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

In tutti i casi quando attivi il modo I2C i relativi pin vengono utilizzati in una modalità diversa da tutte le altre viste che devono funzionare in multidrop (più out in parallelo tra loro) e al tempo stesso sono bidirezionali (possono sia ricevere che trasmettere).
Inoltre le pull up integrate dell'ATmega, circa 20k, sono troppo alte come valore per consentire un corretto funzionamento del bus I2C che richiede come minimo una corrente di 1.5 mA, meglio se 3 mA, quando le linee vengono chiuse verso lo 0 logico, lo stato di idle prevede tutte e due le linee a 1 logico.
Logged

0
Offline Offline
Sr. Member
****
Karma: 1
Posts: 443
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A parte le due linee di segnale SDA/SCL, che vabbè, resistenza PullUP ecc. ecc.
Ma quello che chiedevo qualche post fa è se l'alimentazione a questi aggeggi i2c devo darla dal pin di arduino +5V o +3.3.
Deduco 3.3 visto che parlano di voltaggi da 1.8 a 3.6.
Gracias!
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9505
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ovviamente li devi alimentare a 3.3V, dove prenderli dipende da che modello di Arduino usi e da quanta corrente ti serve.
Se usi la 2009 i 3.3 V sono messi a disposizione dal FTDI e disponi di una manciata di mA, meglio non superare i 20-30 mA, se il device, o la somma della corrente richiesta da tutti i device I2C, è inferiore al limite massimo puoi alimentarli da Arduino, in caso contrario deve usare un regolatore di tensione esterno.
Se usi Arduino UNO non hai problemi perché i 3.3V sono resi disponibili da un regolatore dedicato e disponi di qualche centinaio di mA.

Logged

0
Offline Offline
Sr. Member
****
Karma: 1
Posts: 443
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie.
Ora vedo se riesco a far fumare qualche componente smiley-grin
Logged


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

Le pull up sugli input non sono attive di default, vanno attivate esplicitamente in questo modo:
Inoltre le pull up integrate dell'ATmega, circa 20k, sono troppo alte come valore per consentire un corretto funzionamento del bus I2C che richiede come minimo una corrente di 1.5 mA, meglio se 3 mA, quando le linee vengono chiuse verso lo 0 logico, lo stato di idle prevede tutte e due le linee a 1 logico.
La libreria Wire attiva di default le resistenze interne pullup. Se hai collegato pochi dispositivi I2C e dei collegamenti/piste corte non serve aggiungere resistenze pullup esterne.
Wire library
Wire library will enable ATMEL internal Pullups. So using additional pullup's with a short bus may not be required, for example interface only a single nearby EEPROM.


A parte le due linee di segnale SDA/SCL, che vabbè, resistenza PullUP ecc. ecc.
Ma quello che chiedevo qualche post fa è se l'alimentazione a questi aggeggi i2c devo darla dal pin di arduino +5V o +3.3. Deduco 3.3 visto che parlano di voltaggi da 1.8 a 3.6.
Gracias!
Sbagliato!!
Dipende dai dispositivi che colleghi. Ci sono integrati per 5V.  Quelli da 3,3V e quelli per tensioni ancora piú basse e esistono anche quelli per 3,3V ma che reggono 5V sui pin SDA e SCK. Leggiti il datasheet dei integrati che vuoi usare. Non sappamo dirlo visto che non sappiamo cosa vuoi fare.
Ciao Uwe
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9505
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La libreria Wire attiva di default le resistenze interne pullup. Se hai collegato pochi dispositivi I2C e dei collegamenti/piste corte non serve aggiungere resistenze pullup esterne.

E questa è una bella cretinata dal punto di vista elettronico, il motivo è semplice le specifiche della I2C dicono chiaramente che la corrente minima che deve circolare sul bus è di 1.5 mA, caldamente consigliati 3 mA, anche con connessioni di pochi centimetri.
Con i 20k tipici delle pull up dell'ATmega possono scorrere al massimo 5/20k = 0.25 mA, troppo pochi per garantire il corretto funzionamento della I2C.
Comunque collegando due pull up esterne al 3.3V l'effetto delle pull up interne è solo quello di alzare la tensione di 0.1-0.2 Volt a vuoto, cioè invece di avere 3.3V avremo 3.4-3.5 V, valori perfettamente accettabili.
Dato che oltre ai data sheet esistono anche le misure strumentali ecco quello che si vede col DSO scrivendo sul bus I2C a vuoto, cioè senza collegare nessun device, e dialogando con un device a 3.3V, un accelerometro dotato di sue resistenze di pull up a 3.3V da 3.3k.

Segnale I2C a vuoto

Dettaglio fronti d'onda I2C a vuoto

Segnale I2C con pull up 3.3V

Dettaglio fronti d'onda I2C con pull up 3.3V


Da notare come a vuoto, cioè senza nessun utilizzatore collegato, il segnale I2C è si a 5V per effetto delle pull up interne, ma lo slew rate del fronte di salita è pessimo per via della poca corrente disponibile.
Con le pull up 3.3V da 3.3k, valore alto ma accettabile, il segnale diventa del giusto livello, circa 3.5V come atteso, e con lo slew rate del fronte di salita decisamente migliore, anche se non è ancora ottimale, l'ideale è usare pull up da 1.5k con i 3.3V che garantiscono la corretta forma d'onda.




Logged

Pages: 1 [2]   Go Up
Jump to: