SRAM que dos chips pueden leer / escribir

8

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

El problema que estoy tratando de resolver es el envío de 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 la salida de audio y haría algo con ella.

He encontrado SRAMs en serie como los Microchip 23A256 / 23K256, sin embargo, parecen tener una sola interfaz en serie. ¿Hay alguna manera de tener dos chips accediendo a esto?

Además, el dispositivo receptor solo tiene 2KB 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á.

    
pregunta Thomas O

5 respuestas

9

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 "fuera de la caja". De cualquier manera, su software tendrá que monitorear las condiciones del bus para ver si perdió el bus y, de ser así, esperar otra oportunidad.

Para SPI, las líneas MOSI, CS y CLK deben ser de 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 autobuses. Esto puede ser tan simple como un solo GPIO entre los dos maestros, de modo que el de mayor prioridad señala al maestro de menor prioridad que el bus no está disponible, pero una solución más elegante sería una única línea de colector abierto entre los maestros. Cuando el bus está inactivo, ninguno de los maestros está tirando 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 está alta, baja la línea y espera unos pocos ms para asegurarse de que el otro maestro no haya agarrado el bus al mismo tiempo. Si la línea RAM SPI CS aún está inactiva, puede ser seguro asumir que el bus es suyo. Realice la transferencia, haga un triple estado de sus líneas MOSI / CLK y suelte la señal de "bus activo".

El "esperar unos pocos ms después de eliminar la línea de solicitud de bus baja" es necesario ya que es posible que ambos maestros tomen la línea al mismo tiempo.

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

    
respondido por el akohlsmith
3

La forma más sencilla sería implementar un bus SPI con varios maestros. Puede usar dos líneas de E / S adicionales entre los maestros para el arbitraje mediante un mecanismo de intercambio de información.     

respondido por el mjh2007
2

Veo dos soluciones posibles 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 interfaz simple (como SPI). Los FIFOs que conozco tienen interfaz paralela.

2) Comparta la SRAM mencionada desde 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 intercambio simple entre uControllers (algo así como la solicitud de lectura / lectura hecha / líneas ocupadas). Esto se puede implementar utilizando 2 o 3 conexiones unidireccionales entre uControllers. Tu imaginación es el límite.

    
respondido por el mazurnification
1

Por cierto, un enfoque que aún no se ha mencionado 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 utilizó un reloj de dos fases, y siempre realizó 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 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 y dejarían que la CPU escribiera los datos o los cerrara al final de la mitad.

Este enfoque requería una memoria dos veces más rápida de lo que se hubiera requerido sin el intercalado de memoria, y requirió 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 en alto o bajo) pero de otra manera funcionó muy bien para hacer que la misma memoria esté disponible tanto para el procesador como para los circuitos externos.

    
respondido por el supercat
0

Hay varias formas de hacer lo que quieres.

  • Programe otro "MCU de búfer" para ubicarse entre sus dos CPU y el búfer de la comunicación, algo así como el "convertidor de velocidad de transmisión" que se muestra en enlace . 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 "transmisora" para almacenar un búfer en SRAM, en lugar de enviarlo directamente al receptor, y actuar como esclavo para extraer datos de ese búfer y enviarlo solo cuando su MCU "receptor" (que actúa como un maestro) lo solicita. 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 el "búfer MCU" anterior).
  • Utilice 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 RAMTRON FM24C256.
respondido por el davidcary

Lea otras preguntas en las etiquetas