0

I2C_RDWR ioctlを使用して、32ビットおよび16ビットのレジスタアドレスにデータを書き込むことができるI2Cプログラムを作成する必要があります。

私が知っていることから、デバイスアドレスとデータは、Linuxi2cドライバーで定義された構造i2c_msgの同じバッファーbufを使用してデバイスに一緒に渡されます。

struct i2c_msg {
        __u16 addr;      slave address
        __u16 flags;
#define I2C_M_TEN       0x10     we have a ten bit chip address
#define I2C_M_RD        0x01
#define I2C_M_NOSTART   0x4000
#define I2C_M_REV_DIR_ADDR      0x2000
#define I2C_M_IGNORE_NAK        0x1000
#define I2C_M_NO_RD_ACK         0x0800
        __u16 len;               msg length
        __u8 *buf;               pointer to msg data
};

現在、私は以下のように32ビットレジスタアドレスを渡しています:

    buf[3] = reg_addr & 0xff;
    buf[2] = (reg_addr >> 8) & 0xff;
    buf[1] = (reg_addr >> 16) & 0xff;
    buf[0] = (reg_addr >>24) & 0xff;
 //buf[4,5...] = data;
    msg.buf = buf;

レジスタアドレスが16ビットの場合、次のコードが実行されます。

    buf[1] = (reg_addr & 0xff);
    buf[0] = (reg_addr >> 8);
    buf[2] = data;
 // buf[2,3...] = data;

アドレスが含まれているバッファ配列の数をデバイスに通知するにはどうすればよいですか?

また、このコードは正しいですか?

残念ながら、現在テストするI2Cデバイスはありません。

どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1

2

I2Cコマンドは、I2Cアドレスによって選択されたデバイスにバイトのストリームを送信します。これらをどのように解釈するかは完全にデバイス次第であり、デバイスのデータシートを読んで確認する必要があります。

たとえば、AtmelI2CEEPROMについて考えてみます。512kBit以下のデバイスは固定の16ビットアドレスを使用し、 1MBitAT24C1024Bは17ビットアドレスを使用します。この16ビットがI2Cコマンドストリームに表示され、MSBはI2Cデバイスアドレスにエンコードされます。

于 2012-03-26T12:31:39.897 に答える