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

Takenoshita Koyo email@hidden
2011年 4月 19日 (火) 15:57:11 JST


竹之下です。

>> 1. I2Cを有効にする。
>>    ⇒ デフォルトではCON14(i2c-1)は無効になっているためKernel configで有効にしました。
Linuxカーネルは、バージョンいくつをご使用でしょうか?
linux-2.6.26-at8 (linux-a400-1.01.bin.gz) 以降では、デフォルトの設定で CON14 を I2C2
として使用するようになっています。

使用している環境を具体的に教えてください。

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

以下のように変更した、ということで間違いないでしょうか?

--- a/arch/arm/mach-mx25/armadillo400.c
+++ b/arch/arm/mach-mx25/armadillo400.c
@@ -592,7 +592,7 @@ static struct i2c_board_info armadillo400_i2c2_board_info[] __initdata = {
 };
 
 static struct mxc_i2c_platform_data armadillo400_i2c2_data = {
-       .i2c_clk = 40000,
+       .i2c_clk = 400000,
 };
 #endif /* defined(CONFIG_I2C_MXC_SELECT2) */

* 本当に、"4000bps ⇒ 40000bps"にしたのでしょうか? (40000 から 400000 への変更ではありませんか?)
* 変更したのは、armadillo400_i2c2_data で間違いないでしょうか? (armadillo400_i2c1_data を変更していないでしょうか?)

ソースコードの変更箇所も、具体的に教えていただけると、助かります。

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

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

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

ご指摘の通り、ドライバ内で1ビット左シフトしてからR/Wビットを付け足すので、
ioctl(fd, I2C_SLAVE, )に渡すアドレスは、I2Cスレーブデバイスが期待しているアドレスを
1ビット右シフトしたものを指定すると、双方の意図しているアドレスが一致するかもしれません。

>> 5. データを 20byte 取得する。
>>  ⇒ read( fd, pBuf, 20 ) で、Remote I/O error が発生します。
>>
>> ※ 実際には、Timeoutエラーです。
>>
>> 独自の機器の方は、ある程度デバッグが可能ですので、I2Cのステータスを監視していたところ
>> マスターからデータ通信要求は行われていましたが、実際のデータが取得できていませんでした。
>> 独自機器の受信バッファを読んでも"0"です。
>> 本来ならば、スレーブアドレスが入っているはずです。
>> 試しに、writeを行ってみましたが、結果は同じで、スレーブアドレスが正常に送信できません。
本当にアドレスが送信できていないのか、I2Cスレーブデバイス(独自機器)側でデータを受け取れていないのか、
オシロスコープやロジックアナライザなどで、実際の波形を見て確認してみるのが、確実ではないかと思います。

> もう一点気になっている箇所がございました。
> 
> 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
> -------------------------------------------------------------------------------------

> <7>Could not grab Bus ownership
このメッセージが出るときは、同じI2Cバス(I2C2)上につながっている他のデバイスが
SDAをドライブしているのかもしれません。回路の方も確認してみてください。

-- 
Koyo Takenoshita




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