Значення параметр cmd у write_i2c_block_data


12

Я тестую i2c-зв’язок між Pi та Arduino.

Доктор каже:

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

У мене є цей тест:

На Пі:

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

На Ардуїно:

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

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

У Arduino я бачу цей вихід:

byte count=4
0123

Моє запитання: яке використання cmdпараметра? Я не бачу різниці на Arduino, який байт являє собою що.
Я думаю, я можу з цим розібратися, як вважаю за потрібне. Можливо, я хочу використовувати перші 2 байти в якості команди.

На цій сторінці не так багато інформації про метод: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc


Ви, можливо, захочете визначити, що це за cmdпараметр ... Мені довелося трохи поглянути, щоб зрозуміти, що ви мали на увазі. Я не знайшов відповіді, хоча це може бути використано лише для конкретних мікросхем, таких як розширювач GPIO або щось подібне ...
Butters

Гаразд, я додав посилання на документацію (що не дуже багато)
Gus Smith

6
Зараз у мене немає часу на повну відповідь (я сподіваюся, що хтось зробить це), але коротше - ось так працює I²C. Майстер може просто надіслати йому кілька байтів даних (після надсилання належної адреси), і немає конкретизації того, якими вони є насправді (їх значення визначається для кожного пристрою). Так буває, що перший байт часто є командним (або реєстровим) номером. Крім того, ви завжди повинні відправити хоча б один байт, на відміну від цього vals, cmdє обов'язковим.
Кшиштоф Адамський

1
@KrzysztofAdamski Це звучить як досить повна відповідь для мене.
Масло

Відповіді:


9

I²Cпротокол дуже простий. Він насправді не визначає структури даних, які надсилаються по дроту. Кадр складається з підлеглої адреси (з бітом напряму, який вказує, чи хоче майстер читати чи писати), і (у випадку запису) деяких байтів даних. Оскільки не має сенсу починати запис з 0 байтів даних, перший байт є обов'язковим.

Цей перший байт часто використовується як адреса реєстраційного пристрою або номер команди, але цього не потрібно. Після першого може бути або не бути додаткових байтів. Протокол вищого рівня, що визначає, що означає кожен байт, залежить від пристрою.

Це може пояснити, чому існують два окремих аргументи - перший ( cmd) є обов'язковим, а другий ( vals) - необов’язковим. Хоча ваш приклад є Pythonмовою, використовуваний тут API - це дуже близьке відображення оригінального CAPI, де ви не можете легко створити необов'язкові аргументи.


Це трохи довше пояснення того, що я написав у коментарі під запитанням.
Кшиштоф Адамський

Я радий, що ти зробив! Ці види простих, але "ага!" пояснення дуже корисні кілька разів, як сьогодні :-)
uhoh

3

Коли ви видаєте блок запису / читання з Pi за допомогою:

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

або

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

На Ардуїно дві речі трапляються (можуть) залежно від читання чи запису.

Байтовий cmd - це перший байт, записаний на шину I2C з Pi, він завжди надсилається як запит "написати". Це означає, що якщо Pi видає a

bus.read_i2c_block_data

або

bus.write_i2c_block_data

воно спочатку пише

cmd

до шини I2C , перш ніж він читає .

Це корисна функція, оскільки деяке обладнання I2C вимагає ініціалізації перед читанням.

Для Arduino це означає, що:

По-перше,

Wire.onReceive(yourCallback)

Функція викликається тому, що cmdбула написана на шину пісом. cmdбуде першим байтом, доступним в автобусі. Якщо Pi надіслав запит на запис, ніж Arduino залишиться у зворотному виклику Wire.onReceive, поки функція не буде завершена. Якщо Pi надіслав запит на читання, Arduino виконає Wire.onReceive, а потім зателефонує зворотній виклик Wire.onRequest.

Ви повинні переконатися, що значення, розміщене в cmd, не викликає ненавмисної поведінки у вашій системі, відповідним чином обробляючи його значення. Наприклад, якщо ваш зворотний дзвінок Wire.onReceive вимикає світлодіод, коли Wire.read = 0x30. Тоді навіть якщо ви надіслали запит на читання , він спочатку вимкне світлодіод, написавши 0x30, після чого він прочитає запитувані байти з шини.


1

Я пишу на РК-дисплей I2C, Newhaven NHD − 0216K3Z − FL ‐ GBW ‐ V3. Його специфікаційний лист може бути гугл. У його випадку, коли байт команди 0xfe це означає, що наступний байт - це команда - їх близько 20. Ясна, підсвічування, блимання курсору тощо. Якщо cmd не 0xfe, це просто деякий символ для відображення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.