Я не знаю интерфейс к вашему чипу.Существует множество возможных способов использования I2C.Но есть очень распространенный способ доступа к устройству с 8-битными регистрами, поэтому давайте предположим, что это то, что вам нужно.
Чтобы прочитать регистр, вы хотите сгенерировать (упрощенную) примитивную последовательность I2C:
Start I2CAddr+Write RegAddr Start I2CAddr+Read [DATA] Stop
Но то, что вы делаете, это:
Start I2CAddr+Write RegAddr Stop
Start I2CAddr+Read [DATA] Stop
По сути, вам нужно, чтобы операция чтения в регистре была одной транзакцией с одним остановом в конце и повторным началом между записьюрежим и режим чтения.Но вы отправляете две транзакции.
Вам не следует использовать интерфейс read()
/ write()
для i2c-dev.Этот интерфейс очень прост и не подходит для большинства транзакций I2C.Вместо этого используйте интерфейс ioctl()
и I2C_RDWR
.Это позволяет генерировать соответствующие транзакции.
Поскольку некоторые формы транзакций очень распространены, включая те, которые вам, скорее всего, нужны, есть библиотека, в которой они уже закодированы.Используйте i2c_smbus_read_byte_data()
и i2c_smbus_write_byte_data()
из библиотеки в i2c-tools .
Что касается тестовых программ, то есть i2cget
и i2cset
, часть вышеупомянутого i2c-инструменты, которые смогут делать то, что вы хотите.