I2C adresi çakışmalarını nasıl çözebilirim?


39

Birden fazla I2C bağımlı cihazını aynı pin grubundaki bir mikro denetleyiciye bağlamak istiyorum, ancak I2C cihazları aynı adresi paylaşıyor. Adresler donanımda sabittir.

Aynı adrese sahip birden fazla cihazı bağlamanın bir yolu var mı?

Muhtemelen bir tür I2C adres çeviri modülü ile her cihaz için yapılandırılabilir bir adrese sahip olabilirim, böylece her birine kendi adreslerimi atayabilirim.

Yanıtlar:


24

Bunu yapmak için I2C'ye yerleşik hiçbir şey yoktur, normalde bağımlı cihazlarda, bu sorunu önlemek için birkaç adres bitini değiştirmek üzere 0 veya 1 olarak ayarlanabilen bazı harici pimler bulunur. Alternatif olarak, bir parça için 4 veya 5 parça numarasına sahip birkaç üretici ile uğraştım, tek fark I2C adresi.

Çoğu aygıt, I2C iletişimini idare eden belirli bir donanıma sahiptir, yani ikincil ACK donanımdadır, bu yüzden gerçekten onu kesemezsiniz.

Çeviri modülüne gelince, 2 I2C veri yolu ile 0,50 $ PIC satın alabilir ve sanırım adres çeviricileri olarak davranmalarını sağlamak için bazı hızlı kodlar yazabilirsiniz.


Teşekkürler. Evet, bu cihazların bir adres seçimi var, ancak yalnızca iki adres arasında ve ben 5+ cihazı bağlamak istiyorum, bu yüzden yine de çatışmalarla karşılaşacaktım. PIC kullanmayı düşünmemiştim. Bu çalışması gerekir. Raftan böyle bir şey yapan bir şey yok mu?
Simon P Stevens

11
NXP, I2C için bir sürü çoğaltıcı / anahtar yapar, bunlardan bir şeyi kurabilirsiniz : örneğin, her birinde 2 cihaz bulunan 3 alt dalda oluşturabileceğiniz 3 alt dal ( ics.nxp.com/products/i2cmuxes) ve hedefinize ulaşmak için NXP'in anahtarlarından birini kullanın.
Mark,

Harika, tam da aradığım şey buydu. Sadece adını bilmiyordum. Teşekkürler.
Simon P Stevens

Bu cevap 7 yaşında, bu yüzden teklif edildiği zaman en iyi olabileceğine inanıyorum. Bununla birlikte, şimdi gelen diğer kişiler için, daha yeni cevapların bazıları (şu anda listede daha düşük sıralananlar), şu anda piyasada olan daha yeni bileşenlere dayanarak potansiyel olarak daha iyi yaklaşımlar sunmaktadır.
Brick

6

Sabit bir adrese sahip birden fazla I2C cihazında bu sorunu yaşıyorum. Çözümümüz biz bu cihazlarda yüksek SDA hatlarını zorlamak için mikrodenetleyici üzerinde G / Ç hatlarını kullanmaktı yok cihaz için I / O hattı biz, hedefleme girdi olarak ayarlanır ise, adres istiyorum (yüksek empedans ). Bu, yalnızca hedeflenen cihazın I2C adresiyle eşleştiği ve diğerleri sonraki verileri göz ardı ettiği anlamına gelir.

Aynı adrese sahip birden fazla I2C cihazı

Aktif olmayan cihazlara yönelik SDA hattındaki dirençler, veri yolu için pull-up'lar olarak işlev görür, bu nedenle kesin değer, kaç tane cihaza sahip olduğunuza ve veri yolu için hangi çekmeye ihtiyacınız olduğuna bağlı olacaktır. Bu nedenle, 10K dirençleri seçerseniz, 3 etkin olmayan cihaz 3K3 çekimi sağlar.

Schottky diyotlar, verileri ana bilgisayara geri gönderirken cihazın hala SDA hattını yeterince çekebilmesini sağlar.


Bunu takip edip gönderdiğin için minnettarım. Bu oldukça zekice bir çözüm, başkalarına yardımcı olacağından eminim.
Simon P Stevens

Bazı uygulamalarda kullanılabilecek hoş bir niş . Onu çok severim.
Harry Svensson,

5

I2C cihazlarından hiçbiri saat uzatması kullanmıyorsa (el sıkışma) ve I2C ana ünitesine biraz çarpıyorsanız, basit bir kesmek, bazı cihazların saati ve veri pimlerini değiştirmesini sağlamaktır. Bir bayt iletimi sırasında, saat ve veri pinlerinin değiştirildiği cihaz, her "0" bit'i bir etkinlik dışı olarak görecektir (veri saat olmadan yükselen ve düşen) ve her bir "1" biti I2C stop olarak görecektir. ve başlayın (veriler düşükken yükselen saat, artan ve düşen verilerle nabız, ardından saat düşüyor). Bir cihaz için kasıtlı durdurma ve çalıştırma koşulları, diğeri tarafından veri bitleri olarak görülebilir, ancak bir cihaz "1" bitler arasında aşırı sayıda çalıştırma ve durdurma koşuluna sahip olmadığı sürece, herhangi bir cihazın "yanlışlıkla" olması muhtemel değildir


