Рубрики
Raspberry Pi

i2c

Команда i2cdetect

Показать доступные адаптеры 
i2cdetect -l 
i2c-0   i2c             2180000.i2c                             I2C adapter
i2c-1   i2c             21b0000.i2c                             I2C adapter



Вывод команды i2cdetect -y 0

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- 18 19 -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: 30 -- -- -- -- 35 -- -- 38 -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- 51 -- -- UU UU -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

--: Указывает, что по этому адресу на I2C-шине не было обнаружено устройства.
UU: Указывает, что устройство по этому адресу используется ядром (или драйвером) и недоступно для работы через i2c-tools
число (например, 18, 19, 30): Указывает на обнаруженное устройство по этому адресу.

Здесь показаны устройства, обнаруженные на шине 0 I2C. 
Они находятся по следующим адресам:
0x18
0x19
0x30
0x35
0x38
0x51

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



Проверьте загруженные модули ядра:
Используйте команду lsmod, чтобы увидеть, какие модули ядра загружены, и попробуйте найти тот, который использует адреса 0x54 и 0x55.

Выключите соответствующие модули:
Если возможно, выгрузите модули ядра, которые используют эти устройства. 

Например:
rmmod имя_модуля

Вернуть модуль ядра: 
modprobe имя_модуля

Команда i2cset

Команда i2cset используется для записи данных в регистр устройства на I2C-шине.
i2cset -y 0 0x54 0x00 0x12 0x34 0x56 0x78 0x9a i
-y: Отключает интерактивный запрос подтверждения (позволяет выполнять команду без подтверждения).
0: Номер I2C-шины (обычно 0 или 1).
0x54: Адрес I2C-устройства.
0x00: Адрес регистра, в который будут записаны данные.
0x12 0x34 0x56 0x78 0x9a: Данные, которые будут записаны в регистр.
i: Указывает, что данные должны быть записаны как последовательность байтов (I2C block write).

Команда i2cget

Команда i2cget используется для чтения данных из регистра устройства на I2C-шине.

i2cget -y 0 0x54 0x00 i 5
-y: Отключает интерактивный запрос подтверждения.
0: Номер I2C-шины.
0x54: Адрес I2C-устройства.
0x00: Адрес регистра, из которого будут прочитаны данные.
i: Указывает, что чтение будет выполнено как последовательность байтов (I2C block read).
5: Количество байтов для чтения.

Стирание данных

i2cset -y 0 0x54 0x00 0x00 0x00 0x00 0x00 0x00 i
i2cset -y 0 0x54 0x05 0x00 0x00 0x00 0x00 0x00 i


Стирание большого объёма данных баш скрипт
-------------------------------
#!/bin/bash

DEVICE_ADDRESS=0x54
START_REGISTER=0x00
BLOCK_SIZE=16  # размер блока данных для стирания за раз

# Цикл для записи нулей по всем регистрам
for ((i=0; i<256; i+=BLOCK_SIZE)); do
  i2cset -y 0 $DEVICE_ADDRESS $((START_REGISTER + i)) $(printf '0x00%.0s' $(seq 1 $BLOCK_SIZE)) i
done
-------------------------------

Частный случай записи в eprom

# выгрузили модуль ядра
 rmmod at24


#конвертация ASCII-кодов
echo -n "bs04" | od -An -t x1
# ASCII-кодов
printf "x62x73x30x34" | echo -e $(cat -)

# пример записи в bs04
#i2cset -y 0 0x54 0x00 0x62 0x73 0x30 0x34 i

#через звездочку удалять не стоит  может будущем аукнутся 
rm /var/lib/nexuscli/access_token
rm /var/lib/nexuscli/device_id
rm /var/lib/nexuscli/refresh_token

#вот так можно прочитать 
i2cget -y 0 0x54 0x00  i 6

#загрузили модуль ядра
modprobe at24