Buongiorno,
ho un problema nell’usare assieme due componenti I2C, i due componenti sono un display 4x7segmenti basato su TM1650 e un modulo RTC ds3231, messi in parallelo (ho provato con e senza resistenza di pullup).
Presi singolarmente funzionano, messi assieme su A4 e A5 (Arduino Uno) il display in qualche modo “copre” l’rtc e non lo fa funzionare.
Ho quindi lanciato l’utility i2c scan e per l’RTC mi ha trovato 0x68 (e 0x57) mentre per il display mi ha trovato TUTTI :o gli indirizzi da 0x01 a 0x7E, quindi anche 0x68.
I2C Scanner
Scanning...
I2C device found at address 0x01 !
I2C device found at address 0x02 !
I2C device found at address 0x03 !
…………………………………………………………………………………………
I2C device found at address 0x7C !
I2C device found at address 0x7D !
I2C device found at address 0x7E !
Done
Vorrei capire se sia normale sta sfilza di indirizzi perché cercando in rete ho trovato QUESTO articolo dove sembra che il TM1650 non sia proprio proprio I2C.:
The protocol is ''I2C-like'', but not compatible to I2C (very strange, uses commands instead of address+RW bits, you could not have more than one device on the same bus since the I2C address is not used).
(L’autore metterebbe anche a disposizione una libreria arrangiata dove si può scegliere i pin da usare per SDA e SCL, ma non mi sembra una libreria pensata per Arduino.)
Ogni suggerimento è ben accetto, allego link ai prodotti e schema di collegamento.
Basta leggere il datasheet per vedere che non è esattamente I2C, ma un qualche cosa che gli somiglia e che il produttore del chip chiama "2-wire serial transmission protocol".
Prova a vedere se con QUESTA libreria ti funziona e non va in conflitto, altrimenti dovrai usare una I2C software e due pin diversi solo per quel modulo.
Guglielmo
P.S.: Il problema è che, facendo base dall'indirizzo 0x24, poi usa un valore per ogni digit !!! Nel sorgente si vede chiaramente che, per scrivere su ogni digit, chiama la "Wire.beginTransmission(TM1650_DCTRL_BASE + i);" con 'i' che va da 0 al numero di digits ... :o
Alla fine con una soluzione un po’ casereccia ho risolto, anziché usare la SoftI2CMaster e poi dovermi gestire i dati dei registri ho usato la SoftwareWire, creando delle versioni personalizzate delle due librerie che gestiscono l’RTC e il display e all’interno di queste ho sostituendo i riferimenti alla lib. Wire con un nuovo bus SoftwareWire.