Arduino I2C veriyolu hakkında her şey

Arduino I2C veriyolu

ile Arduino çok sayıda proje oluşturabilir gördüğünüz gibi Hwlibre okursanız, mikrodenetleyiciyi basit bir şekilde programlama. Ancak bu kartın analog ve dijital bağlantıları arasında hardware librePWM bağlantılarının gerçek potansiyeli, SPI, seri bağlantı noktasının RX ve TX pinleri veya I2C veri yolunun kendisi gibi yeni başlayanların çoğu tarafından hala bilinmeyen bazıları var. Dolayısıyla bu girişle en azından I2C hakkında ihtiyacınız olan her şeyi bilebileceksiniz.

ile I2C otobüsü Arduino kartıyla iletişim kurmak için bu tür protokole sahip birçok üçüncü taraf cihazı bağlayabilir ve kullanabilirsiniz. Bu Philips buluşu sayesinde aralarında ivmeölçerler, ekranlar, sayaçlar, pusulalar ve daha birçok entegre devre bağlayabilirsiniz.

I2C nedir?

I2C, Inter-Integated Devre anlamına geliryani, entegre devre. Bu bölümden kurtulduktan sonra bugün NXP Semiconductors olan Philips Semiconductors şirketi tarafından 1982 yılında geliştirilen bir seri veri iletişim veri yoludur. İlk başta bu markanın televizyonları için birkaç dahili çipi basit bir şekilde iletmek için yaratıldı. Ancak 1990'dan beri I2C yaygınlaştı ve birçok üretici tarafından kullanılıyor.

Şu anda düzinelerce yonga üreticisi tarafından kullanılıyor çoklu işlevler için. Arduino kartları için mikro denetleyicilerin yaratıcısı Atmel, I2C ile aynı olmasına rağmen lisanslama amacıyla TWI (İki Kablolu Arayüz) tanımını tanıttı. Ancak 2006 yılında, orijinal patentin süresi doldu ve artık telif hakkına tabi değil, bu nedenle I2C terimi yeniden kullanıldı (yalnızca logo korunmaya devam ediyor, ancak terimin uygulanması veya kullanımı kısıtlanmadı).

I2C veri yolu teknik detayları

I2C otobüsü

El I2C veriyolu bir endüstri standardı haline geldi ve Arduino bunu uyguladı ihtiyaç duyan çevre birimleriyle iletişim için. Çalışması için, biri saat sinyali (CLK) ve diğeri seri veri (SDA) göndermek için olmak üzere yalnızca iki hatta veya kabloya ihtiyaç duyar. Bu, SPI veriyoluna kıyasla diğer iletişimlere kıyasla avantajlıdır, ancak gerekli ek devre nedeniyle çalışması biraz daha karmaşıktır.

Bu otobüste ona bağlı her cihazın bir adresi vardır bu cihazlara ayrı ayrı erişmek için kullanılır. Bu adres, donanım tarafından sabitlenir, son 3 biti atlama telleri veya anahtar DIP'ler aracılığıyla değiştirir, ancak yazılımla da yapılabilir. Her cihazın benzersiz bir adresi olacaktır, ancak bunlardan birkaçı aynı adrese sahip olabilir ve çakışmaları önlemek veya mümkünse değiştirmek için ikincil bir veri yolu kullanmak gerekebilir.

Ek olarak, I2C veriyolunda bir Master-Slave tipi mimari, yani efendi-köle. Bu, iletişim bir ana cihaz tarafından başlatıldığında, ikincil cihazlardan veri gönderip alabileceği anlamına gelir. Köleler iletişimi başlatamayacak, bunu sadece yönetici yapabilir ve köleler de efendinin müdahalesi olmadan birbirleriyle doğrudan konuşamaz.

Si tienes otobüste birkaç öğretmensadece bir kişi aynı anda öğretmen olarak hareket edebilir. Ancak buna değmez, çünkü öğretmen değişikliği yüksek bir karmaşıklık gerektirir, bu yüzden sık değildir.

Unutmayın ki master, veriyolundaki tüm cihazları senkronize etmek için saat sinyali sağlar. Bu, her kölenin kendi saatine sahip olma ihtiyacını ortadan kaldırır.

