同 Arduino可以創建大量項目 如您所見,如果您讀過Hwlibre, 以簡單的方式對微控制器進行編程。但是在該板的類比和數位連接之間 hardware libre,有些對於許多初學者來說仍然有些未知,例如 PWM 連接、SPI、串行端口的 RX 和 TX 引腳或 I2C 總線本身的真正潛力。因此,透過本條目,您至少能夠了解有關 I2C 的所有資訊。
同 I2C總線 您可以連接並使用具有這種協議類型的許多第三方設備與Arduino開發板進行通信。 借助飛利浦的這項發明,您可以在它們之間連接加速度計,顯示器,計數器,指南針以及更多集成電路。
什麼是I2C?
I2C指集成電路,即,內部集成電路。 它是由飛利浦半導體公司於1982年開發的串行數據通信總線,在擺脫了這一部分之後,今天的公司是恩智浦半導體。 最初,它是為該品牌的電視創建的,用於以簡單的方式傳達多個內部芯片。 但是自1990年以來,I2C已經普及並被許多製造商所使用。
目前被數十家芯片製造商使用 用於多種功能。 Arduino板的微控制器的創建者Atmel出於許可目的介紹了TWI(兩線接口)名稱,儘管它與I2C相同。 但是在2006年,原始專利已過期,並且不再受版權保護,因此I2C一詞已被重用(僅徽標繼續受到保護,但該詞的實現或使用不受限制)。
I2C總線技術細節
El I2C總線已成為行業標準,而Arduino已實現它 與需要它的外圍設備進行通信。 它只需要兩條線或電纜即可工作,一條用於時鐘信號(CLK),另一條用於發送串行數據(SDA)。 與其他通信相比,與SPI總線相比,這是有利的,儘管由於需要額外的電路,其操作有些複雜。
在這輛公共汽車上 連接到它的每個設備都有一個地址 用於分別訪問這些設備。 該地址由硬件固定,可以通過跳線或開關DIP修改後3位,儘管它也可以由軟件完成。 每個設備都將具有唯一的地址,儘管其中一些設備可能具有相同的地址,並且可能有必要使用輔助總線以避免衝突或在可能的情況下進行更改。
此外,I2C總線具有一個 主從式架構 即主從。 這意味著當主設備啟動通信時,它將能夠從其從設備發送或接收數據。 從站將無法發起通信,只有主站才能進行通信,在沒有主站干預的情況下,從站也不能直接彼此通信。
如果你有 公共汽車上的幾個老師,只有一個人可以同時擔任老師。 但這是不值得的,因為更換教師需要很高的複雜性,所以它並不頻繁。
請記住, 主站提供時鐘信號以同步總線上的所有設備。 這就消除了每個奴隸都擁有自己的手錶的需要。
I2C總線協議還預見到電源電壓線(Vcc)中將使用上拉電阻器,儘管這些電阻器通常不與Arduino一起使用 上拉,因為編程庫 由於Wire激活內部值為20-30 k的值。 對於某些項目來說,這可能太軟了,因此信號的上升沿將變慢,因此可以使用較低的速度和較短的通信距離。 為了解決這個問題,您可能需要將外部上拉電阻設置為1k至4k7。
信號
La 溝通框架 其中I2C總線信號由位或狀態(在Arduino中使用的那些,因為I2C標准允許其他位或狀態)組成:
- 8位,其中7位 地址 您要訪問以從其發送或接收數據的從設備的地址。 使用7位,最多可以創建128個不同的地址,因此理論上可以訪問128個設備,但是只能訪問112個設備,因為16個設備保留用於特殊用途。 以及指示您是否想要的附加位 發送或接收 從設備信息。
- 也有 驗證位,如果未激活,則通訊將無效。
- 然後 數據字節 他們想被奴隸發送或接收。 如您所知,每個字節都由8位組成。 請注意,對於發送或接收的每8位或1字節數據,還需要額外的18位驗證,地址等,這意味著總線的速度非常有限。
- 最後一點 驗證 的溝通。
另外,時鐘頻率為 傳輸是標準的100 Mhz, 儘管有一個更快的模式,速度為400 Mhz。
I2C總線的優缺點
該 優點 聲音:
- 簡單 僅使用兩行。
- 它有 知道信號是否到達的機制 與其他通訊協議相比。
該 缺點 聲音:
- 速度 傳輸率相當低。
- 它不是全雙工,即您不能同時發送和接收。
- 不使用奇偶校驗 也沒有任何其他類型的驗證機制可以知道接收到的數據位是否正確。
Arduino上的I2C
En Arduino,取決於型號,可以啟用以使用此I2C總線的引腳會有所不同。 例如:
- Arduino UNO,納米,Mini Pro:A4用於SDA(數據),而A5用於SCK(時鐘)。
- Arduino的兆豐:SDA的引腳20,SCK的引腳21。
請記住,要使用它,您必須 利用圖書館 線材 用於您的Arduino IDE代碼,儘管還有其他類似的代碼 I2C y i2cdevlib。 您可以閱讀這些庫的文檔或我們感興趣的項目上的文章,以獲得有關其編程方式的代碼。
如何知道要與I2C一起使用的設備的地址?
最後一個警告是,當您從歐洲,日本或美國製造商那裡購買IC時,您會發現 指示方向 該用於設備。 另一方面,中國人有時不詳細介紹它,或者它不正確,因此它是行不通的。 使用地址掃描儀可以輕鬆地解決該問題,從而知道您應該在草圖中參考哪個方向。
La arduino社區 創建了這個 掃描地址並識別的代碼 以一種簡單的方式。 儘管我在這裡向您顯示了代碼:
#include "Wire.h" extern "C" { #include "utility/twi.h" } void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) { byte rc; byte data = 0; for( byte addr = from_addr; addr <= to_addr; addr++ ) { rc = twi_writeTo(addr, &data, 0, 1, 0); callback( addr, rc ); } } void scanFunc( byte addr, byte result ) { Serial.print("addr: "); Serial.print(addr,DEC); Serial.print( (result==0) ? " Encontrado!":" "); Serial.print( (addr%4) ? "\t":"\n"); } const byte start_address = 8; const byte end_address = 119; void setup() { Wire.begin(); Serial.begin(9600); Serial.print("Escaneando bus I2C..."); scanI2CBus( start_address, end_address, scanFunc ); Serial.println("\nTerminado"); } void loop() { delay(1000); }