[Armadillo:07098] Re: [Armadillo-440] I2C通信で失敗する
下村智範
email@hidden
2011年 4月 18日 (月) 20:14:36 JST
もう一点気になっている箇所がございました。
read()を行って失敗した時のdmesgを取得しまいした。
-------------------------------------------------------------------------------------
<7>i2c-adapter i2c-1: ioctl, cmd=0x703, arg=0x22
<7>i2c-dev: i2c-1 reading 20 bytes.
<7>i2c-adapter i2c-1: master_xfer[0] R, addr=0x22, len=20
<7>cr = 0xE0
<7>Could not grab Bus ownership
<7>cr = 0xF0
<7>addr = 0x45
<7>Data not transmitted
-------------------------------------------------------------------------------------
「Could not grab Bus ownership」とありますので、クロックの
バス衝突!?が発生しているのでしょうか。
メッセージを出している、mxc_i2c.cの処理み見てみたところ
スタートコンディションを発行する時に発生しておりました。
しかし、メッセージを出すだけで、エラーとしては扱っておらず
その後の処理は継続しています。
I2Cは3つ搭載されているので、そのうちのどれかがクロックを
供給しているためにownershipが取れないのでしょうか。
I2C通信に詳しい方がいらっしゃいましたら、ご教授お願いいたします。
2011年4月18日19:27 下村智範 <email@hidden>:
> お世話になっております。
> 下村です。
>
> 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 メーリングリストの案内