« CAN徒然 | トップページ | ADHDとか »

2020年5月 7日 (木)

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社)なんだけど、
こういうこともあるんだなあ、と。

| |

« CAN徒然 | トップページ | ADHDとか »

コメント

コメントを書く



(ウェブ上には掲載しません)




« CAN徒然 | トップページ | ADHDとか »