Утилиты I2C в Linux

Категория Разное | November 09, 2021 02:07

click fraud protection


В среде Linux доступно несколько команд, которые можно использовать для выполнения транзакций i2c на подчиненных устройствах, подключенных к системе. Доступно несколько команд, мы обсудим все команды, доступные на момент написания этой статьи, с несколькими примерами и вариантами использования.

Описание

В наши дни большинство систем Linux оснащены этими командами. Если в какой-либо системе этих команд нет, их можно скомпилировать для самой системы. Компиляция для самой системы может быть выполнена только при наличии возможности компилятора. Если компилятор недоступен, их необходимо скомпилировать. Исходный код этих инструментов является открытым, а этапы компиляции такие же, как и у других инструментов Linux.

Широко используемые команды, доступные в пакете i2c-tools: i2cdetect, i2cdump, i2cget, i2cset, i2ctransfer. Обсудим эти команды подробнее.

i2cdetect

Эта команда используется для обнаружения и перечисления всех шин I2C, доступных и известных Linux.

В системе может быть несколько контроллеров / шин I2C, и все шины могут быть перечислены с помощью команды i2cdetect. Пример использования i2cdetect:

i2cdetect -l

Эта команда дает следующий вывод в одной системе:

[корень]$ i2cdetect -l
i2c-1 i2c 0b234500.i2c-bus адаптер I2C
i2c-2 i2c 0b234580.i2c-bus адаптер I2C
i2c-0 i2c 0b234580.i2c-bus адаптер I2C
i2c-5 i2c 0b234500.i2c-bus адаптер I2C
[корень]$

В выходных данных выше мы видим, что когда мы выполняем эту команду с параметром -l, она выводит список всех шин I2C системы. В выводе мы видим, что доступно 4 шины, известные Linux. 0, 1, 2 и 5 - это номера шин, назначаемые ядром Linux. Это числа, необходимые для других командных операций.

С помощью этой команды также можно запросить дополнительную информацию обо всех подчиненных устройствах, подключенных к конкретной шине. Например, если мы хотим получить подробную информацию о шине № 0, мы можем ввести команду как i2cget -y 0.

Вывод команды в нашей системе:

[корень]$ i2cdetect 0
0123456789 а б в г д е
00: --------------------------
10: --------------------------------
20: --------------------------------
30: 30----------36------------------
40: --------------------------------
50: 50--52--------------------------
60: --------------------------------
70: ----------------
[корень]$

Как видно из журналов выше, на шине 0 находится 4 ведомых устройства. Адрес подчиненного устройства этих подчиненных устройств I2C на шине 0: 0x30, 0x36, 0x50, 0x52. Этот адрес ведомого устройства I2C также необходим для команд i2cget, i2cget, i2cdump.

i2cget

i2cget можно использовать для чтения ведомого устройства I2C. Любой внутренний читаемый адрес можно прочитать с помощью команды i2cget. Пример использования этой команды можно продемонстрировать на примере, скажем, мы хотим прочитать смещение / внутренний адрес как 0x0 ведомого устройства I2C с адресом ведомого устройства (0x50) на шине № 0. Журналы работы с устройства:

[корень]$ i2cget 0 0x50 0
0x23
[корень]$

В выходных журналах. мы видим, что данные по смещению 0 равны 0x23. Аналогичным образом эту команду можно использовать для чтения любого ведомого устройства на любой шине I2C или любого внутреннего адреса ведомого устройства I2C.

i2cset

Команда i2cget может использоваться для записи данных по любому указанному внутреннему адресу ведомого устройства I2C. Адрес внутреннего устройства I2C должен быть доступен для записи. Операция записи I2C может быть защищена на уровне устройства, или любой внутренний адрес может быть доступен только для записи. Со всеми разрешениями на запись команда i2cset может обновить устройство.

Пример использования команды, давайте рассмотрим пример записи значения данных 0x12 в подчиненное устройство RTC с подчиненным адресом 0x68 по смещению 0x2. Продемонстрируем операцию записи в следующей последовательности:

  • Считайте устройство по смещению 0x2
  • Запишите 0x12 со смещением 0x2 ведомого устройства 0x68
  • Считайте устройство по смещению 0x2 и убедитесь, что данные должны быть 0x12.

1.Читать устройство по смещению 0x2.
[корень]$ i2cget 1 0x68 0x2
0x14
[корень]$
2. Запишите 0x12 по смещению 0x2 ведомого устройства 0x68.
[корень]$ i2cset 1 0x68 0x2 0x12
[корень]$
3. Считайте устройство по смещению 0x2 и убедитесь, что данные должны быть 0x12.
[корень]$ i2cget 1 0x68 0x2
0x12
[корень]$

В приведенном выше примере шагов / выходных данных в поле показана операция записи на ведомом устройстве I2C. Аналогичные шаги можно выполнить для записи любых данных на ведомое устройство I2C. Адрес ведомого устройства, данные или номер шины могут быть изменены в соответствии с системой и потребностями.

i2cdump

