Saya ingin menghubungkan beberapa perangkat budak I2C ke pengontrol mikro semua pada set pin yang sama tetapi semua perangkat I2C berbagi alamat yang sama. Alamat-alamat tersebut diperbaiki di perangkat keras.
Apakah ada cara untuk menghubungkan banyak perangkat dengan alamat yang sama?
Mungkin semacam modul terjemahan alamat I2C dengan masing-masing perangkat dengan alamat yang dapat dikonfigurasi sehingga saya dapat menetapkan alamat saya sendiri untuk masing-masing.
Saya baru saja mengalami masalah ini dengan beberapa perangkat I2C dengan alamat tetap. Solusi kami adalah menggunakan jalur I / O pada mikrokontroler untuk memaksa jalur SDA tinggi pada perangkat yang tidak ingin kami atasi, sedangkan jalur I / O untuk perangkat yang kami targetkan ditetapkan sebagai input (impedansi tinggi ). Ini berarti bahwa hanya perangkat yang ditargetkan yang cocok dengan alamat I2C-nya dan yang lainnya mengabaikan data selanjutnya.
Resistor pada saluran SDA untuk perangkat yang tidak aktif pada akhirnya bertindak sebagai pull-up untuk bus, sehingga nilai yang tepat akan tergantung pada berapa banyak perangkat yang Anda miliki dan apa pull-up yang Anda butuhkan untuk bus Anda. Jadi jika Anda memilih 10K resistor, maka 3 perangkat tidak aktif memberikan pullup 3K3.
Dioda schottky memastikan bahwa perangkat masih dapat menarik jalur SDA cukup rendah saat mengirimkan data kembali ke host.
sumber
Jika tidak ada perangkat I2C yang menggunakan peregangan jam (handshaking), dan jika Anda menggedor master I2C, peretasan sederhana adalah membuat beberapa perangkat menukar jam dan pin data. Selama transmisi byte, perangkat yang memiliki jam dan pin data ditukar akan melihat setiap bit "0" sebagai non-peristiwa (data naik dan turun tanpa jam) dan akan melihat setiap bit "1" sebagai penghentian I2C dan mulai (jam naik saat data rendah, ditimpa oleh data naik dan turun, diikuti oleh jam turun). Kondisi berhenti dan mulai yang disengaja untuk satu perangkat dapat dilihat sebagai bit data oleh yang lain, tetapi kecuali satu perangkat memiliki jumlah awal dan kondisi berhenti antara bit "1", tidak mungkin bahwa perangkat mana pun akan "secara tidak sengaja"
sumber
Saya akan mempertimbangkan menggunakan sakelar bus untuk multiplex I2C bus di antara perangkat dengan alamat yang saling bertentangan. Sakelar bus memiliki kapasitansi dan resistansi yang sangat rendah, dan tidak seperti buffer / driver, sakelar ini benar yang menghubungkan atau memutuskan dua simpul sirkuit.
Sakelar bus biasanya memiliki satu karakteristik aneh, itu tidak masalah untuk I2C karena menggunakan perangkat drainase terbuka: sakelar bus memiliki resistansi rendah ketika mengikat bersama voltase mendekati 0 (Vss), tetapi resistansi naik secara dramatis ketika pendekatan voltase catu daya Vdd. (Ini karena mereka pada dasarnya MOSFET dengan voltase gerbang pada catu daya saat dihidupkan, sehingga voltase yang diaktifkan mendekati Vdd, Vgs yang tersedia jauh lebih rendah)
sumber
Saya memiliki dua sensor warna terang TCS3414 yang ingin saya bandingkan (Paket FN dan CS, yang memiliki filter berbeda). Alamat I2C bawaan. Setelah melihat bagaimana I2C bekerja dalam hal jalur SCL (clock) dan SDA (data), tampaknya mematikan jalur SDA akan mencegah chip dari memulai atau menghentikan bit dan dengan demikian membiarkannya tidak aktif. Jadi digunakan saklar analog CMOS (4066B) untuk menghidupkan atau mematikan jalur SDA untuk setiap perangkat. Ini berfungsi dengan baik untuk beralih di antara kedua perangkat. Saya tahu ini adalah peretasan, dan PCA9548 akan jauh lebih baik, tetapi saya tidak memiliki satu pun yang berguna.
sumber
Sekarang ada jawaban - Linear Tech memiliki seri penerjemah alamat LTC4316 / 17/18. Mereka relatif baru, dan ketersediaannya tidak pasti.
sumber
Beberapa produsen menawarkan I2C bus multiplex- dan switch IC.
Mux dapat mengaktifkan satu saluran sekaligus; sebuah saklar dapat mengaktifkan banyak yang secara paralel.
Lihat misalnya penawaran NXP , TI dan Maxim .
Untuk eksperimen, Adafruit memiliki papan TCA9548a .
Jika Anda memiliki 8 chip target dengan alamat yang sama, pilih MUX 8-ke-satu. Sebelum mengakses salah satu chip target, konfigurasikan MUX untuk mengaktifkan bus I2C yang benar.
Keuntungan
sumber
Gunakan chip demux sederhana (mis. 74HC139 afaik) dan hubungkan pin I2C CLK ke input (karena pin I2C CLK adalah output saja). Gunakan pin GPIO untuk mengontrol output yang diinginkan. Kemudian pin data I2C dapat dibagi di antara semua budak.
sumber