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 cmd
parameter? 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
cmd
parameternya ... 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 ...vals
,cmd
wajib.Jawaban:
I²C
protokolnya 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 dalamPython
bahasa, API yang digunakan di sini sebenarnya sangat dekat pemetaanC
API asli di mana Anda tidak dapat dengan mudah membuat argumen opsional.sumber
Saat Anda mengeluarkan blok tulis / baca dari Pi dengan:
atau
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
atau
pertama kali menulis
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,
fungsi disebut karena
cmd
itu ditulis ke bus oleh Pi.cmd
akan 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.
sumber
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.
sumber