SRAM, den zwei Chips lesen / schreiben können

9

Ich suche ein kleines SRAM-Gerät mit 32 KB oder so, das zwei MCUs lesen oder schreiben können (zu zwei verschiedenen Zeiten; ich muss nicht gleichzeitig lesen / schreiben). Es wäre gut, wenn es auch eine serielle Schnittstelle verwenden würde.

Das Problem, das ich zu lösen versuche, besteht darin, Daten zwischen zwei Geräten zu senden, ohne dass das andere Gerät eine Pause einlegen muss, um diese zu empfangen. Ich würde ein Audio-Sample in den Puffer übertragen, dann würde der andere Chip nach Bedarf das Audio auslesen und etwas damit machen.

Ich habe serielle SRAMs wie die 23A256 / 23K256 von Microchip gefunden, sie scheinen jedoch eine einzige serielle Schnittstelle zu haben. Gibt es eine Möglichkeit, zwei Chips darauf zugreifen zu lassen?

Darüber hinaus verfügt das empfangende Gerät nur über 2 KB freien Datenspeicher (maximal), sodass die Verwendung von DMA oder eines ähnlichen Übertragungsmechanismus über I2C oder eine andere Schnittstelle nicht funktioniert.

Thomas O.
quelle

Antworten:

10

Sie benötigen keinen Dual-Port-RAM oder sogar einen seriellen RAM mit zwei Schnittstellen. Für SPI ist es etwas kniffliger, aber I2C erlaubt mehrere Master "out of the box". In jedem Fall muss Ihre Software die Busbedingungen überwachen, um festzustellen, ob der Bus verloren gegangen ist, und in diesem Fall auf eine andere Gelegenheit warten.

Für SPI müssen die MOSI-, CS- und CLK-Leitungen mit Pull-up-Widerständen dreifach angegeben (oder mit offenem Kollektor) sein, damit die Leitungen nicht schweben. Sie benötigen auch eine Art Bus-Schiedsverfahren. Dies kann so einfach sein wie ein einzelner GPIO zwischen den beiden Mastern, sodass der mit der höheren Priorität dem Master mit der niedrigeren Priorität signalisiert, dass der Bus nicht verfügbar ist. Eine elegantere Lösung wäre jedoch eine einzelne Open-Collector-Leitung zwischen den Mastern. Wenn der Bus im Leerlauf ist, zieht keiner der Master die Leitung nach unten, sodass sie mit einem Pull-up hoch schwebt. Die Logik ist, dass der Bus verfügbar ist, wenn die Leitung hoch ist. Der Master, der den Speicher verwenden möchte, prüft die Leitung "Bus verfügbar". Wenn sie hoch ist, fahren Sie die Leitung niedrig und warten Sie einige ms, um sicherzustellen, dass der andere Master den Bus nicht gleichzeitig erfasst hat. Wenn die RAM SPI CS-Leitung noch inaktiv ist, Es kann davon ausgegangen werden, dass der Bus Ihnen gehört. Führen Sie die Übertragung durch, geben Sie Ihre MOSI / CLK-Leitungen in drei Zuständen an und lassen Sie das Signal "Bus aktiv" los.

Das "Warten Sie einige ms, nachdem Sie die Busanforderungsleitung nach unten gezogen haben" ist erforderlich, da beide Master gleichzeitig die Leitung greifen können.

Wenn Sie immer nur ein freigegebenes Gerät verwenden und dieses Gerät nicht mehrere Übertragungen erfordert, können Sie seine CS-Leitung als "Bus verfügbar" -Signal verwenden, dies ist jedoch nicht ganz so robust.

Akohlsmith
quelle
Aber wenn beide gleichzeitig die Leitung ergreifen und vor dem Senden die gleiche Zeit warten, ist es nicht dasselbe, als würden sie überhaupt nicht warten?
Endolith
Die Idee wäre, ein paar ms + ein paar zufällige ms zu warten. Vermutlich würden sie unterschiedliche Software ausführen und verschiedene Latenzen / Interrupts / usw. würden zur Zufälligkeit der Verzögerung beitragen.
Akohlsmith
2
Nach meiner Erfahrung funktioniert I2C gut in einer Multi-Master-Umgebung. Es ist jedoch nicht so schnell wie SPI. Wenn Ihre Leistungsziele also Burst-Übertragungen von mehr als 400 kb / s erfordern, sollten Sie SPI verfolgen.
RBerteig
1
@endolith: Wenn beide Geräte dasselbe übertragen, sind sie sich der Existenz des anderen nicht bewusst. Wenn sie verschiedene Dinge übertragen, sollte das erste Gerät, das eine "1" sendet, während das andere eine "0" sendet, erkennen, dass es die Arbitrierung verloren hat, die Übertragung sofort einstellen und höchstwahrscheinlich damit rechnen, seinen gesamten Befehl von Anfang an erneut zu übertragen.
Supercat
3

