[Armadillo:03944] Re: armadillo-500 sysfs経由でI2Cドライバ制御

日本電子システムテクノロジー/高木 email@hidden
2009年 1月 22日 (木) 17:35:10 JST


お世話になっています。
高木です。

> ここでおききしたいのですが、
> i2c_msg構造体変数のメンバbufについて、
> buf[0]にはレジスタアドレスを与えているのですが、
> i2c_transfer()がcallされた後には、
> buf[0]にはレジスタアドレス、
> buf[1]には受信データが
> 入っているという理解でよろしいでしょうか?
>
> i2c_msg構造体のメンバflagsですが、
> i2c.hのi2c_msg構造体のコメントを読んだところ、どれにも該当
> しないので0としました。
> チップアドレスは8ビットであり、
> 受信時は、マスター(armadillo)がスレーブ(弊社のセンサー)
> をよみとります。


通信の操作はターゲットとしているデバイスによって違う可能性があります。
デバイスのマニュアルを確認してください。

ちなみに私が扱ったデバイスではまず、アクセスしたいアドレスだけ送ります。
この時はflag=0でi2c_transferを実行。

次にflag=I2C_M_RDとしてi2c_transferを実行することで
buf[0]にデータが格納されました。

以下にそのときのサンプルコードをのせておきます。
ご参考になればと思います。

c->addrはデバイスが持つアドレスです。


■転送
static int XXX_i2c_write(struct i2c_client *c, unsigned char addr, unsigned char value)
{
    struct i2c_msg msg[2];
    char buf[2];
    int ret;

    buf[0] = addr;
    buf[1] = value;

    msg[0].addr  = c->addr;
    msg[0].len   = 2;
    msg[0].buf   = buf;
    msg[0].flags = 0;

    ret = i2c_transfer(c->adapter, msg, 1);
    if (ret >= 0)
    {
        return 0;
    }

    return ret;
}

■受信
static int XXX_i2c_read(struct i2c_client *c, unsigned char addr)
{
    struct i2c_msg msg[2];
    char buf[2];
    int ret;

    buf[0] = addr;

    msg[0].addr  = c->addr;
    msg[0].len   = 1;
    msg[0].buf   = buf;
    msg[0].flags = 0;
    ret = i2c_transfer(c->adapter, &msg[0], 1);
    if (ret >= 0)
    {
    }
    else
    {
        return ret;
    }

    msg[1].addr  = c->addr;
    msg[1].len   = 1;
    msg[1].buf   = buf;
    msg[1].flags = I2C_M_RD;

    ret = i2c_transfer(c->adapter, &msg[1], 1);
    if (ret >= 0)
    {
        return buf[0];
    }

    return ret;

}


> いつもお世話になっております。
> 山本です。
> 
>> i2c_msg構造体のメンバflagsですが、
>> i2c.hのi2c_msg構造体のコメントを読んだところ、どれにも該当
>> しないので0としました。
> 
> 送信時は0でよいですが、受信時は「I2C_M_RD」を使用するようです。
> 
> 
> 
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 
> 





armadillo メーリングリストの案内