せっかちな人は、背景をスキップできます。
バックグラウンド
SPIと通信する一連のマイクロコントローラーをプログラミングしています。nバスを共有するマスターとスレーブが1つあります。チップセレクトはありません。(これは悪いデザインでnはありませんが、サイズが大きく、n余分なラインを配置するための十分なスペースがありません)。
したがって、MISOを高インピーダンスに維持することはスレーブの責任であり、多くても1人が話します。これは、IDがポーリングされたときにのみ応答することによって行われます。
ここで、マスターがスレーブに接続されているIDを使用してスレーブを検出する最初の検出フェーズが必要です。生活をより簡単にするために(いくつかの側面で)、IDを一意にしたいと考えています(したがって32ビットなど)。これにより、マスターがIDを1つずつポーリングして、誰が応答するかを確認することができなくなります(可能性が多すぎます)。
この問題を解決するために、スレーブがまとめて応答し、マスターが最小IDをすばやく見つけることができるバイナリ検索のバリエーションを考案しました。そのIDのスレーブは、参加しないように指示され、アルゴリズムが繰り返されます。(重要ではない詳細)。
ただし、問題が1つあります。集合的応答は、すべての応答の論理OR(または論理AND)である必要があります。MISOバスが論理ORとして機能するようにラインを構成できると聞いています。私が言われたことは:
- マスターのMISOをプルアップとして設定し、
- すべてのスレーブでMISOをオープンドレインとして設定します。
私はこれを試しましたが、スレーブが1つでも、この構成は機能しません(オシロスコープはライン上に一定のゼロを示します)。マスターでMISOを高インピーダンス入力として構成すると、オシロスコープで、2つのスレーブからの出力のビットが異なる場所で電圧が半分に低下していることがわかります(基本的には短絡と思います)。
注:マスターのMISOを高インピーダンスとして構成し、スレーブをそれぞれプッシュプルとして構成すると、同じバス上に多数ある場合でも、それぞれに個別に通信できます。つまり、ライン自体の問題ではないかと思います。
質問
私の質問は、これが可能な場合、そして可能であれば、共有MISOラインが論理OR(または論理AND)として機能するようにマスターとスレーブの入力ピンと出力ピンを構成するにはどうすればよいですか?
編集する
結局、それは否定的な真の論理を持つOR(基本的にはAND)になります。
シングルスレーブの問題は、マスターのプルアップピンに1を書き込むことで解決されました。以前は、初期状態は0でした。
編集2
STスレーブがオープンドレインとしてMISOの私のGPIO構成をオーバーライドし、書き込まれたときにそれを強制的に高くしていることが判明しました。この特定のケースでは、手動でSPIをサイレントにしてMISOを出力することにしました。