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