2つのチップが読み書きできるSRAM


9

2つのMCUが読み取りまたは書き込みができる、32KB程度の小型のSRAMデバイスを探しています(2つの異なる時点で、同時の読み取り/書き込みは必要ありません)。シリアルインターフェイスも使用するのが良いでしょう。

私が解決しようとしている問題は、他のデバイスがこれを受信するために一時停止する必要がない2つのデバイス間でデータを送信することです。私はオーディオサンプルをバッファに転送し、必要に応じて他のチップがオーディオを読み取り、それを使って何かを行います。

Microchipの23A256 / 23K256のようなシリアルSRAMを見つけましたが、シリアルSRAMが1つしかないようです。2つのチップがこれにアクセスする方法はありますか?

さらに、受信デバイスには2KBのデータメモリしかありません(最大)ので、I2Cまたは他のインターフェイスを介してDMAまたは同様の転送メカニズムを使用することはできません。

回答:


10

デュアルポートRAMも、2つのインターフェイスを持つシリアルRAMも必要ありません。SPIの場合は少しトリッキーですが、I2Cでは「箱から出して」複数のマスターを使用できます。どちらの方法でも、ソフトウェアはバスの状態を監視して、バスが失われたかどうかを確認し、失われた場合は別の機会を待つ必要があります。

SPIの場合、MOSI、CS、およびCLKラインをプルアップ抵抗でトライステート(またはオープンコレクタ)にして、ラインがフローティングにならないようにする必要があります。また、ある種のバス仲裁も必要になります。これは、2つのマスター間の単一のGPIOのように単純で、優先度の高いマスターが優先度の低いマスターにバスが利用できないことを通知しますが、よりエレガントなソリューションはマスター間の単一のオープンコレクターラインです。バスがアイドル状態のときは、どちらのマスターもラインをヤンクしていないため、プルアップでハイにフロートします。ロジックは、ラインがハイの場合、バスが使用可能であるということです。メモリを使用するマスターは、「バス使用可能」ラインを調べ、それが高い場合はラインをローに駆動し、数ミリ秒待って、他のマスターが同時にバスを取得していないことを確認します。RAM SPI CSラインがまだアクティブでない場合は、バスがあなたのものであると仮定しても安全です。転送を行い、MOSI / CLKラインをトライステートにし、「バスアクティブ」信号を放します。

両方のマスターが同時にラインを取得する可能性があるため、「バス要求ラインをローにヤンクしてから数ms待機する」ことが必要です。

1つの共有デバイスのみを使用していて、そのデバイスが複数の転送を必要としない場合、そのCSラインを「バス使用可能」信号として使用できますが、これはそれほど堅牢ではありません。


しかし、両方が同時に回線をつかみ、送信する前に同じ時間待機する場合、まったく待機しないのと同じではありませんか?
内部石

アイデアは、数ミリ秒+ランダムな数ミリ秒待つことです。おそらくそれらは異なるソフトウェアを実行しており、さまざまな待ち時間/割り込みなどが遅延のランダム性に寄与します。
akohlsmith、

2
私の経験では、I2Cはマルチマスター環境でうまく機能します。ただし、SPIほど高速ではないため、パフォーマンスの目標で400 kb / sを超えるバースト転送が必要な場合は、SPIを追求する必要があります。
RBerteig

1
@endolith:両方のデバイスが同じものを送信する場合、それらは互いの存在を認識しません。それらが異なるものを送信する場合、他が「0」を送信していたときに「1」を送信した最初のデバイスは、アービトレーションが失われたことを検出し、すぐに送信を停止し、コマンド全体を最初から再送信する可能性が高いです。
スーパーキャット2013年

3

最も簡単な方法は、マルチマスターSPIバスを実装することです。マスター間の2つの追加のI / Oラインを使用して、ハンドシェイクメカニズムを使用した調停を行うことができます。


2

私はあなたの問題の2つの可能な解決策を見ます:

1)ニーズに合ったFIFOチップを見つけます(1つの)。シンプルなインターフェイス(SPIなど)を備えたFIFOチップが存在するかどうかわからないので、使用が簡単ではない可能性があります。私が知っているFIFOにはパラレルインターフェイスがあります。

2)Microchipの上記のSRAMを2つのSPIマスター(2つのuController内)と共有します。最初に使用するときは、他のuControllerのSPIポートを高インピーダンスにし、2番目のuControllerがSRAMを使用するときは反対にする必要があります。uController間の単純なハンドシェイクインターフェイスが必要になります(読み取り要求/読み取り完了/ビジーラインなど)。これは、uController間の2つまたは3つの単方向接続を使用して実装できます。あなたの想像力は限界です。


1

ちなみに、パラレルメモリでの使用についてまだ言及されていない1つのアプローチは、データにアクセスするための固定タイムスロットが指定された2つ以上のデバイスを持つことです。このアプローチは、Apple、Commodore、および他の一部のベンダー(興味深いことに、Atariではありません)によって製造された多くの6502ベースのコンピューターで使用されていました。人気の高い6502マイクロプロセッサは2フェーズクロックを使用し、各サイクルの後半で常にメモリアクセスを実行しました(アドレスは前半に利用可能でしたが、データは後半に書き込まれるか、または最後にラッチされました。後半)。したがって、AppleマシンとCommodoreマシンは、各メモリサイクルの前半で、ビデオ回路によって生成されたアドレスを使用し、半分の終わりでデータをラッチします。各サイクルの後半では、CPUによって生成されたアドレスを使用します。

このアプローチには、メモリインターリーブなしで必要な場合の2倍の速度のメモリが必要であり、プロセッサのアドレス出力にトライステートドライバーを追加する必要がありました(6502のアドレス出力は常に高または低に駆動されました)。同じメモリをプロセッサと外部回路の両方で利用できるようにするため。


0

やりたいことを行うにはいくつかの方法があります。

  • 示す「ボーレートコンバータ」のようなもの-プログラムは、他のあなたの二つのCPUの間に座ると、通信をバッファリングするために、「MCUをバッファリング」http://www.romanblack.com/PICthread.htmを。それをプログラムして、「デュアルポート」をそれぞれの側に独立したインターフェースを提供します。(内部または外部)SRAMは、このバッファーMCUにのみ直接接続されます。
  • 「トランスミッター」MCUを再プログラムして、バッファーをレシーバーに直接送信するのではなくSRAMに保存し、スレーブとして機能してそのバッファーからデータをプルし、「レシーバー」MCU(マスターとして機能)が要求したときにのみデータを送信するそれ。(外部または内部)SRAMバッファは、トランスミッタのみに直接接続されます。(つまり、受信機が現在行っている機能と上記の「バッファMCU」の両方の機能を組み合わせます)。
  • Andrew Kohlsmithとmjh2007が示唆したように、RAMTRON FM24C256などの共有の外部32 KByte SRAMチップにアクセスするトランスミッターとレシーバーの間で調停するには、いくつかのGPIOラインを使用します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.