Команда i2cdump может использоваться для дампа данных с любого ведомого устройства I2C. Единственный ввод, необходимый для выполнения этой команды, - это номер шины I2C, адрес подчиненного устройства. Диапазон адресов также можно указать с помощью команды. Давайте рассмотрим пример чтения байтов со смещения 0x0 до 0xF, то есть первых 16 байтов.

[корень]$ i2cdump 0x0-0xf 1 0x68
Нет размер указан (с использованием доступа к байтовым данным)
0123456789 а б в г д е 0123456789abcdef
00: 582912 06 08 1021 00 00 00 00 00 00 00 18 00 X)???!...
[корень]$

Адрес диапазона не является обязательным, если этот диапазон не указан по умолчанию, он выгружает первые байты 0xFF. то есть 256 байт.

i2ctransfer

Команда i2ctransfer очень полезна и может использоваться для чтения или записи нескольких байтов в одной команде.

i2ctransfer для чтения 14 байт из 0ffset 0x2 команда будет иметь следующий вид:

[корень]$ i2ctransfer 1 w1@0x68 2 r14
0x12 0x06 0x08 0x10 0x21 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x18 0x00
[корень]$

i2ctransfer для записи 2 байтов данных 0x10, 0x16 со смещением 0x1 и 0x2, команда будет иметь следующий вид:

[корень]$ i2ctransfer 1 w3@0x68 1 0x10 0x16
[корень]$
Чтение; чтобы подтвердить записывать данные:
[корень]$ i2ctransfer 1 w1@0x68 1 r2
0x10 0x16
[корень]$

Приведенные выше примеры продемонстрировали использование i2ctransfer с экземпляром. С помощью этого использования можно легко выполнить другие варианты использования. С помощью этой команды можно прочитать любое ведомое устройство и любой внутренний адрес.

Что делать, если ведомое устройство имеет 2-байтовую адресацию?

Есть несколько подчиненных устройств I2C, в частности, устройство EEPROM с двухбайтовой адресацией. Передача I2C обеспечивает более простой способ доступа к устройству в таком сценарии. Если мы хотим получить доступ к этому устройству с помощью i2cget / i2cset, мы должны учитывать двухбайтовую адресацию.

У меня есть устройство EEPROM с двухбайтовой адресацией. Давайте посмотрим на i2cget / i2cset с EEPROM, а затем мы посмотрим на i2ctransfer:

Мы попробуем прочитать байт со смещения 0. Мы попробуем использовать ту же команду, что описана в предыдущем разделе i2cget, то есть команда будет иметь вид: i2cget -y 1 0x50 0

[корень]$ i2cget 1 0x50 0
0xff
[корень]$

Мы видим, что возвращенные данные - 0xff, следовательно, это неверные данные.

Чтобы успешно читать со смещения 0, мы должны сначала записать 2-байтовый адрес с помощью команды i2cset. Это способ чтения данных с устройства с 2-байтной адресацией. Пример использования:

[корень]$ i2cset 1 0x50 0x0 0x0
[корень]$ i2cget 1 0x50
0x45
[корень]$

В команде i2cset мы должны записать 2-байтовый внутренний адрес EEPROM. Два нуля после адреса ведомого устройства 0x50 являются внутренним адресом EEPROM как 0x0000.

После этого, если мы прочитаем данные с помощью i2cget, мы получим правильные данные. В нашем примере мы видим, что это 0x45. Ранее это было 0xFF, что является недопустимыми данными.

i2ctransfer в 2-байтовом устройстве адресации

i2ctransfer может предоставить данные с помощью той же команды. Рассмотрим тот же пример использования, что и для i2cget / i2cset, как указано выше.

[корень]$ i2ctransfer 1 w2@0x50 0x0 0x0 r1
0x45
[корень]$

С помощью этой команды мы можем прочитать данные по смещению 0000. Обратите внимание, что мы должны записать внутренний адрес после разделения на 2 байта.

Другой пример, чтение 16 байтов со смещения 0x0000:

[корень]$ i2ctransfer 1 w2@0x50 0x0 0x0 r16
0x45 0x41 0x3d 0x41 0x41 0x42 0x42 0x43 0x43 0x44 0x44 0x44 0x45 0x45 0x30 0x0a
[корень]$

Еще один пример чтения 4 байтов со смещения 0x0004:

[корень]$ i2ctransfer 1 w2@0x50 0x0 0x4 r4
0x41 0x42 0x42 0x43
[корень]$

Этот пример можно проверить с помощью предыдущей операции чтения, когда мы прочитали 16 байтов со смещения 0000. Теперь мы прочитали подмножество. Если мы сравним результаты этой операции чтения и проверим их с предыдущим, результаты точно совпадают. Следовательно, мы можем сделать вывод, что это чтение прошло успешно.

Заключение

Мы обсудили пакет инструментов I2C в Linux. В этом пакете i2c-tools доступны различные команды. Некоторые особые варианты использования, такие как 2-байтовая адресация, как использовать команды в этих особых сценариях. Мы уже видели много примеров. Мы подтвердили работу всех команд на примере и демонстрациях. I2cset, i2cget, i2cdump, i2cdetect и i2ctransfer - это команды пакета I2C -tools.

instagram stories viewer