Ý nghĩa của cmd param trong write_i2c_block_data


12

Tôi đang thử nghiệm giao tiếp i2c giữa Pi và Arduino.

Tài liệu nói:

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

Tôi có bài kiểm tra này:

Trên Pi:

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

Trên Arduino:

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

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

Trên Arduino tôi thấy đầu ra này:

byte count=4
0123

Câu hỏi của tôi là: việc sử dụng cmdtham số là gì? Tôi không thấy sự khác biệt trên Arduino trong đó byte đại diện cho cái gì.
Tôi đoán tôi có thể đối phó với nó như là một sự phù hợp. Có lẽ tôi muốn sử dụng 2 byte đầu tiên làm lệnh.

Trang này không có nhiều thông tin về phương pháp: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc


Bạn có thể muốn xác định cmdtham số là gì ... Tôi đã phải làm một chút công bằng để tìm hiểu ý của bạn. Tôi đã không tìm thấy câu trả lời mặc dù ... Nó chỉ có thể được sử dụng bởi các chip cụ thể như thiết bị mở rộng GPIO hoặc thứ gì đó ...
Butters

Ok, tôi đã thêm liên kết đến tài liệu (không nhiều)
Gus Smith

6
Tôi không có thời gian để đưa ra câu trả lời đầy đủ ngay bây giờ (tôi hy vọng ai đó sẽ làm được) nhưng tóm lại - đây là cách I²C hoạt động. Master chỉ có thể gửi cho nó một số byte dữ liệu (sau khi gửi địa chỉ thích hợp) và không có thông số kỹ thuật nào về những byte đó thực sự là gì (ý nghĩa của chúng được xác định trên mỗi thiết bị). Nó chỉ xảy ra rằng byte đầu tiên thường là một số lệnh (hoặc thanh ghi). Ngoài ra, bạn luôn phải gửi ít nhất một byte để không giống như vậy vals, cmdlà bắt buộc.
Krzysztof Adamski

1
@KrzysztofAdamski Nghe có vẻ như là một câu trả lời khá đầy đủ với tôi.
Butters

Câu trả lời:


8

I²Cgiao thức rất đơn giản. Nó không thực sự xác định cấu trúc dữ liệu được gửi qua dây. Khung bao gồm một địa chỉ nô lệ (có bit hướng cho biết nếu chủ muốn đọc hoặc ghi) và (trong trường hợp viết) một số byte dữ liệu. Vì không có nghĩa là bắt đầu ghi với 0 byte dữ liệu, byte đầu tiên là bắt buộc.

Byte đầu tiên này thường được sử dụng làm địa chỉ thanh ghi nô lệ hoặc số lệnh nhưng nó không phải. Có thể có hoặc không có byte bổ sung sau cái đầu tiên. Giao thức cấp cao hơn xác định ý nghĩa của từng byte là cụ thể của thiết bị.

Điều này có thể giải thích tại sao có hai đối số riêng biệt - thứ nhất ( cmd) là bắt buộc và thứ hai ( vals) là tùy chọn. Mặc dù ví dụ của bạn là Pythonngôn ngữ, API được sử dụng ở đây thực tế là ánh xạ rất gần với CAPI gốc nơi bạn không thể dễ dàng tạo các đối số tùy chọn.


Đây là một lời giải thích dài hơn về những gì tôi đã viết trong bình luận dưới câu hỏi.
Krzysztof Adamski

Tôi rất vui vì bạn đã làm! Những loại đơn giản, nhưng "aha!" giải thích thực sự hữu ích một số lần, như ngày hôm nay :-)
uhoh

3

Khi bạn phát hành một khối ghi / đọc từ Pi với:

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

hoặc là

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

Hai điều xảy ra (có thể) trên Arduino tùy thuộc vào đọc hoặc viết.

Byte cmd là byte đầu tiên được ghi vào bus I2C từ Pi, nó luôn được gửi dưới dạng yêu cầu "ghi". Điều này có nghĩa là nếu Pi đang ban hành một

bus.read_i2c_block_data

hoặc là

bus.write_i2c_block_data

lần đầu tiên nó viết

cmd

đến bus I2C trước khiđọc .

Đây là một tính năng hữu ích vì một số phần cứng I2C yêu cầu khởi tạo trước khi có thể đọc.

Trên Arduino, điều này có nghĩa là:

Đầu tiên,

Wire.onReceive(yourCallback)

Hàm được gọi bởi vì cmdđược ghi vào xe buýt bởi Pi. cmdsẽ là byte đầu tiên có sẵn trên xe buýt. Nếu Pi gửi yêu cầu ghi hơn Arduino sẽ ở lại trong cuộc gọi lại Wire.onReceive cho đến khi chức năng hoàn tất. Nếu Pi gửi yêu cầu đọc, Arduino sẽ hoàn thành Wire.onReceive sau đó gọi lại cuộc gọi lại Wire.onRequest.

Bạn phải đảm bảo rằng giá trị được đặt trong cmd không gây ra hành vi ngoài ý muốn trong hệ thống của bạn bằng cách xử lý thích hợp giá trị của nó. Ví dụ: nếu cuộc gọi lại Wire.onReceive của bạn tắt một đèn LED khi Wire.read = 0x30. Sau đó, ngay cả khi bạn đã gửi một yêu cầu đọc , đầu tiên nó sẽ TẮT đèn LED bằng cách viết 0x30 sau đó nó sẽ đọc các byte được yêu cầu từ xe buýt.


1

Tôi đang viết thư cho màn hình LCD I2C, Newhaven NHD ‐ 0216K3Z FL GBW V3. Bảng thông số kỹ thuật của nó có thể được googled. Trong trường hợp của nó, khi byte lệnh là 0xfe, điều đó có nghĩa là byte sau là một lệnh - có khoảng 20 trong số chúng. Xóa, đèn nền, con trỏ nhấp nháy và như vậy. Nếu cmd không phải là 0xfe, nó chỉ là một số ký tự để hiển thị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.