Arti dari cmd param di write_i2c_block_data

12

Saya menguji komunikasi i2c antara Pi dan Arduino.

Doc mengatakan:

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

Saya memiliki tes ini:

Pada Pi:

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

Di Arduino:

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

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

Di Arduino saya melihat output ini:

byte count=4
0123

Pertanyaan saya adalah: apa gunanya cmdparameter? Saya tidak melihat perbedaan pada Arduino yang byte mewakili apa.
Saya kira saya bisa mengatasinya sesuai keinginan. Mungkin saya ingin menggunakan 2 byte pertama sebagai perintah.

Halaman ini tidak memiliki banyak informasi tentang metode ini: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc

Gus Smith
sumber
Anda mungkin ingin mendefinisikan apa cmdparameternya ... Saya harus melakukan sedikit mencari tahu apa yang Anda maksud. Namun saya tidak menemukan jawaban ... Itu hanya dapat digunakan oleh chip tertentu seperti GPIO expander atau semacamnya ...
Butters
Oke, saya menambahkan tautan ke dokumentasi (yang tidak banyak)
Gus Smith
6
Saya tidak punya waktu untuk membuat jawaban lengkap sekarang (saya harap seseorang akan) tetapi singkatnya - ini adalah cara kerja I²C. Master dapat mengirimkan beberapa byte data (setelah mengirim alamat yang tepat) dan tidak ada spesifikasi tentang apa byte itu sebenarnya (artinya ditentukan per perangkat). Kebetulan byte pertama sering nomor perintah (atau daftar). Juga Anda selalu harus mengirim setidaknya satu byte jadi tidak seperti itu vals, cmdwajib.
Krzysztof Adamski
1
@ KrzysztofAdamski Kedengarannya seperti jawaban yang cukup lengkap untuk saya.
Butters

Jawaban:

8

I²Cprotokolnya sangat sederhana. Itu tidak benar-benar menentukan struktur data yang dikirim melalui kabel. Bingkai terdiri dari alamat slave (dengan bit arah yang menunjukkan apakah master ingin membaca atau menulis) dan (dalam hal penulisan) beberapa byte data. Karena tidak masuk akal untuk memulai menulis dengan 0 byte data, byte pertama adalah wajib.

Byte pertama ini sering digunakan sebagai alamat register slave atau nomor perintah tetapi tidak harus. Mungkin ada atau tidak ada byte tambahan setelah yang pertama. Protokol level yang lebih tinggi yang mendefinisikan apa artinya setiap byte spesifik perangkat.

Ini dapat menjelaskan mengapa ada dua argumen terpisah - pertama ( cmd) wajib dan yang kedua ( vals) adalah opsional. Sementara contoh Anda dalam Pythonbahasa, API yang digunakan di sini sebenarnya sangat dekat pemetaan CAPI asli di mana Anda tidak dapat dengan mudah membuat argumen opsional.

Krzysztof Adamski
sumber
Ini adalah penjelasan yang sedikit lebih panjang tentang apa yang saya tulis dalam komentar di bawah pertanyaan.
Krzysztof Adamski
Saya senang Anda melakukannya! Semacam ini sederhana, namun "aha!" Penjelasannya sangat membantu beberapa kali, seperti hari ini :-)
uhoh
3

Saat Anda mengeluarkan blok tulis / baca dari Pi dengan:

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

atau

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

Dua hal terjadi (dapat) pada Arduino tergantung pada membaca atau menulis.

Byte cmd adalah byte pertama yang ditulis ke bus I2C dari Pi, selalu dikirim sebagai permintaan "tulis". Ini berarti bahwa jika Pi mengeluarkan a

bus.read_i2c_block_data

atau

bus.write_i2c_block_data

pertama kali menulis

cmd

dengan bus I2C sebelum itu berbunyi .

Ini adalah fitur yang berguna karena beberapa perangkat keras I2C memerlukan inisialisasi sebelum pembacaan dapat dilakukan.

Pada Arduino ini berarti bahwa:

Pertama,

Wire.onReceive(yourCallback)

fungsi disebut karena cmditu ditulis ke bus oleh Pi. cmdakan menjadi byte pertama yang tersedia di bus. Jika Pi mengirim permintaan tulis, Arduino akan tetap berada di callback Wire.onReceive hingga fungsinya selesai. Jika Pi mengirim permintaan baca, Arduino akan menyelesaikan Wire.onReceive kemudian memanggil callback Wire.onRequest.

Anda harus memastikan bahwa nilai yang ditempatkan di cmd tidak menyebabkan perilaku yang tidak diinginkan dalam sistem Anda dengan menangani nilainya dengan tepat. Jika misalnya, panggilan balik Wire.onReceive Anda mematikan LED saat Wire.read = 0x30. Kemudian bahkan jika Anda mengirim permintaan baca , pertama-tama akan mematikan LED dengan menulis 0x30 maka itu akan membaca byte yang diminta dari bus.

deltatango
sumber
1

Saya menulis ke LCD I2C, Newhaven NHD ‐ 0216K3Z ‑ FL ‑ GBW ‐ V3. Lembar specnya bisa di-google-kan. Dalam kasusnya, ketika byte perintah adalah 0xfe itu berarti byte berikut adalah sebuah perintah - ada sekitar 20 di antaranya. Jelas, lampu latar, kursor berkedip, dan sebagainya. Jika cmd bukan 0xfe itu hanya beberapa karakter untuk ditampilkan.

kereta luncur anjing
sumber