0

ここにある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 );
}

他に何を試すべきかわかりません。今は、読み書きを開始できるようにアドレスを設定したいだけです。コンバーターは実際に PC に接続されているものなので、そのアドレスを使用する必要がありますか? もしそうなら、その情報を含むそのリンクのどこでそれを見つけることができますか? 誰かが私が何を試すことができるか、または何が間違っているかについての考えを持っていれば、それは素晴らしいことです.

編集:

さて、私は今このようなコードを持っています -

#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 
4

1 に答える 1

0

0xAAデバイスに送信しようとしているのはなぜですか? 私の理解では、これはレジスタではありません(のCMPS03場合、唯一のコマンドはレジスタ15であり、その使用法は一般的ではありません:I2Cアドレスの変更、工場出荷時設定へのリセットなど)。そして、明らか0x55にデバイスのアドレスではないようです...0xC0書き込みアドレスである必要があります。

/dev/i2c-0適切に作成されていない/正しくない可能性がありますか? どのようにして/dev/ic2-0作成されましたか?

于 2012-01-30T06:52:03.570 に答える