[Armadillo:07097] [Armadillo-440] I2C通信で失敗する

下村智範 email@hidden
2011年 4月 18日 (月) 19:27:47 JST


お世話になっております。
下村です。

Armadillo-440に、I2Cで独自の機器を接続しデータのやり取りを試みております。
現在、スレーブへアドレスを渡せない不具合が発生しています。
アドバイスいただけませんでしょうか。

独自の機器は、Armadillo-440のCON14(3,4)へ、I2C接続を行っております。

1. I2Cを有効にする。
    ⇒ デフォルトではCON14(i2c-1)は無効になっているためKernel configで有効にしました。

2. I2Cのクロックを400Kに変更する。
  ⇒ kernel/arch/arm/mach-mx25/armadillo440.c  の i2c-1(I2C2) のbpsを
4000bps ⇒ 40000bps へ変更しました。

3. オープンする。
    ⇒ fd = open( /dev/i2c-1, O_RDWR ); は成功し、正しい戻り値がもらえています。

4. スレーブアドレスを設定。
  ⇒ ioctl( fd, I2C_SLAVE, 0x22 ); も成功しました。

5. データを 20byte 取得する。
  ⇒ read( fd, pBuf, 20 ) で、Remote I/O error が発生します。

※ 実際には、Timeoutエラーです。

独自の機器の方は、ある程度デバッグが可能ですので、I2Cのステータスを監視していたところ
マスターからデータ通信要求は行われていましたが、実際のデータが取得できていませんでした。
独自機器の受信バッファを読んでも"0"です。
本来ならば、スレーブアドレスが入っているはずです。
試しに、writeを行ってみましたが、結果は同じで、スレーブアドレスが正常に送信できません。

read/wirteが失敗する原因で、何か情報をお持ちの方がいらっしゃいませんでしょうか?
ご教授お願いいたします。

また、mxc_i2c.cの処理み見てみたところ、スレーブアドレスの扱いでちょっと気になりました。
ioctl()で渡したスレーブアドレスを1ビットシフトし、R/Wビットを付与していました。
0x22で渡せば、実際にスレーブアドレスが発行されるときには、Rの場合= 0x45, Wの場合= 0x44に
なります。
独自機器では、0x22と0x44のどちらを設定すべきでしょうか?

以上、よろしくお願いいたします。



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