共有バスをORとして機能させる


10

せっかちな人は、背景をスキップできます。

バックグラウンド

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)として機能するようにマスターとスレーブの入力ピンと出力ピンを構成するにはどうすればよいですか?


編集する

  1. 結局、それは否定的な真の論理を持つOR(基本的にはAND)になります。

  2. シングルスレーブの問題は、マスターのプルアップピンに1を書き込むことで解決されました。以前は、初期状態は0でした。

編集2

STスレーブがオープンドレインとしてMISOの私のGPIO構成をオーバーライドし、書き込まれたときにそれを強制的に高くしていることが判明しました。この特定のケースでは、手動でSPIをサイレントにしてMISOを出力することにしました。


ご存知だと思いますが、I2CまたはCANの使用を検討しましたか?これらはn個のデバイス用に設計されていますが、SPIは実際には各デバイスのチップセレクトで使用するように設計されています。
ボブ

@bob、はい。彼らは遅すぎる。とにかく、私の質問に対する答えが「不可能」である場合は、少し手作業を行うだけで済みますが、SPIを使用すると最終製品の品質が大幅に向上します。
Shahbaz 2013

1
アドレスとして32ビットを使用しているのは残念です。24ビット(16,772,216のバリエーション)を使用している場合、 "discover"コマンドを送信して16,772,216クロック待機し、すべてのスレーブ情報を取得できるためです。10Mbpsで2秒もかからず、衝突することはありません。こんにちは-あなたは私にそう考えさせました+1
Andy別名

@ Andyaka、24ビットも悪くないかもしれません(ただし、32ビットの方が確かに優れています)。私があなたを正しく理解していれば、各スレーブはそのid番目のクロックで1で応答し、マスターはどのクロックが1を生成したかを調べますか?スレーブがバイトで応答することを除いて、それは悪くありません。したがって、各スレーブは8ビットで応答し、バスをORとして機能させることができない場合でも、1つのスレーブからの応答は、他のスレーブによる応答内で「失われます」(1つのスレーブからの1は、すべての0によってプルダウンされます)残り)。
Shahbaz 2013

@Shahbazスレーブのコードを制御できる場合、これを「特別な」ものにすることができ、スレーブは割り当てられた時間に1ビットでのみ応答します。はい、あなたは私の考えの要点を得ました。
アンディ別名

回答:


5

SPI-with-selectは、MicrochipがMCP23017チップ(およびその他)で使用するものです。そのアプローチに問題はありません。

はい、あなたが望むものは可能ですが、あなたは奴隷をオープンドレインにする必要があります。オープンドレインとして動作させることができない場合は、(ショットキー)ダイオードを各出力と直列に配置して不正行為を行うことができます。

列挙アプローチは、列挙のためにダラスの1線式バスで使用され、アービトレーションのためにCANバスで使用されるものと同じです。

ただし、このアプローチの重大な欠点は、プルアップ抵抗によって駆動される立ち上がり時間によって速度が制限されるようになったことです。これは、プッシュプル出力で駆動する場合よりも遅くなり、バスを操作できる速度を制限する可能性があります。

各スレーブに予備のピンが2つある場合は、それらをデイジーチェーン接続し、デイジーチェーン内のそれらの位置に基づいて列挙方式を使用できます。


はい、速度を下げる必要があると言われたことを忘れていました(これは約20倍にしました(4Mpbsから128Kbpsに下げました))。これは初期段階ですが、私のアルゴリズムは遅い速度にも対応できます(それでもかなり高速です)。残念ながら、今はハードウェアを再設計するつもりはありません。コストは、単にこのフェーズを無視して、マスターに期待するIDを伝えるだけではありません。
Shahbaz 2013

質問に戻りますが、私はすでにスレーブをオープンドレインとして構成しました。マスターはどのように構成すればよいですか?
Shahbaz 2013

1
プルアップを除いて、マスターのMISOピンには特別なものはありません。プルアップデザインで128Kbpsに達するとは思いませんが、YMMVです。いくつかの詳細なI2Cドキュメントを読むことが役立つ場合があります。これはワイヤーまたはプルアップバスであるため、そこで適用されるすべてのトリックが役立つ場合があります。
Wouter van Ooijen 2013

どうもありがとう。何が起こるかを確認するために、バスをさらに遅くしてみます。これらのプルアップ、オープンドレインなどが実際に何を意味するのかを最終的に研究して理解する必要があると思います。(ソフトウェアエンジニアはこちら!)
Shahbaz 2013

1
バスにオシロスコープを置き、何が起こるかを確認します。立ち上がり時間が遅すぎる可能性がありますが、リンギングが発生している可能性もあります。
Wouter van Ooijen 2013

4
  • マスターのMISOをプルアップとして設定し、
  • すべてのスレーブでMISOをオープンドレインとして設定します。

私はこれを試しましたが、スレーブが1つでも、この構成は機能しません(オシロスコープはライン上に一定のゼロを示します)。

プルアップモードでのマスターI / Oピンの等価抵抗を確認する必要があります。

通常、プルアップモードの抵抗は非常に高く、おそらく50kΩ以上です。これは、EMIやその他のノイズによるピンのグリッチを防止すること、または非常に遅い制御信号のデフォルトを設定すること、およびそれを行うために過剰な電力を浪費しないことを目的としています。

