I2Cの怖かった話
結局迷宮入りってことで
埋められちゃったネタを一つ。
------
とあるシステムで、時々I2Cの応答が
止まっちゃう、ってことがあった。
よくあること?なんだけど...
このレベルなら回避策もあるんだけど...
そもそもなんで止まるの?って所が怖い。
------
異常動作をしていたのは、予想通り
SCLの誤認識。
SCL立ち上がりの所で、なにかのトリガで
バスストレッチの要求ありと判定するみたいで
スレーブ側で、クロックが一つ飛ばされてしまう。
で、マスタはクロック全部出してるんだけど
スレーブ側はいつまでも、最後のSCL
(よりによってACK...)を待ったまま
止まってしまう。
------
色々回路を追っていくと、問題のI2Cバス
にはかなり大きめのプルアップ抵抗
(3.3Vに対して4.7kくらい)、
はっきり大き目のダンパ抵抗(100Ωくらい)に
とどめのパスコン1nFくらい?
何だこりゃ?と思ったのだけど、どうも
一番最初は、5Vのシステムだったのが
いつの間にやら3.3Vに変更されていたようだ。
これ定数大き目?と問うと、
過去のノイズ対策ガー、とのこと。
チップ変えたら、定数は都度評価してほしいなあ...
I2Cって、レベル動作しているから、
エッジをなましても仕方ないんじゃ?
一体、何を根拠にノイズ対策なんだろう。
スペックには入っているから問題ない、
との話だったのだけど。
どうも気持ち悪い....
そもそもバスに、わざわざ負荷容量つけんなよ...
------
で、問題のタイミングは、ソフトウエア
依存性があるという。
はああ?て感じだったけど。
どこよ、と聞いてひっくり返った。
I2Cの通信のタイミングが、ADCの
起動タイミングにかぶると、
シビアなタイミングでエラーが
発生している、との観測結果があったようだ。
なんじゃそら。
I2CとADCのペリフェラルなんて、
何にも関係ないでしょ....
------
ここんところで、
マイコンチップ内部の問題って
ことで放り投げられてしまった。
回路設計の問題ではない、と。
まあ、投げ時と言えばそう(これは深入りしたくない...)
なので、致し方ないか、という感じなのだけど。
------
決着ついた後、じっと回路図見ていると、
このI2Cのピンは、ADCの入力ピンにも
設定できることに気づいた。
ああー、これ、もしかすると、あれだな。
ADCは、別の複数のピンを切り替えながら
動作してるけど、コンバーターは一つだ。
マルチプレクサが、アナログ入力ピンを
切り替えながら動作してるんだよな....
当然、I2Cのピンはアナログピンとしては
使ってないけど、内部回路的には多分繋がってる
(ハイインピは、繋がってないわけじゃない)
で、マルチプレクサの切り替えにグリッジが
発生するようなロジックがあって、
ADCのサンプルホールド回路とかに
残っている電荷が一瞬だけ、
問題のピンにチャージされるんじゃないか?
クロストークレベルで。
------
こんなもの、通常のロジック動作では
ほとんど影響しないレベルだと思うけど。
色々間の悪い状況が重なって、よりによって
I2CのSCLの立ち上がりに重畳すると
ピン電位が微妙に下がってしまって、
アウト、ってことなんじゃないだろうか。
当該のI2Cのアヤシいノイズ対策も、
外からのノイズには、機能するかも
しれないけど、内部で発生する
ノイズに対しては、無力というか
悪い方向にしか効かない気がする....
でかいCRのおかげで、危険な
電圧レベルの通過に時間が掛かって
しまっているよな。
せめてプルアップ、1.8kくらいに
してくんないかな...
あと、そこまでわかってるなら、
I2C動かすときには、
ちょっとだけADC止めりゃ
いいじゃん、と思うんだけど。
------
まあ自分からは、遠い処の話だし、
結局、話は埋められてしまったので、
如何こうできないのだけど
自分的には、腹に落ちた。
裏は取れなかったけど、
状況証拠から、ほぼこれだと思っている。
物は、割と今どきのマイコン(旧M社)なんだけど、
こういうこともあるんだなあ、と。
| 固定リンク | 0
コメント