Cmd param'ın write_i2c_block_data içindeki anlamı


12

Pi ve Arduino arasındaki i2c iletişimini test ediyorum.

Doktor diyor ki:

write_i2c_block_data(addr,cmd,vals)  Block Write transaction.    int addr,char cmd,long[]    None

Bu test var:

Pi'de:

import smbus
bus = smbus.SMBus(0)
bus.write_i2c_block_data(address, 48, [49, 50, 51] )

Arduino'da:

void receiveData(int byteCount){
    Serial.print("byte count=");
    Serial.println(byteCount);

    while(Wire.available()) {
        number = Wire.read();
        Serial.print((char)number);
     }
}

Arduino'da şu çıktıyı görüyorum:

byte count=4
0123

Sorum şu: cmdparametrenin kullanımı nedir? Arduino'da baytının neyi temsil ettiği konusunda bir ayrım görmüyorum.
Sanırım bir uyum uygun olarak başa çıkabilirim. Belki de ilk 2 baytı komut olarak kullanmak istiyorum.

Bu sayfada yöntem hakkında fazla bilgi yok: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc


cmdParametrenin ne olduğunu tanımlamak isteyebilirsiniz ... Ne demek istediğini anlamaya çalışmak için birazcık yapmak zorunda kaldım. Yine de bir cevap bulamadım ... Sadece GPIO genişletici ya da başka bir şey gibi belirli yongalar tarafından kullanılabilir ...
Butters

Tamam, (fazla değil) belgelere bağlantı ekledi
Gus Smith

6
Şu anda tam bir cevap vermek için zamanım yok (umarım birisi yapar) ama kısaca - I²C böyle çalışır. Master sadece bazı bayt veri gönderebilir (uygun adres gönderdikten sonra) ve bu baytların gerçekte ne olduğuna dair bir spesifikasyon yoktur (anlamları cihaz başına tanımlanır). İlk bayt genellikle bir komut (veya kayıt) numarasıdır. Ayrıca her zaman en az bir bayt göndermek zorundasınız, aksine vals, cmdzorunludur.
Krzysztof Adamski

1
@KrzysztofAdamski Bana tam bir cevap gibi geliyor.
Butters

Yanıtlar:


9

I²Cprotokol çok basit. Tel üzerinden gönderilen veri yapılarını gerçekten tanımlamaz. Çerçeve bir ikincil adres (master'ın okumak veya yazmak isteyip istemediğini gösteren yön biti ile) ve (yazma durumunda) bazı bayt veriyi içerir. Yazmayı 0 bayt veri ile başlatmak mantıklı olmadığından, ilk bayt zorunludur.

Bu ilk bayt genellikle bir bağımlı kayıt adresi veya komut numarası olarak kullanılır, ancak zorunlu değildir. Birincisinden sonra ilave bayt olabilir veya olmayabilir. Her baytın ne anlama geldiğini tanımlayan daha yüksek seviye protokol cihaza özeldir.

Bu neden iki ayrı argüman olduğunu açıklayabilir - birincisi ( cmd) zorunlu, ikincisi ( vals) isteğe bağlıdır. Örneğiniz Pythondilde olsa da, burada kullanılan API aslında Cisteğe bağlı bağımsız değişkenler oluşturamayacağınız orijinal API'nin çok yakın eşlemesidir .


Bu, soru altındaki yorumda yazdıklarımın biraz daha uzun bir açıklaması.
Krzysztof Adamski

Yaptığınıza memnun oldum! Bu tür basit ama yine de "aha!" açıklamalar bugün gibi bazı zamanlar gerçekten yararlı :-)
uhoh

3

Pi'den bir blok yazma / okuma komutunu verdiğinizde:

bus.write_i2c_block_data(address, 48, [49, 50, 51] )

veya

bus.read_i2c_block_data(address, 48, [49, 50, 51] )

Arduino'da okuma ya da yazmaya bağlı olarak iki şey olabilir (olabilir).

Cmd baytı, Pi'den I2C otobüsüne yazılan ilk bayttır, her zaman bir "yazma" isteği olarak gönderilir. Bu, Pi'nin

bus.read_i2c_block_data

veya

bus.write_i2c_block_data

ilk önce yazar

cmd

I2C otobüs önce onu okur .

Bu, kullanışlı bir özelliktir, çünkü bazı I2C donanımları bir okuma yapılmadan önce başlatılmasını gerektirir.

Arduino'da bu şu anlama gelir:

İlk önce,

Wire.onReceive(yourCallback)

Çünkü fonksiyon denir cmdedildi yazılı Pi tarafından otobüs. cmdOtobüsteki ilk bayt olacak. Pi Arduino'dan daha fazla yazma isteği gönderirse, fonksiyon tamamlanana kadar Wire.onReceive geri çağrısında kalacaktır. Pi bir okuma isteği gönderirse, Arduino Wire.onReceive işlemini tamamlar ve Wire.onRequest geri aramasını çağırır.

Cmd'ye yerleştirilen değerin, değerini uygun şekilde işleyerek sisteminizde istenmeyen davranışlara neden olmadığından emin olmalısınız. Örneğin, Wire.read = 0x30 olduğunda Wire.onReceive geri aramanız bir LED'i kapatır. Daha sonra bir okuma isteği göndermiş olsanız bile , önce 0x30 yazarak LED'i kapatır, sonra veri yolundan istenen baytları okurdu.


1

I2C LCD'ye, Newhaven NHD ‐ 0216K3Z ‐ FL ‐ GBW ‐ V3'e yazıyorum. Teknik özellik belgesi googled edilebilir. Bu durumda, komut baytı 0xfe olduğunda, şu baytın bir komut olduğu anlamına gelir - yaklaşık 20 tane vardır. Açık, arka ışık, yanıp sönen imleç vb. Cmd 0xfe değilse, görüntülenmesi gereken bir karakterdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.