Am einfachsten wäre es, einen Multi-Master-SPI-Bus zu implementieren. Sie können zwei zusätzliche E / A-Leitungen zwischen den Mastern für die Arbitrierung mithilfe eines Handshake-Mechanismus verwenden.

mjh2007
quelle
2

Ich sehe zwei mögliche Lösungen für Ihr Problem:

1) Finden Sie einen FIFO-Chip, der für Ihre Anforderungen geeignet ist (ein Beispiel ). Die Verwendung ist möglicherweise nicht einfach / möglich, da ich nicht weiß, ob ein FIFO-Chip mit einfacher Schnittstelle (z. B. SPI) vorhanden ist. Die mir bekannten FIFOs haben eine parallele Schnittstelle.

2) Teilen Sie den erwähnten SRAM von Microchip mit zwei SPI-Mastern (in zwei uControllern). Wenn der erste verwendet wird, müssen die SPI-Ports in einem anderen uController hochohmig sein und umgekehrt, wenn der zweite uController den SRAM verwendet. Sie benötigen eine einfache Handshake-Schnittstelle zwischen uControllern (z. B. Leseanforderung / Lesen erledigt / Besetzt). Dies kann mithilfe von 2 oder 3 unidirektionalen Verbindungen zwischen uControllern implementiert werden. Ihrer Fantasie sind keine Grenzen gesetzt.

Mazurnifizierung
quelle
1

Übrigens besteht ein Ansatz, der für die Verwendung mit parallelen Speichern noch nicht erwähnt wurde, darin, zwei oder mehr Geräte mit festen Zeitschlitzen für den Zugriff auf Daten zu versehen. Dieser Ansatz wurde in vielen 6502-basierten Computern verwendet, die sowohl von Apple, Commodore als auch von einigen anderen Anbietern (interessanterweise nicht von Atari) hergestellt wurden. Der beliebte 6502-Mikroprozessor verwendete einen Zweiphasentakt und führte seine Speicherzugriffe immer in der zweiten Hälfte jedes Zyklus durch (die Adresse war in der ersten Hälfte verfügbar, aber die Daten wurden in der zweiten Hälfte geschrieben oder am Ende zwischengespeichert die zweite Hälfte). Die Apple- und Commodore-Maschinen würden daher während der ersten Hälfte jedes Speicherzyklus eine von der Videoschaltung erzeugte Adresse verwenden und die Daten am Ende der Hälfte zwischenspeichern; während der zweiten Hälfte jedes Zyklus würden sie die von der CPU erzeugte Adresse verwenden,

Dieser Ansatz erforderte Speicher, der doppelt so schnell war, wie er ohne Speicherverschachtelung erforderlich gewesen wäre, und erforderte das Hinzufügen von 3-Status-Treibern an den Adressausgängen des Prozessors (die Adressausgänge des 6502 wurden immer hoch oder niedrig angesteuert), funktionierte aber ansonsten sehr reibungslos den gleichen Speicher sowohl dem Prozessor als auch externen Schaltkreisen zur Verfügung zu stellen.

Superkatze
quelle
0

Es gibt verschiedene Möglichkeiten, um das zu tun, was Sie wollen.

  • Programmieren Sie eine andere "Puffer-MCU" so, dass sie zwischen Ihren beiden CPUs sitzt und die Kommunikation puffert - so etwas wie der unter http://www.romanblack.com/PICthread.htm gezeigte "Baudrate-Konverter" . Programmieren Sie es so, dass "Dual-Port" auf jeder Seite eine unabhängige Schnittstelle bietet. Der (interne oder externe) SRAM ist nur direkt mit dieser Puffer-MCU verbunden.
  • Programmieren Sie Ihre "Sender" -MCU neu, um einen Puffer im SRAM zu speichern, anstatt ihn direkt an den Empfänger zu senden, und fungieren Sie als Slave, um Daten aus diesem Puffer abzurufen und nur dann zu senden, wenn Ihre "Empfänger" -MCU (als Master) dies anfordert es. Der (externe oder interne) SRAM-Puffer ist nur direkt mit dem Sender verbunden. (dh kombinieren Sie die Funktionalität sowohl dessen, was Ihr Empfänger gerade tut, als auch der oben genannten "Puffer-MCU").
  • Verwenden Sie einige GPIO-Leitungen, wie Andrew Kohlsmith und mjh2007 vorgeschlagen haben, um zwischen dem Sender und dem Empfänger zu entscheiden, die Zugriff auf einen gemeinsam genutzten externen 32-KByte-SRAM-Chip wie den RAMTRON FM24C256 erhalten.
Davidcary
quelle