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