Distanza massima i2c senza pullup

Salve, come da titolo volevo chiedervi quale è la distanza massima consigliata per la i2c senza l'uso di resistenze di pullup. Io sto usando un cavo di 40 cm (due comuni cavi per breadboard da 20 cm in serie). Il valore che leggo è alternativamente 0 e poi il byte che ho inviato, poi di nuovo 0 e poi il byte che ho inviato, poi di nuovo 0 ecc
È normale cosi oppure è perché il cavo è troppo lungo ? In realtà ho programmato Arduino in modo da ignorare il segnale 0, però mi chiedevo se avessi superato la distanza consigliata (sempre parlando senza pullup)

Le resistenze di pull-up sono OBBLIGATORIE su un bus I2C, indipendentemente dalla distanza ... è un collegamento open-drain (equivalente all'open-collector) e quindi necessita SEMPRE di resistenze che mantengano lo stato HIGH.

Detto questo, il bus I2C è nato per far comunicare chip sullo stesso circuito stampato, non certo per essere portato a decine e decine di cm. di distanza via filo. Per fare ciò esistono degli appositi chip che fanno da bus-extender e che permettono di portare dei segnali I2C a distanze di metri (es. P82B715 che arriva anche a 50 mt).

Guglielmo

gpb01:
Le resistenze di pull-up sono OBBLIGATORIE su un bus I2C, indipendentemente dalla distanza ... è un collegamento open-drain (equivalente all'open-collector) e quindi necessita SEMPRE di resistenze che mantengano lo stato HIGH.

Detto questo, il bus I2C è nato per far comunicare chip sullo stesso circuito stampato, non certo per essere portato a decine e decine di cm. di distanza via filo. Per fare ciò esistono degli appositi chip che fanno da bus-extender e che permettono di portare dei segnali I2C a distanze di metri (es. P82B715 che arriva anche a 50 mt).

Guglielmo

Ho capito grazie. Quindi in pratica da quel che hai detto, sembrerebbe che quel segnale "0" che rilevo a intermittenza è per via del fatto che non ho usato resistenza di pullup giusto ?

Senza resistenze di pull-up i risultati NON sonio determinabili a priori ... qualsiasi cosa può alterare i valori letti o introdurre false letture.

Tutorial sul bus I2C da studiare QUI ed anche QUI.

Guglielmo

Va bene grazie mille, gli darò una lettura

ichigokurosaki:
ho programmato Arduino in modo da ignorare il segnale 0

fantastico, potevi sostituirlo direttamente con una batteria :wink: (se ad un segnale binario togli i valori 0 resta un segnale in corrente continua a valore costante ...)
... scusa, non ho resistito :stuck_out_tongue: :smiley: :smiley:

maubarzi:
fantastico, potevi sostituirlo direttamente con una batteria :wink: (se ad un segnale binario togli i valori 0 resta un segnale in corrente continua a valore costante ...)
... scusa, non ho resistito :stuck_out_tongue: :smiley: :smiley:

No vabbè non funzionava cosi XD mi sono spiegato male, inviavo dei bit dal master. Se inviavo il bit relativo alla lettera "a" lo slave riceveva il bit relativo a "a" e poi il bit relativo a "0", poi di nuovo "a" poi 0 ecc. Se invece inviavo il bit relatico a b mi riceveva b e poi 0 , b e poi 0 e così via . Non ignoravo lo zero in quanto zero

Aggiorno
No in realtà mi sono pure accorto che ho letto male la corrispondenza sulla tabella Ascii, in realtà il valore a intermittenza che ricevevo insieme al byte giusto (scusate qui sopra prima della modifica ho scritto bit ma volevo dire sequenza di 8 bit), era il byte 11111111 che me lo stampava su schermo come 255 . Quindi riprendendo l'esempio di poco fa, io inviando dal master la lettera a (codice Ascii 97=01100001 come sequenza di bit), sullo slave ricevevo
97
255
97
255
97
255
eccetera,
Con la lettera b invece (codice Ascii 98=01100010 come sequenza di bit ) ricevevo
98
255
98
255
Ecc

Invece in base a come impostavo il delay di aggiornamento dello slave potevo anche ricevere per la lettera a
97
97
97
255
97
97
97
255
Cioè c'era pure una certa frequenza su cui questo 11111111 appariva nella comunicazione i2c, anche se non riuscivo a capire esattamente quale perché comunque continuava a spuntare anche se cambiavo il delay