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

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


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


> 木原です。
> お世話になっています。
> 
> 誤記がありました。申し訳ございません。
> 弊社のデバイスについて、
> 任意のアドレスのデータを読む場合、
> 
> S| Slave | R/W=0 | ack | レジスタアドレス | ack | S | Slave | R/W=1 | 
> Data(n)| ack | Data(n+1) | ack | ・・・・・|ack| Stop |
> 
> となっています。

了解しました。
では、i2ctest_RxDataの処理を以下のようにするとどうでしょうか?

struct i2c_msg msg[2];
char buf[2];
int ret;

/* 受信データバッファクリア */
buf[0] = 0;
buf[1] = 0;

/* レジスタアドレス転送用 */
msg[0].addr  = test_i2c_client.addr;
msg[0].len   = 1;
msg[0].buf   = rxData;
msg[0].flags = 0;

/* データ受信用 */
msg[1].addr  = test_i2c_client.addr;
msg[1].len   = 1;
msg[1].buf   = buf;
msg[1].flags = I2C_M_RD;

ret = i2c_transfer(c->adapter, msg, 2);

/* buf[0]の内容を表示 */
printk("RxData msgs[1].buf[0]=%x\n", buf[0]);


> しかし、linux-2.6.13/Documentation/i2c/i2c-protocolの
> i2c_transferに関する説明によると、
> 
> They are just like the above transactions, but instead of a stop bit P
> a start bit S is sent and the transaction continues. An example of
> a byte read, followed by a byte write:
> 
> S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P     
> 
> となっており、一番初めのスレーブアドレス発行後に"Read"、
> 次のスレーブアドレス発行後には"Write"を出力しており、
> 弊社の仕様と異なっています。
> I2C_M_REV_DIR_ADDR フラグを使えば、 Read/Write フラグを切り替える
> ことができるようですが・・・
> 
>> レジスタアドレスの送信(指定)はどこでしているのでしょうか?
> 
> 下記のi2ctest_attach() の コメント//送信
> 以下のところでおこなっています。
> (テストがうまくいったら、
> この送受信テスト箇所は切り離す予定です。)
> 
> 0xE1がレジスタアドレスで、0x23が書き込むデータです。

送信時はtx[0]にレジスタアドレスを指定するとレジスタアドレスが送られますが、
今のi2ctest_RxData関数ではrx[0]にレジスタアドレスを指定しても
デバイスにレジスタアドレスは送られません。

i2c_armadillo5x0_xferのコードを確認していただくと判りますが
flag=I2C_M_RDでi2c_transferを呼び出すと
スレーブアドレスを転送 → Read動作となりレジスタアドレスの送信はされません。


> static int
> i2ctest_attach(struct i2c_adapter *adap)
> {
> int ret;
> char tx[2];
> char rx[2];
> 
> DEBUG_FUNC();
> 
> printk("i2ctest_attach is called\n");
> 
> ret = i2c_probe(adap, &addr_data, &i2ctest_detect_client);
> printk("i2c_probe=%d\n", ret);
> 
> // 送信テスト
> tx[0] = 0xE1;  //レジスタアドレス
> tx[1] = 0x23;    //書き込むデータ
> i2ctest_TxData(tx, 2);
> 
> // 受信テスト
> rx[0] = 0xE1;  //レジスタアドレス
> i2ctest_RxData(rx, 1);
> printk("rx=%x\n", rx[0]);
> printk("rx=%x\n", rx[1]);
> 
> return ret;
> }
> 
> 
> 以上
> 




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