クロックスキュー
とかの問題じゃなくて、もっとアクティブに
怪しい挙動することもあって、そっちが主原因か。
セットアップタイムやホールドタイムの問題なら、
逆にそんなに苦戦しないかと。
(分かりやすい、想像しやすい)
------
やはり元凶の一つはクロックストレッチ仕様かと。
説明すると長くなるけど、
プルアップとかライン容量とか、ダンピング抵抗とか
の兼ね合いと、クロックストレッチの動作。
サージノイズの伝達経路、なんかの関係で、
通常よりはずいぶん短いHクロックが、
出力されたり。
(正しい動作なのが困ったところ)
ポイントは、クロックラインがLに
引っ張られているかどうかは、
マスターがクロックラインをリリースして、
ある程度以上時間がたってからサンプリングして
判定している処。
そりゃ、自分がLに引っ張ってる
うちから判定したら、ずっとLのままだ。
マスタがラインをリリースして、十分時間が
たってからサンプリング。
その時にLだったら、マスターが改めて
一定時間Lに引っ張る仕様になっている。
なので、クロックラインがHになって、
よりによってサンプリングするタイミングで
ノイズとかが重畳すると、見事にマスタには
見えない、無いはずのHパルスが
生成されてしまう。
(マスターの視点では、クロックラインはずっとL)
うかつにもノイズ対策なんて称して、
既定ぎりぎりいっぱいのコンデンサが
フィルタのつもりで入っていたりすると、
丁度サンプリングの時に、バスの電圧が、
まだ閾値付近をうろうろしてたりして、
絶好のノイズマージン極小なんてことに。
クロック同期通信なので、異常な
間隔のパルスにも応答しようして、
スレーブのシーケンサーが酔っぱらうのか、
このタイミングで、途中で止まったり。
この時点で、マイコンのペリフェラルのバグ、
となるけど、よくよく考えると
正規の動作っぽい。
(クロックストレッチのサンプル
タイミングは規定にはないような....)
実際のバスの状態と、マスターがやってる
(つもりの)状態が乖離して、結果意図しない
状態に入るけど、復帰できないパターンが
ある/ありそうなのが致命的かと。
それでなくても、普通にサージノイズとかで、
ストップコンディションと誤判定されて
しまったりすると、途中で止まってしまって
身動き取れなくなりそう。
一応、マジックパケットでのリセットは
規約にはあるけれど、必須とはなって無いようなので
当てにはならない。
マスターがこけた場合は、これまたどうしようもない。
で、正解はハードウエアリセット類
とかかなあ、という認識
公式もドキュメントで、そうおっしゃって下さっているし。
I2Cは、問答無用でハードリセット、が正義ということで。
| 固定リンク | 0
コメント