我想將多個I2C從設備連接到微控制器,所有設備都在同一組引腳上,但是I2C設備都共享相同的地址。地址是固定在硬件中的。
是否可以通過多種方式連接具有相同地址的多個設備?
也許每種I2C地址轉換模塊都具有可配置地址的設備因此我可以為每個地址分配自己的地址。
我想將多個I2C從設備連接到微控制器,所有設備都在同一組引腳上,但是I2C設備都共享相同的地址。地址是固定在硬件中的。
是否可以通過多種方式連接具有相同地址的多個設備?
也許每種I2C地址轉換模塊都具有可配置地址的設備因此我可以為每個地址分配自己的地址。
I2C沒有內置功能可以執行此操作,通常從設備將具有一些外部引腳,可以將其設置為0或1,以切換幾個地址位來避免此問題。或者,我與一些製造商打交道,這些製造商的零件具有4或5個零件號,唯一的區別是其I2C地址。
大多數設備具有處理I2C通信的特定硬件,即從屬設備ACK是在硬件中的,所以您真的無法破解它。
對於翻譯模塊,您可以購買帶有兩個I2C總線的PIC約0.50美元,並編寫一些快速代碼以使它們充當地址轉換器。猜。
我剛剛遇到了多個具有固定地址的I2C設備的問題。我們的解決方案是在微控制器上使用I / O線,以使SDA線在我們不想要尋址的設備上處於高電平,而我們要定位的設備的I / O線設置為輸入(高阻抗)。這意味著只有目標設備匹配其I2C地址,而其他設備則忽略任何後續數據。
不活動設備的SDA線上的電阻最終充當總線的上拉電阻,因此確切的值將取決於您擁有多少個設備以及總線需要什麼樣的上拉電阻。因此,如果您選擇10K電阻,那麼3個無效的設備會產生3K3上拉電阻。
肖特基二極管可確保在將數據傳輸回主機時,器件仍能將SDA線拉至足夠低的水平。
如果沒有一個I2C設備使用時鐘延長(握手),並且如果要對I2C主設備進行位衝擊,那麼一個簡單的辦法就是讓某些設備交換時鐘和數據引腳。在傳輸字節期間,時鐘和數據引腳互換的設備會將每個“ 0”位視為非事件(數據無時鐘上升和下降),並且將每個“ 1”位視為I2C停止然後開始(數據低時時鐘上升,數據上升和下降使時鐘下降,然後時鐘下降)。一個設備的故意停止和啟動條件可能被另一設備視為數據位,但是除非一個設備在“ 1”位之間有過多的啟動和停止條件,否則任何設備都不太可能“偶然”看到一個開始條件,後面緊跟著八個數據位,中間沒有停止條件。
我會考慮使用總線開關在地址衝突的設備之間多路復用I2C總線。總線開關的電容和電阻非常低,與緩衝器/驅動器不同,它們是連接或斷開兩個電路節點的真正開關。
總線開關通常具有一個奇特的特性,這對I2C無關緊要它使用漏極開路設備:當將接近0(Vss)的電壓捆綁在一起時,總線開關的導通電阻很低,但是當電壓接近電源Vdd時,電阻會急劇上升。 (這是因為它們基本上是MOSFET,它們在導通時在電源處具有柵極電壓,因此當開關電壓接近Vdd時,可用的Vgs會低得多)
我有兩個要比較的TCS3414彩色光傳感器(FN和CS封裝,它們具有不同的濾光片)。 I2C地址是硬連線的。在根據SCL(時鐘)和SDA(數據)線查看I2C的工作原理後,似乎關閉SDA線將阻止芯片獲得啟動位或停止位,從而使其處於休眠狀態。因此使用了CMOS模擬開關(4066B)來打開或關閉每個設備的SDA線。這在兩個設備之間切換時效果很好。我知道這是一種黑客攻擊,PCA9548會更好,但我沒有一個好用。
現在有一個答案-Linear Tech擁有LTC4316 / 17/18系列地址轉換器。它們相對較新,並且可用性不確定。
幾個製造商提供I2C總線多路復用和開關IC。
多路復用器可以一次激活一個通道;一台交換機可以並行啟用多個交換機。
為了進行實驗,Adafruit有一個 TCA9548a板。
如果您有8個目標地址相同的目標芯片,請選擇8對1的MUX。在訪問任何目標芯片之前,請配置MUX以激活正確的I2C總線。
優勢
使用簡單的多路復用器芯片(例如74HC139 afaik)並將I2C CLK引腳連接到輸入(因為I2C CLK引腳僅輸出)。使用GPIO引腳控制所需的輸出。然後I2C數據引腳可以在所有從機之間共享。