i2c e pullup resistor

ciao a tutti, visto che sto usando il protocollo i2c e mi ci sto affezionando, me lo sto studiando un po' meglio per cercare di capirci di più..

non capisco molto bene le pullup resistor. esattamente dove metterle. mettiamo che io abbia una rete "particolarmente" complessa, chessò per esempio 3 arduini e 4 device (sensori, mettiamo), e comunicano tutti tramite un bus i2c.. e i device non richiedono particolari resistenze di pullup.. uso un valore standard come 4.7k ohm..
dove le metto? due nel bus per tutti quanti? una per ogni device? e gli arduini usano quelle interne?
e più che altro.. a cosa servono? a rendere il segnale più stabile?

scusate la carrellata di domande :blush:

1 Like

--> I2C tutorial
--> DssCircuits.com is for sale | HugeDomains

Le resistenze di pull-up devono essere uniche per il bus.
Se le metti esterne, cosi puoi controllarne il valore più facilmente, devi disabilitare quelle interne degli Arduino.

PaoloP:
Se le metti esterne, cosi puoi controllarne il valore più facilmente, devi disabilitare quelle interne degli Arduino.

Non è una opzione, le pull up per la I2C DEVONO essere esterne, quelle integrate nel 328 sono di valore troppo alto per garantire il corretto funzionamento della I2C, il loro scopo è solo tenere agganciate a Vdd i pin di input lasciati flottanti, p.e. nel caso di pulsante che chiude verso GND.
Le pull up sul bus I2C servono per tenere le due linee SDA e SCL agganciate a 1 logico, sono indispensabili perché i relativi pin vengono settati come open drain, cioè chiudono solo verso GND e non verso Vdd.
Le pull up per la I2C devono garantire una corrente minima di 1 mA (4.7k) se il bus è molto corto, pochi cm, e con solo due-tre device collegati, velocità massima 100 kHz, se si vuole ottenere il massimo previsto dalle specifiche della I2C la corrente deve essere di ~3 mA (1.8k).

ehm.. e come disattivo quelle di arduino? devo modificare qualcosa nella Wire.h?

comunque grazie, sto trovando un po' di risposte:

"Of course as you add more and more devices to the lines the bus capacitance will increase and that means you'll have to start decreasing your resistance (t = RC) if you want to maintain your signal integrity."

anche se " so it's always good practice to look at the signals on an oscilloscope. " e io non saprei come fare :frowning:

mantissa00:
come disattivo quelle di arduino?

digitalWrite(SDA, 0);
digitalWrite(SCL, 0);

dopo l'inizializzazione della wire.

1 Like

ma mica sono attive di default, se lui non le ha attivate non deve fare nulla :slight_smile:

mantissa00:
ehm.. e come disattivo quelle di arduino? devo modificare qualcosa nella Wire.h?

Se l'I2C è a 5V puoi anche lasciarle attive, 30 k in parallelo a 4.7k hanno un effetto minimo, se l'I2C è a 3.3V allora devi disabilitare le pull up interne usando le due righe che ti ha postato PaoloP.

Testato:
ma mica sono attive di default,

Invece si, le attiva la libreria di default.

void twi_init(void)
{
  // initialize state
  twi_state = TWI_READY;
  twi_sendStop = true;		// default value
  twi_inRepStart = false;
  
  // activate internal pullups for twi.
  digitalWrite(SDA, 1);
  digitalWrite(SCL, 1);
[/code
1 Like

astrobeed:

Testato:
ma mica sono attive di default,

Invece si, le attiva la libreria di default.

void twi_init(void)

{
  // initialize state
  twi_state = TWI_READY;
  twi_sendStop = true; // default value
  twi_inRepStart = false;
 
  // activate internal pullups for twi.
  digitalWrite(SDA, 1);
  digitalWrite(SCL, 1);

Esattamente nel file /ibraries/Wire/utility/twi.cpp.
Basta commentare quelle 2 righe, oppure scriversi un metodo begin() nuovo che accetti in input anche lo stato delle pull-up interne.

questa mi mancava (come infinite altre cose :)),
grazie delle delucidazioni

perfretto grazie.. ho trovato un sito che spiega come utilizzare arduino come oscilloscopio ora provo a capire se con una resistnza esterna funziona meglio..