SRAM quali due chip possono leggere / scrivere


9

Sto cercando un piccolo dispositivo SRAM di circa 32 KB che due MCU possano leggere o scrivere (in due momenti diversi; non ho bisogno di lettura / scrittura simultanea). Sarebbe bello se usasse anche un'interfaccia seriale.

Il problema che sto cercando di risolvere è l'invio di dati tra due dispositivi senza che l'altro dispositivo debba fare una pausa per riceverlo. Trasferirei un campione audio nel buffer, quindi l'altro chip, come richiesto, leggerebbe l'audio e farebbe qualcosa con esso.

Ho trovato SRAM seriali come 23A256 / 23K256 di Microchip, tuttavia sembrano avere un'unica interfaccia seriale. C'è un modo per avere due chip accedendo a questo?

Inoltre, il dispositivo ricevente ha solo 2 KB di memoria dati libera (massimo), quindi sembra che l'utilizzo di DMA o un meccanismo di trasferimento simile tramite I2C o un'altra interfaccia non funzionerà.

Risposte:


10

Non hai bisogno di RAM a doppia porta o anche di una RAM seriale con due interfacce; Per SPI è un po 'più complicato, ma I2C consente a più master "pronti all'uso". In entrambi i casi, il software dovrà monitorare le condizioni del bus per vedere se ha perso il bus e, in tal caso, attendere un'altra opportunità.

Per SPI, le linee MOSI, CS e CLK devono essere tri-dichiarate (o open-collector) con resistenze pull-up per impedire alle linee di fluttuare. Sarà inoltre necessario un tipo di arbitrato del bus. Questo può essere semplice come un singolo GPIO tra i due master in modo che quello con priorità più alta segnali al master con priorità inferiore che il bus non è disponibile, ma una soluzione più elegante sarebbe una singola linea a collettore aperto tra i master. Quando l'autobus è inattivo, nessuno dei due master sta abbassando la linea in modo che fluttui in alto con un pull-up. La logica è che se la linea è alta, il bus è disponibile. Il master che desidera utilizzare la memoria guarderebbe la linea "bus disponibile" e, se è alto, spingere la linea in basso e attendere qualche ms per assicurarsi che l'altro master non abbia preso il bus contemporaneamente. Se la riga RAM SPI CS è ancora inattiva, può essere sicuro supporre che l'autobus sia tuo. Effettua il trasferimento, tri-state le tue linee MOSI / CLK e lascia andare il segnale "bus attivo".

È necessario "attendere qualche ms dopo aver abbassato la linea di richiesta bus" poiché è possibile per entrambi i master afferrare la linea contemporaneamente.

Se si utilizza sempre un solo dispositivo condiviso e tale dispositivo non richiede trasferimenti multipli, è possibile utilizzare la sua linea CS come segnale "bus disponibile", ma questo non è altrettanto robusto.


Ma se entrambi afferrano la linea contemporaneamente e attendono lo stesso tempo prima di trasmettere, non è lo stesso che non aspettare affatto?
endolith

L'idea sarebbe quella di attendere qualche ms + qualche casuale ms. Presumibilmente avrebbero eseguito software diversi e varie latenze / interruzioni / ecc. Avrebbero contribuito alla casualità del ritardo.
akohlsmith,

2
Nella mia esperienza, I2C funziona bene in un ambiente multi-master. Non è veloce come SPI, tuttavia, quindi se i tuoi obiettivi di prestazione richiedono trasferimenti burst migliori di 400 kb / s, dovresti perseguire SPI.
RBerteig,

1
@endolith: se entrambi i dispositivi trasmettono la stessa cosa, non saranno consapevoli dell'esistenza reciproca. Se trasmettono cose diverse, il primo dispositivo che trasmette uno "1" mentre l'altro sta trasmettendo uno "0" dovrebbe rilevare che ha perso l'arbitrato, interrompere immediatamente la trasmissione e molto probabilmente si aspetta di ritrasmettere l'intero comando dall'inizio.
supercat

3

Il modo più semplice sarebbe implementare un bus SPI multi-master. È possibile utilizzare due linee I / O aggiuntive tra i master per l'arbitrato utilizzando un meccanismo di sincronizzazione.


2

Vedo due possibili soluzioni per il tuo problema:

1) Trova il chip FIFO adatto alle tue esigenze (un esempio ). Potrebbe non essere semplice / possibile da utilizzare in quanto non so se esistono chip FIFO con interfaccia semplice (come SPI). Le FIFO che conosco hanno un'interfaccia parallela.

2) Condividi la citata SRAM di Microchip con due master SPI (in due controller u). Quando viene utilizzato per la prima volta, le porte SPI in altri uController devono essere ad alta impedenza e al contrario quando il secondo uController utilizzerà SRAM. Avrai bisogno di una semplice interfaccia di handshake tra uController (qualcosa come la richiesta di lettura / lettura fatta / linee occupate). Questo può essere implementato usando 2 o 3 connessioni unidirezionali tra uController. La tua immaginazione è il limite.


1

Per inciso, un approccio non ancora menzionato per l'uso con memorie parallele è quello di avere due o più dispositivi dotati di intervalli di tempo fissi per accedere ai dati. Questo approccio è stato utilizzato in molti computer basati su 6502 realizzati da Apple, Commodore e alcuni altri fornitori (non, cosa interessante, Atari). Il popolare microprocessore 6502 utilizzava un orologio a due fasi e eseguiva sempre gli accessi alla memoria nella seconda metà di ogni ciclo (l'indirizzo era disponibile durante la prima metà, ma i dati sarebbero stati scritti durante la seconda metà o bloccati alla fine di la seconda metà). Le macchine Apple e Commodore avrebbero quindi usato nella prima metà di ogni ciclo di memoria un indirizzo generato dai circuiti video, bloccando i dati alla fine della metà; durante la seconda metà di ogni ciclo userebbero l'indirizzo generato dalla CPU,

Questo approccio richiedeva una memoria due volte più veloce di quanto sarebbe stato necessario senza interleaving di memoria e richiedeva l'aggiunta di driver a 3 stati sulle uscite degli indirizzi del processore (le uscite degli indirizzi del 6502 erano sempre guidate su o giù) ma altrimenti funzionava in modo molto fluido per rendere la stessa memoria disponibile sia per il processore che per i circuiti esterni.


0

Esistono diversi modi per fare ciò che vuoi.

  • Programmare un altro "buffer MCU" in modo che si collochi tra le due CPU e bufferizzi la comunicazione - qualcosa come il "convertitore Baudrate" mostrato su http://www.romanblack.com/PICthread.htm . Programmalo per presentare "dual-port" un'interfaccia indipendente su ciascun lato. La SRAM (interna o esterna) è direttamente collegata solo a questa MCU buffer.
  • Riprogrammare l'MCU "trasmettitore" per memorizzare un buffer in SRAM, invece di inviarlo direttamente al ricevitore, e agire come uno schiavo per estrarre i dati da quel buffer e inviarlo solo quando l'MCU "ricevitore" (che funge da master) richiede esso. Il buffer SRAM (esterno o interno) è direttamente collegato solo al trasmettitore. (ovvero, combina la funzionalità sia di ciò che sta facendo il tuo ricevitore, sia del "buffer MCU" sopra).
  • Utilizzare alcune linee GPIO, come suggerito da Andrew Kohlsmith e mjh2007, per arbitrare tra il trasmettitore e il ricevitore che ottengono l'accesso a un chip SRAM esterno da 32 KByte come RAMTRON FM24C256.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.