I2C veri yolu protokolü ayrıca besleme voltaj hatlarında (Vcc) çekme dirençlerinin kullanımını öngörür, ancak bu dirençler genellikle Arduino ile kullanılmaz. pull-up çünkü programlama kitaplıkları Wire 20-30 k değerinde iç olanları aktive ettiğinden. Bu, bazı projeler için çok yumuşak olabilir, bu nedenle sinyalin yükselen kenarları daha yavaş olacaktır, bu nedenle daha düşük hızlar ve daha kısa iletişim mesafeleri kullanılabilir. Bunu düzeltmek için 1k ila 4k7 arasında harici çekme dirençleri ayarlamanız gerekebilir.

işaret

I2C sinyali

La iletişim çerçevesi bir I2C veriyolu sinyali bitlerden veya durumlardan oluşur (I2C standardı diğerlerine izin verdiği için Arduino'da kullanılanlar):

  • 8 bit, 7 tanesi dirección veri göndermek veya almak için erişmek istediğiniz bağımlı aygıtın 7 bit ile 128 farklı adres oluşturulabilir, böylece teorik olarak 128 cihaza erişilebilir, ancak 112'sı özel kullanımlar için ayrıldığından yalnızca 16'ye erişilebilir. Ve isteyip istemediğinizi gösteren ek bit gönder veya al köle cihaz bilgisi.
  • Orada da bir doğrulama bitiaktif değilse iletişim geçerli olmayacaktır.
  • Sonra veri baytları köleler tarafından göndermek veya almak istediklerini. Bildiğiniz gibi her bayt 8 bitten oluşur. Gönderilen veya alınan her 8 bitlik veya 1 bayt veri için ek 18 bitlik doğrulama, adres vb. Gerektiğine dikkat edin, bu da veri yolunun hızının çok sınırlı olduğu anlamına gelir.
  • Son bir parça onaylama iletişimin.

Ek olarak, saat frekansı yayınlar standart olarak 100 Mhz'dir, 400 Mhz'de daha hızlı bir mod olmasına rağmen.

I2C veriyolunun avantajları ve dezavantajları

W avantaj ses:

  • basitlik sadece iki satır kullanarak.
  • Var sinyalin gelip gelmediğini bilmek için mekanizmalar diğer iletişim protokollerine kıyasla.

W dezavantajları ses:

  • Hızlandırmak oldukça düşük iletim.
  • Tam bir dubleks değilyani aynı anda gönderip alamazsınız.
  • Eşlik kullanmaz ya da alınan veri bitlerinin doğru olup olmadığını bilmek için herhangi başka bir doğrulama mekanizması.

Arduino üzerinde I2C

Arduino I2C veriyolu

En Arduino, modele bağlı olarak, bu I2C veriyolunu kullanmak için etkinleştirilebilen pimler değişiklik gösterir. Örneğin:

  • Arduino UNO, Nano, Mini Profesyonel: SDA (veri) için A4 ve SCK (saat) için A5 kullanılır.
  • arduino Mega: SDA için pin 20 ve SCK için 21.

Unutmayın, onu kullanmak için yapmanız gerekir kütüphaneden yararlanmak tel.h Arduino IDE kodlarınız için I2C y i2cdevlib. Nasıl programlanacağına dair kodlar elde etmek için bu kütüphanelerin belgelerini veya ilginizi çeken projeler hakkındaki makalelerimizi okuyabilirsiniz.

I2C ile kullanmak için bir cihazın adresini nasıl öğrenebilirim?

Son bir uyarı: Avrupalı, Japon veya Amerikalı üreticilerden IC satın aldığınızda, yönü göster cihaz için kullanmanız gerekir. Öte yandan, Çinliler bazen detay vermiyor ya da doğru değil, bu yüzden işe yaramayacak. Eskizinizde hangi yöne başvurmanız gerektiğini bilmek için bir adres tarayıcısı ile kolayca çözülebilir.

La arduino topluluğu bunu yarattı adresi taramak ve tanımlamak için kod Basit bir şekilde. Size kodu burada göstermeme rağmen:

#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);
}


İlk yorumu siz

Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.