LINUX.ORG.RU

i2c-tools и десятибитные адреса

 , , , ,


0

3

Утилиты из i2c-tools поддерживают только стандартные 7-битные адреса или ещё и расширенные 10-битные?

В коде i2ctransfer находится такой комментарий:

/* We skip 10-bit support for now. If we want it,
 * it should be marked with a 't' flag before
 * the address here.
 */

В документации ядра тоже сказано, что поддержки нет:

* Many user-space packages (for example i2c-tools) lack support for
  10-bit addresses.

Но в этой статье описаны какие-то манипуляции с i2c-tools, читать и писать 10-битные адреса (i2c-tools, похоже, не патченый). Но я так и не могу понять, как мне прочитать два байта с условного устройства 0x30 по адресу 0x5010. Судя по описанию формата адреса, его нужно сформировать определённым образом, но в статье на вики ST всё как-то очень просто. Помогите, пожалуйста, мне тупому составить правильную команду!

★★★★★

Судя по

устройства 0x30 по адресу 0x5010

Адрес самого устройства 7-битный, а вот адреса его регистров 16-битные. В то время как поддержка 10-битного адреса - это именно адреса устройства, не регистров внутри него.

Что именно за устройство?

apt_install_lrzsz ()
Ответ на: комментарий от CYB3R

Если память мне не изменяет, для чтения нужно делать так:

Пишешь адрес регистра

i2ctransfer -f -y 0 w4@0x30 0x50 0x10

устройство его запоминает.

Потом выполняешь уже просто транзакцию чтения.

apt_install_lrzsz ()
Ответ на: комментарий от CYB3R

Сначала сделать запись адреса, а потом чтение данных, одной коммандой. Программа вставит рестарт и сделает чтение.

Пример из мануала:

i2ctransfer 0 w1@0x50 0x64 r8
Puzan ★★★★★ ()
Последнее исправление: Puzan (всего исправлений: 1)
Ответ на: комментарий от CYB3R

В итоге будет что-то вроде:

i2ctransfer -f -y 0 w2@0x30 0x50 0x10     <-- Тут пишем двухбайтовый адрес регистра в устройство.
i2ctransfer -f -y 0 r2@0x30               <-- А вот тут утилита должна прочитать два байта значения из этого самого регистра.

Это если значения регистров тоже двухбайтовые. Если однобайтовые, то указываешь 1 после r:

i2ctransfer -f -y 0 r1@0x30

Сам я проверить точно не могу - нет под рукой устройства с 16-битными адресами. Но ранее делал это так.

apt_install_lrzsz ()
Ответ на: комментарий от Puzan

Ну или как правильно предлагает выше @Puzan с примером из man’а:

i2ctransfer -f -y 0 w2@0x30 0x50 0x10 r2

Также, как не менее правильно советует анонимный участник, глянь datasheet на устройство это. В них как правило достаточно подробно расписаны структуры транзакций для I2C-устройств.

apt_install_lrzsz ()