Domande su i2c

Salve!
vorrei qualche delucidazione sul l'uso della resistenza di pull-up, vedendo i vari datasheet dei vari componiti che ho nello schema utilizzano varare resistenze con valori diversi.
Mi chiedevo se va applicata una resistenze per ogni componete o se va messa una calcolando tutti i componenti attaccati assieme.
Grazie

Da https://www.arduino.cc/en/Main/arduinoBoardUno

"Each of the 14 digital pins on the Uno can be used as an input or output, using pinMode(), digitalWrite(), and digitalRead() functions. They operate at 5 volts. Each pin can provide or receive 20 mA as recommended operating condition and has an internal pull-up resistor (disconnected by default) of 20-50k ohm. A maximum of 40mA is the value that must not be exceeded on any I/O pin to avoid permanent damage to the microcontroller."

leggi questo: Need for I2C pullup resistors - Interfacing - Arduino Forum.
Ciao!

Quindi basta solo una resistenza per sda scl non vanno aggiunte per ogni componete in più!?

NXTfreeDOmF:
Da https://www.arduino.cc/en/Main/arduinoBoardUno

"Each of the 14 digital pins on the Uno can be used as an input or output, using pinMode(), digitalWrite(), and digitalRead() functions. They operate at 5 volts. Each pin can provide or receive 20 mA as recommended operating condition and has an internal pull-up resistor (disconnected by default) of 20-50k ohm. A maximum of 40mA is the value that must not be exceeded on any I/O pin to avoid permanent damage to the microcontroller."

leggi questo: Need for I2C pullup resistors - Interfacing - Arduino Forum.
Ciao!

Ti faccio un esempio.

Il modulo RTC Tiny I2C ha già al suo interno due resistori di pullup da 3.3k.

Aggiungendo un altro dispositivo I2C non hai bisogno di inserire altri resistori.

D'altra parte, anche se lo facessi con due resistori da 4.7k, otterresti un paio di resistori equivalenti da circa 2k ciascuno: saresti ancora nel margine di funzionamento.

Mi spiego meglio, il mio micro sarebbe un atmega32u4 con in i2c collegato un ds2131+ eeprom 24lc512+ hih6120+ 2 pca9685.
Quindi mi basterebbe una solo resistenza da 4.7k 3per entrambe le linee!?

cyberhs:
Ti faccio un esempio.

Il modulo RTC Tiny I2C ha già al suo interno due resistori di pullup da 3.3k.

Aggiungendo un altro dispositivo I2C non hai bisogno di inserire altri resistori.

D'altra parte, anche se lo facessi con due resistori da 4.7k, otterresti un paio di resistori equivalenti da circa 2k ciascuno: saresti ancora nel margine di funzionamento.

Visto il numero elevato di dispositivi I2C, meglio inserire due resistori sulle linee SDA SCL da 2.2k/3.3k, facendo attenzione a quello che ho detto prima.

Se non erro ci darebbe una formula per calcolarli...giusto!?

cyberhs:
Visto il numero elevato di dispositivi I2C, meglio inserire due resistori sulle linee SDA SCL da 2.2k/3.3k, facendo attenzione a quello che ho detto prima.

Supponendo che ogni dispositivo funzioni con 1mA circa su entrambe le linee, con una tensione di 5V devi usare un resistore 5V / 0.001A ~= 4.7k ohm.

Per avere una commutazione più sicura in presenza di più dispositivi, puoi usare una corrente doppia cioè 2mA ed il resistore di pullup sarà 5V / 0.002A ~= 2.4k ohm.

La linea SCL è comandata dal MASTER (Arduino) e gli altri dispositivi sono in ricezione, mentre la linea SDA è sia di Input che di Output.

Tipo il hih6120 da datasheet consiglia 2.2k, quindi nn capisco con che logia vanno applicate le resistenze...
Quindi devo mettere sia 4.7k e 2.2k per il hih6120!?

cyberhs:
Supponendo che ogni dispositivo funzioni con 1mA circa su entrambe le linee, con una tensione d 5V devi usare un resistore 4.7k.

Alcuni dispositivi possono richiedere il doppio di corrente, quindi 2.2k

Il bus I2C funziona con piú dispositivi. perche i dispositivi non si rompono non hanno un uscita che puó portare l' uscita a HIGH e LOW ma solo a LOW. Il segnale HIGH sul bus arriva dalla resistenze Pullup. Questa resistenza dopo un segnale LOW deve caricare la linea per farla arrivare a un livello HIGH. Deve essere caricata la capacitá che la linea (il cavo) ha verso terra e deve anche dare la corrente che i dispositivi hanno bisogno in entrata. Questo caricamento deve avvenire abbastanza velocemente in modo che Tra un segnale LOW e il prossimo segnale la linea é arrivata a una tensione interpretata HIGH.

Se la resistenza é troppo piccola rispetto al carico (cavo e dispositivi) il bus non funziona piú.
Nick lo spiega bene qua: Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino

Riasumendo:
La resistenza di pullup sui collegamneti SDA e SCK deve riuscire a portare il livello di segnali su HIGH nel tempo ammesso e deve essere non troppo piccola senó le uscite dei dispositivi I2C non riescono a portare il segnale a LOW.
Il valore giusto dipende dalla velocitá di trasmissione del bus, dal tipo e lunghezza dei cavi/collegamenti e dal numero e tipo i discpositivi collegati.

Ci sono dispositivi per allungare la lunghezza dei cavi, di fare sottobus e dispositivi che portano attivamente il livello del Bus a HIGH.

Ciao Uwe