題:
如何解決I2C地址衝突?
Simon P Stevens
2010-10-11 19:40:26 UTC
view on stackexchange narkive permalink

我想將多個I2C從設備連接到微控制器,所有設備都在同一組引腳上,但是I2C設備都共享相同的地址。地址是固定在硬件中的。

是否可以通過多種方式連接具有相同地址的多個設備?

也許每種I2C地址轉換模塊都具有可配置地址的設備因此我可以為每個地址分配自己的地址。

八 答案:
Mark
2010-10-11 19:56:22 UTC
view on stackexchange narkive permalink

I2C沒有內置功能可以執行此操作,通常從設備將具有一些外部引腳,可以將其設置為0或1,以切換幾個地址位來避免此問題。或者,我與一些製造商打交道,這些製造商的零件具有4或5個零件號,唯一的區別是其I2C地址。

大多數設備具有處理I2C通信的特定硬件,即從屬設備ACK是在硬件中的,所以您真的無法破解它。

對於翻譯模塊,您可以購買帶有兩個I2C總線的PIC約0.50美元,並編寫一些快速代碼以使它們充當地址轉換器。猜。

謝謝。是的,這些設備確實有一個地址選擇,但是只能在兩個地址之間選擇,並且我想連接5個以上的設備,因此我仍然會遇到衝突。我沒想到要使用PIC。那應該工作。有什麼東西可以做的嗎?
恩智浦為I2C製造了一堆多路復用器/開關,您也許可以從中提取一些東西:http://ics.nxp.com/products/i2cmuxes/例如,您可以創建3個子分支,每個分支上面裝有2個設備,並使用NXP的其中一個開關來實現您的目標。
太好了,這正是我想要的東西。我只是不知道名字。謝謝。
這個答案已有7年曆史了,因此我相信它在提供時可能是最好的。但是,對於現在遇到的其他問題,一些較新的答案(目前在列表中排名較低)可以根據目前市場上較新的組件提供可能更好的方法。
Peter Gibson
2018-08-22 11:48:38 UTC
view on stackexchange narkive permalink

我剛剛遇到了多個具有固定地址的I2C設備的問題。我們的解決方案是在微控制器上使用I / O線,以使SDA線在我們不想要尋址的設備上處於高電平,而我們要定位的設備的I / O線設置為輸入(高阻抗)。這意味著只有目標設備匹配其I2C地址,而其他設備則忽略任何後續數據。

Multiple I2C devices with same address

不活動設備的SDA線上的電阻最終充當總線的上拉電阻,因此確切的值將取決於您擁有多少個設備以及總線需要什麼樣的上拉電阻。因此,如果您選擇10K電阻,那麼3個無效的設備會產生3K3上拉電阻。

肖特基二極管可確保在將數據傳輸回主機時,器件仍能將SDA線拉至足夠低的水平。

感謝您跟踪並發布了此信息。這是一個非常巧妙的解決方案,我相信它將對其他人有所幫助。
一個不錯的細分市場,可以在*某些*應用程序上使用。我很喜歡。
這是錯誤的硬件設計的解決方法嗎?如果我們沒有多餘的IO引腳怎麼辦?
supercat
2011-12-13 02:14:34 UTC
view on stackexchange narkive permalink

如果沒有一個I2C設備使用時鐘延長(握手),並且如果要對I2C主設備進行位衝擊,那麼一個簡單的辦法就是讓某些設備交換時鐘和數據引腳。在傳輸字節期間,時鐘和數據引腳互換的設備會將每個“ 0”位視為非事件(數據無時鐘上升和下降),並且將每個“ 1”位視為I2C停止然後開始(數據低時時鐘上升,數據上升和下降使時鐘下降,然後時鐘下降)。一個設備的故意停止和啟動條件可能被另一設備視為數據位,但是除非一個設備在“ 1”位之間有過多的啟動和停止條件,否則任何設備都不太可能“偶然”看到一個開始條件,後面緊跟著八個數據位,中間沒有停止條件。

