Я пытаюсь читать и писать с устройств I2C на встроенном Linux (4.6). Я могу использовать i2cset
, i2cget
и i2cdetect
, чтобы нормально взаимодействовать с моими устройствами. Я также могу использовать echo
и ca
t для чтения / записи из драйвера устройства (i2c-ocores
).
Однако любой код, который я создаю, который пытается сделать это с помощью вызовов write()
и read()
, всегда терпит неудачу с "Тайм-аутом соединения". Открытие файла устройства работает:
fd = open("/dev/i2c-10", O_RDWR);
Установка адреса ведомого работает:
ioctl(fd, I2C_SLAVE, addr);
Но запись или чтение возвращает -1
и устанавливает для errno значение «Время ожидания соединения истекло».
write(fd, buffer, len);
Кроме того, как только я пытаюсь писать или читать таким образом, шина I2C ломается, и мне приходится перезагружать модуль, чтобы он снова работал с i2c-tools
. Я также пробовал использовать различные другие способы записи в драйверы i2c (вызовы ioctl
с сообщениями i2c_rdwr_ioctl_data
, сообщения i2c_smbus_ioctl_data
), но безрезультатно, они возвращают те же сообщения об ошибках.
Я не могу придумать какую-либо причину, по которой вызовы write()
и read()
будут работать в моем коде иначе, чем в i2c-tools
и echo
. Фактически, я даже скомпилировал свою программу с исходным кодом i2c-tools
(busybox 1.26.2) и напрямую использовал те же функции, что и i2cset
и i2cget
... и по-прежнему не работает.
Любая помощь или предложения приветствуются.
Используйте strace с вызовом echo или i2cset. Используйте strace со своим кодом. Сравните системные вызовы.
Вы когда-нибудь решали эту проблему? У меня точно такая же проблема.