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

Takenoshita Koyo email@hidden
2011年 4月 21日 (木) 18:57:42 JST


竹之下です。

> ダミークロックの発行は、Armadilloの電源投入時にI2Cスレーブデバイスが
> 通信エラー/信号待ち状態になっているかもしれないから無条件で発行する
> という理解で間違いございませんでしょうか。
はい。そうです。

> ダミークロックを受け取ったスレーブデバイスは、通信エラー/信号待ち状態
> の場合は、復帰するために何かリセット処理を行わなければいけないのでしょうか?
> それとも、ダミークロックは、I2Cの通信シーケンスを一通り流すため
> スレーブI2Cモジュールが勝手(自動的)に、正常な状態まで行くだろうということを
> 期待しているのでしょうか。
後者です。「スレーブI2Cモジュールが勝手(自動的)に、正常な状態まで行くだろうと
いうことを期待」しています。

> 通信エラー/信号待ち状態ではない場合は、何もしなくても良いということになり
> ますでしょうか。
何もしなくても良いです。
(I2Cアドレスが一致しない場合、いくらクロックが入ってもスレーブデバイスは何も
 する必要がありません。)

>> 上記のように、リード中にリセットが発生すると、RTCがバスを掴んだままとなります。
> バスの制御はマスターデバイスという認識ですが、スレーブデバイスのRTCがバスを
> 掴んだままになるのでしょうか。
特殊な状況ですが、スレーブがバスを掴んだままに、なりえます。

I2Cは、SCLとSDA 2本の線で通信する方法です。
SCLは常にマスタが駆動します。
SDAはマスタが駆動したり、スレーブが駆動したりします。

マスタとスレーブとの通信は、以下の手順で行います。
1. マスタがスタートコンディションを発行する。(SCL=Highの間に、SDAをHigh->Lowと変化させる)
2. マスタがアドレスバイト(8bit)を送信する (このとき、SDAを駆動するのはマスタ)
3. スレーブがACKを返す(このとき、SDAを駆動するのはスレーブ)
4. アドレスバイトの7bit目が1のとき
5. スレーブがデータバイト(8bit)を送信する(このとき、SDAを駆動するのはスレーブ)
6. 続いてデータが欲しい場合、マスタがACKを返す(このとき、SDAを駆動するのはマスタ)
7. スレーブがデータバイト(8bit)を送信する
8. データの転送を終了したい場合、マスタがNACKを返す
9. マスタがストップコンディションを発行する(SCL=Highの間に、SDAをLow->Highと変化させる)

5. の途中で、スレーブには電源供給したままで、マスタだけにリセットがかかると、
スレーブが"バスを掴んだ状態"となります。
Armadilloで想定しているのは、この状況です。

そのため、起動時に以下のことをしています。
- SDAにつながっているピンをinputにして (これを前回書いていませんでした。)
- SCLに128回クロックを入れる

すると、SDAはオープンドレインで、かつ、プルアップされているので、
スレーブがLowに駆動しなければ、SDAはHighになります。
この状態でSCLにクロックを入れると、常にNACKを返している状態(8.)となります。
そのため、スレーブデバイスがもし、5. の状態であったとしても、
リードを完了するであろう、という想定です。

I2Cに関しては、「Armadillo実践開発ガイド 第2部」でも簡単にですが説明していますので、
参考にしてください。
http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-3_ja-2.0.1/ch02.html#_i2c

-- 
Koyo Takenoshita




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