[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 メーリングリストの案内