Gömülü Linux Konferansı'nda verdiğim bu öğretici, soruları cevaplamaya, ele alınan konuların daha ayrıntılı açıklamasına bağlantılar sağlayarak ve bir Arduino Mini Pro'nun köle gibi davrandığı ve 4 bağımsız tekerleği kontrol ettiği 4WD drone kullanmanın pratik örneğini kullanarak çalışıyor. . Orijinal belgeyi burada bulabilirsiniz .
Not: Bağlantıdan vurguları uyarladığım için bu cevap şu anda devam ediyor.
I2C veriyolunun tipik uygulamaları
- Nispeten yavaş çevre birimleri ile arayüz oluşturma. Örn: sensörler, mekanik aktüatörler.
Veri alışverişi için diğer kanalları kullanan “hızlı” çevre birimlerini denetleme. Örn: kodekler.
Bir PC'de, İşletim Sistemi genellikle I2C üzerinden aşağıdakilerle etkileşime girer:
- sıcaklık ve akü voltaj metre;
- fan hızı kontrolörleri;
- ses kodekleri.
Birden fazla veri yolu denetleyicisinin bulunması durumunda, çevre birimleri hıza göre gruplandırılır, böylece hızlı olanlar daha yavaş olanlarla cezalandırılmaz.
I2C veriyoluna hızlı bir giriş - temel özellikler
- Seri veri yolu.
- Sadece 2 satır: Seri CLock ve Seri DAta (artı toprak).
- 4 hız: 100kHz, 400kHz, 1MHz, 3.2MHz.
- Tipik olarak 1 ana cihaz ve 1 veya daha fazla slave.
- İletişim her zaman bir ana cihaz tarafından başlatılır.
- Birden fazla master aynı veriyolunda (çoklu-master) birlikte bulunabilir.
- Açık Tahliye: Hem SDA hem de SCL'nin çekme dirençlerine ihtiyacı vardır.
- “Saat Esnetme”
- Master SCL'yi kontrol eder, ancak hızı ayarlaması gerekiyorsa bir köle onu (açık drenaj nedeniyle) tutabilir.
- Kaptan bu senaryoyu kontrol etmelidir.
- Bir köle takılabilir ve otobüsü sıkıştırabilir: master'dan slave'e sıfırlama hatları gerekir.
- Genellikle 7 bit adresleme, aynı zamanda 10 bit desteklenir.
- Mantıksal protokol: gerçek voltaj seviyeleri belirtilmemiştir ve bireysel uygulamalara bağlıdır. Örn: 1.8V / 3.3V / 5.0V
Referans URL'ler:
Veri Yolu Yapılandırması Örneği
Protokolün özellikleri (basitleştirilmiş)
- 2 mesaj tipi: okuma ve yazma
- Başlat / Durdur biti - yanıtın geri kalanında “[“ ve “]” olarak temsil edilir
- Adres: 7 veya 10 bit
- R / W biti: R = 1 / W = 0 Gönderilen mesaj türünü ayırt etmek için kullanılır.
- Veriyolundaki veriler: (Adres << 1 | R / W)
- Seçilen cihazda bilgi işleyici olarak kaydeder.
Otobüs trafiği örneği
Özel Köleler
Neden özel bir I2C slave oluşturmalıyım?
- I2C arayüzü ile istenen sensör / aktüatör kullanılamıyor.
- İhtiyaç duyulan kölelerden daha az benzersiz adres mevcut.
- Slave üzerinde istenen özel işlevler:
- Uyaranlara yarı otonom reaksiyonlar.
- Giriş verilerinin filtrelenmesi / önişlenmesi.
- Güç optimizasyonu: özel “sensör hub'ı” ana işlemci boştayken oda temizliğini yapar.
- Girişlere gerçek zamanlı yanıt.
- [burada hayal gücünüz]
Özel bir I2C slave nasıl tasarlanır?
- Gereksinimleri tanımlayın (önceki slayta bakın).
- Mikrodenetleyici veya mikroişlemci seçin.
- Zamanlayıcı veya İşletim Sistemi'ni (varsa) seçin.
- İletişim alt protokolünü tanımlayın:
- Değiştirilecek parametreleri ve komutları tanımlayın.
- Bunları "kayıtlar" halinde düzenleyin ve ücretsiz bir adres seçin.
I2C Master tasarımı
Anahtar tasarım kriterleri:
- Ağırlık / Boyutlar.
- Gerekli hesaplama gücü ve ortalama gecikme süresi.
- PC benzeri cihaz
- Gömülü cihaz, genellikle başsız.
- Tercih edilen programlama dili: yorumlanmış ve derlenmiş.
- Slave (ler) i sürmek için otobüs / gpios bulunması:
- Yalnızca GPIO'lar: protokolü bitbang
- I2C: kullanıcı alanı uygulaması vs çekirdek sürücüsü.
- GPIO / I2C arabirimi yok: USB - I2C adaptörü.
Hata ayıklama: Böl ve Fethet
Geçici bir cihazla otobüsün doğrudan kontrolünü elinize alın. Örnekler:
BUS Korsan
- Öncelikle geliştirme amaçlı.
- Hem otobüsü koklayabilir ve sürebilir.
- Makrolar dahil seri (ttyACM) bağlantı noktası üzerinden konsol arayüzü veya çeşitli programlama dilleri için programlı erişim.
- Dahili çekme dirençleri ve voltaj kaynakları (5V / 3.3V)
- Diğer birçok protokolü destekler.
- Kaynaklar: Wikipedia , ana sayfa
USB - I2C Adaptörü
- Küçük ayak izi.
- Kalıcı kurulumlar için uygundur.
- Ana bilgisayarda özel bağlantılara gerek yok: tipik bir PC ile arayüz oluşturmak için kullanılabilir.
- SPI özellikli varyant da mevcuttur.
- Konsol arayüzü yok, sadece seri ikili protokol.
- Protokol sarmalayıcı gerektirir .
- Referans: protokol
sigrok ve pulseview
sigrok (fırın bileşeni) logosu
pulseview (görüntüleyici) örneği
Düşük uç mantık Analizörü örneği
- Linux üzerinde PC tabanlı ölçümler için fiili standart (ancak diğer işletim sistemlerinde de mevcuttur).
- Çok çeşitli mantık analizörleri, kapsamları ve sayaçları için destek.
- I2C dahil olmak üzere çeşitli protokol kod çözücüleri.
- Mantıksal sinyalleri görselleştirmek ve protokol hatalarını ayıklamak için kullanışlıdır.
- Çok düşük uçlu olsa bile, ucuz HW hata ayıklamaya tamamen yeni bir boyut sağlayabilir.
- Referanslar: sigrok , pulseview , desteklenen donanım
Örnek: 4WD drone'yu yönlendirmek
Prototip 2 Arduino Mini Pro kullanılarak üretilmiştir.
Köle örnekte ne yapıyor?
I2C köle:
- Her tekerleğe uygulanan tork miktarını kontrol eder.
- Her tekerleğin dönme yönünü kontrol eder.
- Her bir tekerleğin dönüş hızını bir optik kodlayıcı (Kilometre Sayacı) ile ölçer.
- Yukarıdaki parametreleri I2C Master'a gösterir.
I2C Slave'in yüksek seviye blok şeması.
- Her tekerlek için yeterli pim / fonksiyon:
- Görev döngüsünün bağımsız konfigürasyonu ile 1 PWM çıkışı.
- Kilometre sayacı girişini IRQ olarak kaydetmek için 1 GPIO.
- Seçmek için 2 GPIO:
- ileri
- Tersine çevirmek
- Boşta
- Kilit
- Kesmeye bağlı i2c değişimleri için I2C HW bloğu.
- SPI tabanlı programlama için özel pinler.
- Küçük ayak izi.
- Düşük maliyetli.
- Resimde gösterilen klonun kart düzeni, bir DIL soketine monte etmek için optimize edilmiştir.
İşletim Sistemini Seçme: ChibiOS
- RTOS: önleme, görevler, semaforlar, dinamik sistem tic, vb.
- Küçük kaplama alanı: yalnızca kullanılan kod / veri bağlantısı.
- HAL ile RTOS ve BSP arasındaki fark.
- Ticari olmayan kullanım için GPLv3.
- Aktif olarak gelişti, ancak zaten olgun.
- 8bit AVR'yi destekler.
Bununla birlikte, AVR için sınırlı BSP desteği vardı, eksikliği: - AVR GPIO'lar için sürücüyü keser (eklendi). - AVR bağımlı mod için I2C desteği (özel). Hangi AVR için Drone SW bir parçası olarak ayrı ayrı geliştirilmesi gerekiyordu .
İletişim Parametrelerini Tanımlama
Her tekerlek için:
Sürmek için kullanılan PWM sinyalinin Görev Döngüsü - 1 bayt. 0xFF = maksimum tork / 0x00 = tork yok.
Yön dönme - 1 bayt.
- 0x00 = boşta
- 0x01 = ters
- 0x02 = ileri
- 0x03 = kilitli
Optik kodlayıcının yuvaları arasındaki ortalama süre - 2 bayt.
- Bir şey yazmak, ölçümü sıfırlar.
Parametre Dizini - 1 adet
- 0 = Görev Döngüsü
- 1 = Yön
- 2 = Ortalama Dönem
Tekerlek endeksleri - 1 kemirmek:
- 0 = Sol Arka
- 1 = Sağ Arka
- 2 = Sağ Ön
- 3 = Sol Ön
- 4 = Tümü
Alt Protokol: Kayıtları Tanımlama
Kayıt formatı: 0xαβ
- α = Parametre Dizini - β = Tekerlek Dizini
Adres (isteğe bağlı olarak seçilir): 0x10
Bus Pirate biçimi:
- [= başlangıç biti -] = bitiş biti - r = okuma baytı - adres süreleri 2 (sol kaydırma 1), R / W bit için
Örnek - Bus Pirate Formatında
[i2c_addr reg_addr = (parm, tekerlek) reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
Araba saat yönünde döner.