Wouterが指摘したように、オープンドレインバスでは、速度はプルアップ抵抗によって制限されます。抵抗値を大きくすると、バスが遅くなります。I2C(100または400 kHzを取得)の標準的な値は1〜5 kOhmsです。同様の速度を実現するには、同様のプルアップ抵抗が必要です。

このスキームを機能させるには、マスターのI / Oピンプルアップではなく、外部プルアップ抵抗(1〜5kΩ程度)を使用する必要があると思います。


ヒントをありがとう。私は電子工学者ではありませんが、同僚にあなたの提案を見てもらうように依頼する必要があります。プログラムの初期段階でのみワイヤードオアが必要ですが、通常段階ではピンがプルアップとして構成されていません。したがって、おそらく外部抵抗はオプションではありません。
Shahbaz 2013

マスターマイクロに1つの空きI / Oピンがある場合、たとえば5 kOhmsでバスに接続できます。次に、バスのエニュメレーション中にハイにし、通常の通信中にハイZにします。
フォトン

1

ワイヤードバスが機能するには、バス上のノードがオープンドレインである必要があります。

  • 強く引き下げることでロジックを低くし、
  • バスから切断することによりロジックハイ。

さらに、バスは弱くプルアップする必要があります。

単一の非送信マスターと単一の送信スレーブで見られる特有の動作は、マスターが強くプルアップするか、スレーブが弱くプルダウンするかのどちらかで説明できます。

上記のどれが発生しているかを判別する必要があります。

スレーブを高インピーダンスモードにして、バスを10k抵抗を介してグランドに接続します。ライン電圧が大幅に変化しない場合は、マスターが強くプルアップしているため、修正する必要があります。それ以外の場合は、スレーブで同じ手順を実行します(今回は抵抗をVccに接続します)。ライン電圧が大幅に上昇する場合、スレーブは弱くプルダウンされています(修正)。それ以外の場合は、周囲の領域で時空間の歪みを探します。


電子工学についての私の無知を失礼しますが、スレーブが強く引き下げられた場合、それはバスをANDとして機能させませんか?ハイを必要とするスレーブが切断され、ローを必要とするスレーブがプルダウンしているため、全体的な結果がダウンしているので、違いますか?
Shahbaz 2013

@Shahbaz、私の悪い、もちろんバスは配線されます-そして、私は答えを修正しました。ワイヤードORが必要な場合は、極性を反転するだけです(マスターは弱くプルダウンされ、スレーブは強く引き上げられます)。
avakar

ウィキペディアを読んで、私は彼らがそれをワイヤードおよび/またはワイヤードまたはネガティブトゥルーロジックと呼んでいることに気づきました。
Shahbaz 2013

1

バスにパッシブプルアップまたはプルダウン(プルアップを想定します)を設定し、何か言いたいことがある場合はスレーブにバスをアクティブに駆動(ハイに駆動し、ローに駆動)させることをお勧めします。 。アドレスとマスクを受け取り、アドレスとマスクが好きかどうかに基づいて、各スレーブに00を出力するか何もしない(出力をフロートに保つ)ように指示するquery-addressコマンドを用意します。可能であれば、スレーブがバスの駆動を開始する前に、マスターにバスをアクティブにHighに駆動させる。プルアップの強度と、マスターがバスをハイに駆動するかどうかに応じて、スレーブがバスをローにプルできるようになる前に、セットアップ段階でバス速度を制限することが必要になる場合があります。一方、セットアップが完了すると、


2つのスレーブがアクティブにハイとローを駆動する場合、バスから何を読み取る必要がありますか?
Shahbaz 2013

あるスレーブがHighを駆動しようとしているときに、別のスレーブがLowを駆動していることは避けてください。スレーブがバスを運転するのは、(1)それが唯一の方法であることを知っている場合、または(2)スレーブがバスを運転している他のすべての人がバスをパッシブアイドルの反対側に運転することを知っている場合のみ状態。
スーパーキャット2013

これはどういう意味ですか?...選択した各スレーブが高レベルと低レベルの両方をアクティブに駆動すると、バスは次のことを実行できます...
Shahbaz

@Shahbaz:スレーブに何か言いたいことがあるときは、バスをアクティブに駆動して「1」ビットを送信し、ローを駆動して「0」ビットを送信する必要があります。スレーブが何も言うことがないとき、それはバスをまったく駆動するべきではありません。「1」ビットを送信したいときにスレーブがバスをアクティブにHighに駆動すると、バスをHighに駆動するためにパッシブプルアップに依存する場合よりもバスがはるかに速く動作することに注意してください。
スーパーキャット2013

@Shahbaz:スーパーキャットが言っていることは、列挙状態では、抵抗はラインをプルアップし、スレーブは「0」または何も送信しない(オープンドレイン出力)ことですが、その後、通常の通信では、単一のスレーブが一度にアクティブである必要があり、アクティブなスレーブは「0」または「1」(通常の出力)を送信する必要があります。したがって、プルアップ抵抗とラインキャパシタンスは、列挙中のビットレートのみを制限します。その後、通常の通信では、アクティブドライビングが許す限り、ビットレートを高くすることができます。
Laszlo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.