Bagaimana cara mengatasi perselisihan alamat I2C?


39

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.

Jawaban:


24

Tidak ada yang dibangun ke dalam I2C untuk melakukan ini, biasanya perangkat slave akan memiliki beberapa pin eksternal yang dapat diatur ke 0 atau 1 untuk beralih beberapa bit alamat untuk menghindari masalah ini. Atau saya sudah berurusan dengan beberapa produsen yang memiliki 4 atau 5 nomor bagian untuk satu bagian, satu-satunya perbedaan adalah alamat I2C-nya.

Sebagian besar perangkat memiliki perangkat keras khusus yang menangani komunikasi I2C, yaitu ACK budak di perangkat keras sehingga Anda benar-benar tidak dapat meretasnya.

Adapun modul terjemahan, Anda dapat membeli beberapa $ 0,50 PIC dengan 2 bus I2C dan menulis beberapa kode cepat untuk membuat mereka bertindak sebagai penerjemah alamat kurasa.


Terima kasih. Ya, perangkat ini memang memiliki pilih alamat, tetapi hanya antara dua alamat dan saya ingin menghubungkan 5 perangkat, jadi saya masih berakhir dengan bentrokan. Saya tidak pernah berpikir untuk menggunakan PIC. Itu seharusnya bekerja. Apakah tidak ada sesuatu pun dari rak yang melakukan hal semacam ini?
Simon P Stevens

11
NXP membuat banyak multiplexer / switch untuk I2C, Anda mungkin dapat mengatur sesuatu dari itu: ics.nxp.com/products/i2cmuxes misalnya Anda dapat membuat di cabang kasus 3 Anda, masing-masing dengan 2 perangkat di atasnya , dan gunakan salah satu sakelar NXP untuk mencapai tujuan Anda.
Tandai

Hebat, hal seperti itulah yang saya cari. Saya hanya tidak tahu namanya. Terima kasih.
Simon P Stevens

Jawaban ini adalah 7 tahun, jadi saya percaya itu bisa menjadi yang terbaik pada saat itu ditawarkan. Namun, bagi yang lain yang datang sekarang, beberapa jawaban yang jauh lebih baru (saat ini berperingkat lebih rendah dalam daftar) menawarkan pendekatan yang berpotensi lebih baik berdasarkan komponen yang lebih baru yang sekarang ada di pasaran.
Bata

6

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.

Beberapa perangkat I2C dengan alamat yang sama

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.


Saya menghargai bahwa Anda telah mengikuti dan memposting ini. Ini adalah solusi yang cukup cerdik, saya yakin ini akan membantu orang lain.
Simon P Stevens

Niche yang bagus yang dapat digunakan pada beberapa aplikasi. Saya sangat menyukainya.
Harry Svensson

5

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"


6
Saya tidak downvoting, tetapi ini tampaknya agak berisiko bagi saya. Pengalaman saya dengan I2C adalah bahwa itu cukup rawan kebisingan hanya dengan koneksi biasa. Namun, Anda menggunakan kata "retas" dan menyebutkan peringatan "jika tidak ada perangkat i2c yang menggunakan peregangan jam", jadi jika itu dapat bekerja untuk seseorang, maka lebih banyak kekuatan untuk mereka.
Jason S

5

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)


1
Tautan rusak. fairchildsemi.com/product-technology/bus-switches bekerja lebih baik.
florisla

4

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.


Sebenarnya, ini bukan hack sama sekali, dan saya berpendapat ini harus menjadi jawaban yang diterima. Saya telah melihat ini digunakan dalam beberapa produk komersial, dan saya tidak bisa memikirkan solusi yang lebih baik (kecuali Anda tidak memiliki GPIO tersedia dan dengan demikian memerlukan solusi I2C murni seperti muxes spesifik I2C). Mux analog yang bagus memiliki banyak bandwidth dan murah-gila.
Jay Carlson

4

Sekarang ada jawaban - Linear Tech memiliki seri penerjemah alamat LTC4316 / 17/18. Mereka relatif baru, dan ketersediaannya tidak pasti.


Komponen yang sangat menarik. Sebagian besar perangkat I2C memiliki 2 alamat tetap dan ini dapat LTC4316 berpotensi menggandakan alamat dalam biaya yang masuk akal.
Mehrad

4

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

  • Tidak memerlukan pemrograman (vs pendekatan berbasis mikrokontroler)
  • Dapat mendukung fitur I2C dan kecepatan yang Anda butuhkan (vs analog bus digital / digital reguler). Misalnya, MUX biasa (non-I2C) tidak akan meneruskan alamat panggilan umum ke semua salurannya.

-1

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.


6
SCL bukan hanya keluaran. Seorang budak dapat meregangkan jam jika perlu memperlambatnya.
stevenvh

Anda dapat menggunakan multiplexer analog (yang dua arah) tetapi decoder mungkin tidak berfungsi karena alasan yang dinyatakan oleh stevenh. Jika Anda menggunakan multiplexer, Anda akan membutuhkan pulp yang lemah di sisi pendukung untuk memastikannya tidak aktif. Juga hanya mengubah pilihan multiplexer saat bus dalam keadaan diam.
Kevin White
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.