Настройка адреса ведомого устройства i2c для цифрового компаса Devantech - PullRequest
0 голосов
/ 16 ноября 2011

Я пытаюсь взаимодействовать с цифровым компасом 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 

1 Ответ

0 голосов
/ 30 января 2012

Почему вы пытаетесь отправить 0xAA на устройство?Насколько я понимаю, это не регистр для него (для CMPS03 единственной командой является регистр 15, и ее использование не распространено: изменить адрес I2C, сброс настроек к заводским, ...).И 0x55 кажется определенно не адресом устройства ... 0xC0 должен быть записывающим.

Может быть, /dev/i2c-0 не был создан правильно / не правильно?Как вы создали /dev/ic2-0?

...