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

g-kihara email@hidden
2009年 1月 22日 (木) 20:29:21 JST


木原です。
お世話になっています。
早々のご返信ありがとうございます。

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

| START |  スレーブアドレス | R/W = 1 | ACK |  Data(n) | Data(n+1) | ・・・・ 


なので、アクセスしたいアドレスを送信してやれば、デバイスから
データがおくられてくるはずなのですが・・。

>
> ちなみに私が扱ったデバイスではまず、アクセスしたいアドレスだけ送ります。
> この時はflag=0でi2c_transferを実行。
>
> 次にflag=I2C_M_RDとしてi2c_transferを実行することで
> buf[0]にデータが格納されました。

ご教示いただいた手法でやってみましたが、期待した値はかえってきませんでした。

そこで、下記に示したi2ctest_RxData()で受信テストを行ったところ、

msgs[0].buf[0] ・・・ 0xff
msgs[0].buf[1]・・・ 0x1e
msgs[1].buf[0]・・・ 0xe1
msgs[1].buf[1]・・・ 0x23

のようになっていることがわかりました。
msgs[1].buf[1]にわたしが期待するデータ(レジスタに書き込んだ値)が入っていました。
なにゆえにmsgs[1]のbufにはいっているのか(^^; ?

最初にダミーリードをおこなわないといけないということなのでしょうか?
明日またトライしてみます。

int
i2ctest_RxData(char *rxData, int length)
{
        int ret;
        u8 buf[2];
        struct i2c_msg msgs[2];

        msgs[0].addr = test_i2c_client.addr;
        msgs[0].flags = I2C_M_RD;
        msgs[0].len   = 1;
        msgs[0].buf   = rxData;

        down(&mutex);
        ret = i2c_transfer(test_i2c_client.adapter, msgs, 1);

        printk("RxData msgs[0].buf[0]=%x\n", msgs[0].buf[0]);
        printk("RxData msgs[0].buf[1]=%x\n", msgs[0].buf[1]);
        printk("RxData msgs[1].buf[0]=%x\n", msgs[1].buf[0]);
        printk("RxData msgs[1].buf[1]=%x\n", msgs[1].buf[1]);

        if(ret == 1){
                printk("RxData succedded!!!\n");
        }else if (ret >= 0){
                ret = -1;
                printk("RxData failed!!!\n");
        }
        up(&mutex);

        return ret;
}


以上


>
>
> ■転送
> 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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo 




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