Я пытаюсь взаимодействовать с цифровым компасом Devantech, найденным здесь -
http://www.acroname.com/robotics/parts/R117-COMPASS.html
Я использую конвертер i2c-usb для подключения к ноутбуку -
http://www.robot -electronics.co.uk / HTM / usb_i2c_tech.htm
Прежде всего, я мало что знаю об электротехнике. У меня есть хорошее представление об основных принципах, но после этого я теряюсь.
Я пытаюсь следовать этому уроку -
https://xgoat.com/wp/2007/11/11/using-i2c-from-userspace-in-linux/
Однако я застреваю в самом начале, когда пытаюсь установить адрес устройства.
if( ioctl( fd, I2C_SLAVE, ADDRESS ) < 0 )
{
fprintf( stderr, "Failed to set slave address: %m\n" );
return 2;
}
возвращает «Не удалось установить адрес ведомого: неверный аргумент»
Первоначально я думал, что адрес должен быть 0xC0, потому что предложение в руководстве для компаса гласит «Сначала отправьте стартовый бит, адрес модуля (0xC0) ...», но это не сработало.
Теперь у меня есть цикл, который просто идет от 1 до 100 и пытается каждый для адреса, но они все терпят неудачу. Цикл -
for(int i=0x0;i<0x100;i++) {
if( ioctl( fd, I2C_SLAVE, i ) < 0 )
fprintf( stderr, "Failed to set slave address for address %i: %m\n", i );
}
Я не уверен, что еще можно попробовать. Прямо сейчас я просто хочу установить адрес, чтобы я мог начать пытаться читать и писать. Поскольку конвертер - это то, что на самом деле связано с компьютером, я должен использовать адрес для этого? И если да, где я могу найти его по той ссылке с информацией для него? Если у кого-то есть представление о том, что я могу попробовать или что не так, это было бы здорово.
EDIT:
Хорошо, теперь у меня есть такой код -
#define ADDRESS 0x55
int fd = open("/dev/i2c-0", O_RDWR);
if (fd < 0) {
printf("\n<0, %m", errno);
return -1;
}
if( ioctl( fd, I2C_SLAVE, ADDRESS ) < 0 ) {
fprintf( stderr, "Failed to set slave address: %m\n" );
return 2;
}
if( i2c_smbus_write_byte( fd, 0xAA ) < 0 )
fprintf( stderr, "Failed to write 0xAA to I2C device: %m\n" );
Он установит адрес, но ничего не напишет. Всякий раз, когда я пытаюсь написать это, я получаю -
Failed to write 0xAA to I2C device: No such device or address