我沒有投票,但是這對我來說有點冒險。我對I2C的經驗是,僅使用通常的連接就足夠容易產生噪聲。但是,您可以使用“ hack”一詞,並提請注意“如果i2c設備均不使用時鐘延展”,因此,如果它可以為某人工作,則可以為他們提供更大的動力。
Jason S
2011-12-13 04:16:29 UTC
view on stackexchange narkive permalink

我會考慮使用總線開關在地址衝突的設備之間多路復用I2C總線。總線開關的電容和電阻非常低,與緩衝器/驅動器不同,它們是連接或斷開兩個電路節點的真正開關。

總線開關通常具有一個奇特的特性,這對I2C無關緊要它使用漏極開路設備:當將接近0(Vss)的電壓捆綁在一起時,總線開關的導通電阻很低,但是當電壓接近電源Vdd時,電阻會急劇上升。 (這是因為它們基本上是MOSFET,它們在導通時在電源處具有柵極電壓,因此當開關電壓接近Vdd時,可用的Vgs會低得多)

鏈接斷開。https://www.fairchildsemi.com/product-technology/bus-switches/效果更好。
David Hill
2013-02-18 10:30:56 UTC
view on stackexchange narkive permalink

我有兩個要比較的TCS3414彩色光傳感器(FN和CS封裝,它們具有不同的濾光片)。 I2C地址是硬連線的。在根據SCL(時鐘)和SDA(數據)線查看I2C的工作原理後,似乎關閉SDA線將阻止芯片獲得啟動位或停止位,從而使其處於休眠狀態。因此使用了CMOS模擬開關(4066B)來打開或關閉每個設備的SDA線。這在兩個設備之間切換時效果很好。我知道這是一種黑客攻擊,PCA9548會更好,但我沒有一個好用。

實際上,這根本不是黑客,我認為這應該是公認的答案。我已經在很多商業產品中看到了這種用法,但我想不出更好的解決方案(除非您沒有可用的GPIO,因此需要純I2C解決方案,例如I2C特定的複用器)。好的ol'模擬復用器具有足夠的帶寬,而且價格便宜。
user3608541
2015-06-25 05:02:14 UTC
view on stackexchange narkive permalink

現在有一個答案-Linear Tech擁有LTC4316 / 17/18系列地址轉換器。它們相對較新,並且可用性不確定。

非常有趣的組件。大多數I2C器件具有2個固定地址,因此LTC4316可能以合理的成本使該地址加倍。
florisla
2017-03-29 19:18:31 UTC
view on stackexchange narkive permalink

幾個製造商提供I2C總線多路復用和開關IC。

多路復用器可以一次激活一個通道;一台交換機可以並行啟用多個交換機。

例如查看 NXP TI Maxim的產品。

為了進行實驗,Adafruit有一個 TCA9548a板

如果您有8個目標地址相同的目標芯片,請選擇8對1的MUX。在訪問任何目標芯片之前,請配置MUX以激活正確的I2C總線。

優勢

  • 不需要編程(與基於微控制器的方法相比)
  • 可以支持所需的I2C功能和速度(與常規的模擬/數字總線多路復用器相比)。例如,常規(非I2C)MUX不會將常規呼叫地址傳遞到其所有通道。
Socrates
2011-12-13 12:41:01 UTC
view on stackexchange narkive permalink

使用簡單的多路復用器芯片(例如74HC139 afaik)並將I2C CLK引腳連接到輸入(因為I2C CLK引腳僅輸出)。使用GPIO引腳控制所需的輸出。然後I2C數據引腳可以在所有從機之間共享。

SCL *不是*僅輸出。如果從屬設備需要降低速度,則可以[延長時鐘](http://www.i2c-bus.org/clock-stretching/)。
您可以使用模擬多路復用器(雙向),但由於stevenh所述的原因,解碼器可能無法工作。如果使用多路復用器,則從站側將需要使用弱漿以確保其保持不活動狀態。也僅在總線空閒時更改多路復用器選擇。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 2.0許可。
Loading...