SRAM que dos chips pueden leer / escribir

9

Estoy buscando un pequeño dispositivo SRAM de 32 KB más o menos que dos MCU puedan leer o escribir (en dos momentos diferentes; no necesito lectura / escritura simultánea). Sería bueno si también usara una interfaz en serie.

El problema que estoy tratando de resolver es enviar datos entre dos dispositivos sin que el otro dispositivo tenga que hacer una pausa para recibir esto. Transferiría una muestra de audio al búfer, luego el otro chip, según sea necesario, leería el audio y haría algo con él.

He encontrado SRAM seriales como las 23A256 / 23K256 de Microchip, sin embargo, parecen tener una única interfaz en serie. ¿Hay alguna forma de tener dos chips accediendo a esto?

Además, el dispositivo receptor solo tiene 2 KB de memoria de datos libre (máximo), por lo que parece que usar DMA o algún mecanismo de transferencia similar a través de I2C u otra interfaz no funcionará.

Thomas O
fuente

Respuestas:

10

No necesita RAM de doble puerto o incluso una RAM serie con dos interfaces; Para SPI es un poco más complicado, pero I2C permite múltiples maestros "listos para usar". De cualquier manera, su software tendrá que monitorear las condiciones del autobús para ver si lo perdió y, de ser así, esperar otra oportunidad.

Para SPI, las líneas MOSI, CS y CLK deben tener tres estados (o colector abierto) con resistencias pull-up para evitar que las líneas floten. También necesitará algún tipo de arbitraje de autobús. Esto puede ser tan simple como un solo GPIO entre los dos maestros para que el que tenga mayor prioridad le indique al maestro de menor prioridad que el bus no está disponible, pero una solución más elegante sería una sola línea de colector abierto entre los maestros. Cuando el autobús está inactivo, ninguno de los dos maestros tira de la línea hacia abajo para que flote alto con un pull-up. La lógica es que si la línea es alta, el bus está disponible. El maestro que quiera usar la memoria miraría la línea de "bus disponible" y si es alta, conduzca la línea hacia abajo y espere unos segundos para asegurarse de que el otro maestro no tomó el bus al mismo tiempo. Si la línea RAM SPI CS todavía está inactiva, Puede ser seguro asumir que el autobús es suyo. Realice la transferencia, establezca tres líneas MOSI / CLK y suelte la señal de "bus activo".

Es necesario "esperar unos ms después de tirar de la línea de solicitud del bus a un nivel bajo", ya que es posible que ambos maestros tomen la línea al mismo tiempo.

Si solo usa un dispositivo compartido y ese dispositivo no requiere múltiples transferencias, puede usar su línea CS como señal de "bus disponible", pero esto no es tan robusto.

akohlsmith
fuente
Pero si ambos toman la línea al mismo tiempo y esperan la misma cantidad de tiempo antes de transmitir, ¿no es lo mismo que no esperar?
endolito el
La idea sería esperar unos pocos ms + unos pocos ms aleatorios. Presumiblemente estarían ejecutando un software diferente y varias latencias / interrupciones / etc. contribuirían a la aleatoriedad del retraso.
akohlsmith
2
En mi experiencia, I2C funciona bien en un entorno multimaestro. Sin embargo, no es tan rápido como SPI, por lo que si sus objetivos de rendimiento requieren transferencias de ráfaga superiores a 400 kb / s, debe buscar SPI.
RBerteig
1
@endolith: si ambos dispositivos transmiten lo mismo, no se darán cuenta de la existencia del otro. Si transmiten cosas diferentes, el primer dispositivo que transmite un "1" mientras el otro transmite un "0" debe detectar que ha perdido el arbitraje, dejar de transmitir inmediatamente y lo más probable es que espere retransmitir todo su comando desde el principio.
supercat
3

La forma más fácil sería implementar un bus SPI multimaestro. Puede usar dos líneas de E / S adicionales entre los maestros para el arbitraje utilizando un mecanismo de comunicación.

mjh2007
fuente
2

Veo dos posibles soluciones para su problema:

1) Encuentre el chip FIFO que sea adecuado para sus necesidades (un ejemplo ). Puede que no sea simple / posible de usar, ya que no sé si existe un chip FIFO con una interfaz simple (como SPI). Los FIFO que conozco tienen una interfaz paralela.

2) Comparta la SRAM mencionada de Microchip con dos maestros SPI (en dos uControllers). Cuando se usa por primera vez, los puertos SPI en otro uController deben estar en alta impedancia y opuestos cuando el segundo uController usará la SRAM. Necesitará una interfaz de enlace simple entre uControllers (algo así como solicitud de lectura / lectura realizada / líneas ocupadas). Esto se puede implementar usando 2 o 3 conexiones unidireccionales entre uControllers. Tu imaginación es el limite.

mazurnificación
fuente
1

Por cierto, un enfoque que aún no se menciona para su uso con memorias paralelas es tener dos o más dispositivos con intervalos de tiempo fijos para acceder a los datos. Este enfoque se usó en muchas computadoras basadas en 6502 hechas por Apple, Commodore y algunos otros proveedores (no, curiosamente, Atari). El popular microprocesador 6502 usaba un reloj de dos fases y siempre realizaba sus accesos a la memoria en la segunda mitad de cada ciclo (la dirección estaba disponible durante la primera mitad, pero los datos se escribirían durante la segunda mitad o se bloquearían al final de la segunda mitad). Las máquinas Apple y Commodore utilizarían así durante la primera mitad de cada ciclo de memoria una dirección generada por el circuito de video, enclavando los datos al final de la mitad; durante la segunda mitad de cada ciclo usarían la dirección generada por la CPU,

Este enfoque requería una memoria que era dos veces más rápida de lo que hubiera sido necesario sin intercalar memoria, y requería la adición de controladores de 3 estados en las salidas de dirección del procesador (las salidas de dirección del 6502 siempre se manejaban hacia arriba o hacia abajo) pero de lo contrario funcionaba muy bien para que la misma memoria esté disponible tanto para el procesador como para los circuitos externos.

Super gato
fuente
0

Hay varias formas de hacer lo que quieras.

  • Programe otra "MCU de búfer" para ubicar entre sus dos CPU y amortiguar la comunicación, algo así como el "convertidor de Baudrate" que se muestra en http://www.romanblack.com/PICthread.htm . Programe para presentar "doble puerto" una interfaz independiente en cada lado. La SRAM (interna o externa) está conectada directamente solo a esta memoria intermedia MCU.
  • Reprograme su MCU "transmisor" para almacenar un búfer en SRAM, en lugar de enviarlo directamente al receptor, y actúe como esclavo para extraer datos de ese búfer y enviarlo solo cuando su MCU "receptor" (actuando como maestro) eso. El búfer SRAM (externo o interno) está conectado directamente solo al transmisor. (es decir, combine la funcionalidad de lo que su receptor está haciendo ahora y la "MCU de almacenamiento intermedio" anterior)
  • Use algunas líneas GPIO, como sugirieron Andrew Kohlsmith y mjh2007, para arbitrar entre el transmisor y el receptor que tiene acceso a un chip externo compartido de 32 KByte SRAM como el RAMTRON FM24C256.
davidcary
fuente