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

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


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


> 木原です。
> お世話になっています。
> 早々のご返信ありがとうございます。
> 
>> 通信の操作はターゲットとしているデバイスによって違う可能性があります。
>> デバイスのマニュアルを確認してください。
> 
> | START |  スレーブアドレス | R/W = 1 | ACK |  Data(n) | Data(n+1) | 
> ・・・・
>
> なので、アクセスしたいアドレスを送信してやれば、デバイスから
> データがおくられてくるはずなのですが・・。
>

レジスタアドレスの送信(指定)はどこでしているのでしょうか?

スレーブアドレスはI2Cデバイスが持つアドレスなので
別途アクセスしたいレジスタアドレスの指定が必要かと思います。


ちなみに私がターゲットにしたデバイスでは次の操作になっています。

Read Phase1(レジスタアドレス指定)
START | スレーブアドレス | W=0 | ACK | レジスタアドレス | ACK | STOP

Read Phase2(データRead)
START | スレーブアドレス | R=1 | ACK | Data | ACK | STOP


>>
>> ちなみに私が扱ったデバイスではまず、アクセスしたいアドレスだけ送ります。
>> この時は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にはいっているのか(^^; ?

以下のプログラムではmsgs[1].bufが初期化されていないのではないでしょうか?
また、i2c_transferの最後の引数が1なのでmsgsの要素数は1で処理されていますので
msgs[1]は何もされていないと思います。

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

i2c_transfer関数でダミーリードの処理はされています。

i2c_transferの実体のコードを読むとどのように処理されているかが判るので
一度確認してみてはいかがでしょうか。

i2c_transferの実体はdrivers/i2c/busses/i2c-armadillo5x0.cの
i2c_armadillo5x0_xferです。

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





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