6
Aşağı oy kullanmıyorum, ama bu benim için biraz riskli görünüyor. I2C ile olan deneyimim, normal bağlantıyla yeterince gürültüye meyilli olduğu yönünde. Ancak, "hack" kelimesini kullanıyorsunuz ve "i2c cihazlarından hiçbiri saat uzatmayı kullanmıyorsa" uyarısını belirtiyorsunuz, bu nedenle eğer biri için çalışabilirse, o zaman onlara daha fazla güç veriyor.
Jason S

5

I2C veri yolunu, birbiriyle çakışan adreslere sahip cihazlar arasında çoğaltmak için veri yolu anahtarlarını kullanmayı düşünürdüm . Veriyolu anahtarları çok düşük kapasitans ve dirençtir ve arabelleklerin / sürücülerin aksine, iki devre düğümünü birbirine bağlayan veya ayıran gerçek anahtarlardır.

Veriyolu anahtarları genellikle tek bir özelliğe sahiptir, I2C için önemli değildir, çünkü açık boşaltma cihazları kullanır: bir veriyolu anahtarı 0 (Vss) yakınındaki gerilimleri birbirine bağlarken düşük dirençe sahiptir, ancak gerilim yaklaşırken çarpıcı biçimde yükselir güç kaynağı Vdd. (Bunun nedeni, temelde güç kaynağında açıldıklarında geçit gerilimi olan MOSFET'lerdir, böylece anahtarlamalı gerilimler Vdd'ye yaklaşırken, mevcut Vgs daha düşüktür)


1
Bağlantı koptu. fairchildsemi.com/product-technology/bus-switches daha iyi çalışıyor.
florisla

4

Karşılaştırmak istediğim iki adet TCS3414 renkli ışık sensörüm vardı (farklı filtrelere sahip olan FN ve CS paketleri). I2C adresi kablolu. I2C'nin SCL (saat) ve SDA (veri) hatları açısından nasıl çalıştığına baktıktan sonra, SDA hattını kapatmanın çipin başlama veya durma biti almasını önlediği ve böylece uykuda kaldığı anlaşılıyor. Bu nedenle, her aygıta SDA hattını açmak veya kapatmak için bir CMOS analog anahtar (4066B) kullanılır. Bu iki cihaz arasında geçiş yapmak için gayet iyi çalıştı. Bunun bir hack olduğunu biliyorum ve PCA9548 çok daha iyi olurdu, ama bir işe yaramadım.


Aslında, bu kesinlikle bir hack değil ve bunun kabul edilen cevap olması gerektiğini savunuyorum. Bunu birkaç ticari üründe kullandığımı gördüm ve daha iyi bir çözüm düşünemiyorum (GPIO'nuz yoksa ve I2C'ye özgü mux'ler gibi saf I2C çözümüne ihtiyacınız yoksa). İyi ol 'analog mux'lerin bol miktarda bant genişliği var ve çılgınca ucuzlar.
Jay Carlson,

4

Şimdi bir cevap var - Linear Tech, LTC4316 / 17/18 adres çeviricisine sahiptir. Nispeten yenidirler ve bulunabilirlik belirsizdir.


Çok ilginç bir bileşen. Çoğu I2C cihazı 2 sabit adrese sahiptir ve bu LTC4316'nın adresleme işlemini makul bir maliyetle iki katına çıkarabilir.
Mehrad

4

Bazı üreticiler I2C veri yolu çoğullama ve anahtar IC'leri sunar.

Bir mux, bir seferde bir kanalı aktive edebilir; Bir anahtar, birden fazla olanı paralel olarak etkinleştirebilir.

Örneğin NXP , TI ve Maxim tekliflerini kontrol edin .

Deneme için, Adafruit'in bir TCA9548a kurulu vardır .

Aynı adreslere sahip 8 hedef yonganız varsa, 8 bire bir MUX seçin. Hedef yongalardan herhangi birine erişmeden önce, doğru I2C veriyolunu etkinleştirmek için MUX'u yapılandırın.

Avantajları

  • Programlama gerektirmez (vs mikrodenetleyici tabanlı yaklaşım)
  • I2C özelliklerini ve ihtiyacınız olan hızları destekleyebilir (normal analog / dijital veriyolu mux'leri vs). Örneğin, normal (I2C olmayan) bir MUX, genel arama adreslerini tüm kanallarına iletmez.

-1

Basit bir demux yonga kullanın (örn. 74HC139 afaik) ve I2C CLK pinini girişe bağlayın (yalnızca I2C CLK pininin çıkışı olduğundan). İstenilen çıkışı kontrol etmek için GPIO pinlerini kullanın. Daha sonra I2C veri pini tüm slave'ler arasında paylaşılabilir.


6
SCL yalnızca çıktı değil . Bir köle, yavaşlaması gerekiyorsa saati gerebilir.
stevenvh

Bir analog çoklayıcıyı (iki yönlüdür) kullanabilirsiniz, ancak kod çözücü, stevenh tarafından belirtilen nedenle çalışmayabilir. Eğer multiplexer kullanıyorsanız, aktif olmamasını sağlamak için slave tarafta zayıf bir posa gerekir. Ayrıca, sadece otobüs boştayken çoklayıcı seçimini değiştirin.
Kevin White
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.