SRAM que dois chips podem ler / escrever

9

Estou procurando um pequeno dispositivo SRAM de 32 KB ou mais que dois MCUs possam ler ou gravar (em dois momentos diferentes; não preciso de leitura / gravação simultânea). Seria bom se ele também usasse uma interface serial.

O problema que estou tentando resolver é enviar dados entre dois dispositivos sem que o outro dispositivo precise fazer uma pausa para receber isso. Eu transferia uma amostra de áudio para o buffer e o outro chip, conforme necessário, lia a saída de áudio e fazia alguma coisa com ela.

Encontrei SRAMs seriais como o 23A256 / 23K256 da Microchip, no entanto, eles parecem ter uma única interface serial. Existe alguma maneira de ter dois chips acessando isso?

Além disso, o dispositivo receptor possui apenas 2 KB de memória de dados livre (máximo), portanto, parece que usar DMA ou algum mecanismo de transferência semelhante por meio do I2C ou de outra interface não funcionará.

Thomas O
fonte

Respostas:

10

Você não precisa de RAM de porta dupla ou mesmo uma RAM serial com duas interfaces; Para o SPI, é um pouco mais complicado, mas o I2C permite vários mestres "prontos para uso". De qualquer forma, seu software terá que monitorar as condições do barramento para ver se ele perdeu o barramento e, em caso afirmativo, aguardar outra oportunidade.

Para SPI, as linhas MOSI, CS e CLK devem ser de três estados (ou coletor aberto) com resistores de pull-up para impedir que as linhas flutuem. Você também precisará de algum tipo de arbitragem de barramento. Isso pode ser tão simples quanto um GPIO único entre os dois mestres, para que aquele com maior prioridade sinalize ao mestre de menor prioridade que o barramento não está disponível, mas uma solução mais elegante seria uma única linha de coletor aberto entre os mestres. Quando o ônibus está ocioso, nenhum dos mestres puxa a linha para baixo e flutua alto com um pull-up. A lógica é que, se a linha estiver alta, o barramento estará disponível. O mestre que deseja usar a memória examinaria a linha "barramento disponível" e, se estiver alta, diminuiria a linha e esperaria alguns ms para garantir que o outro mestre não pegasse o barramento ao mesmo tempo. Se a linha RAM SPI CS ainda estiver inativa, pode ser seguro assumir que o ônibus é seu. Faça a transferência, triquete suas linhas MOSI / CLK e solte o sinal de "barramento ativo".

A "espera alguns ms após puxar a linha de solicitação de barramento baixa" é necessária, pois é possível que os dois mestres agarrem a linha ao mesmo tempo.

Se você estiver usando apenas um dispositivo compartilhado e esse dispositivo não exigir várias transferências, você poderá usar sua linha CS como sinal de "barramento disponível", mas isso não é tão robusto.

akohlsmith
fonte
Mas se os dois pegam a linha ao mesmo tempo e esperam a mesma quantidade de tempo antes de transmitir, não é o mesmo que não esperar?
endolith 6/10/10
A idéia seria esperar alguns ms + alguns ms aleatórios. Presumivelmente, eles estariam executando software diferente e várias latências / interrupções / etc contribuiriam para a aleatoriedade do atraso.
akohlsmith
2
Na minha experiência, o I2C funciona bem em um ambiente multimestre. Porém, não é tão rápido quanto o SPI; portanto, se suas metas de desempenho exigirem transferências de rajada superiores a 400 kb / s, você deverá perseguir o SPI.
RBerteig 7/10/10
1
@ endolith: Se os dois dispositivos transmitirem a mesma coisa, eles não terão conhecimento da existência um do outro. Se eles transmitem coisas diferentes, o primeiro dispositivo que transmite um "1" enquanto o outro transmite um "0" deve detectar que perdeu a arbitragem, cessar imediatamente a transmissão e provavelmente espera retransmitir todo o seu comando desde o início.
precisa
3

A maneira mais fácil seria implementar um barramento SPI multimestre. Você pode usar duas linhas de E / S adicionais entre os mestres para arbitragem usando um mecanismo de handshake.

mjh2007
fonte
2

Vejo duas soluções possíveis para o seu problema:

1) Encontre o chip FIFO adequado às suas necessidades (um exemplo ). Pode não ser simples / possível de usar, pois não sei se existe um chip FIFO com interface simples (como SPI). Os FIFOs que conheço têm interface paralela.

2) Compartilhe a SRAM mencionada da Microchip com dois mestres SPI (em dois uControllers). Quando o primeiro é usado, as portas SPI em outro uController devem estar em alta impedância e oposto quando o segundo uController usar a SRAM. Você precisará de uma interface simples de handshake entre os uControllers (algo como solicitação de leitura / leitura concluída / linhas ocupadas). Isso pode ser implementado usando 2 ou 3 conexões unidirecionais entre os uControllers. Sua imaginação é o limite.

mazurnificação
fonte
1

Aliás, uma abordagem ainda não mencionada para uso com memórias paralelas é ter dois ou mais dispositivos com intervalos de tempo fixos para acessar dados. Essa abordagem foi usada em muitos computadores baseados em 6502 fabricados pela Apple, Commodore e alguns outros fornecedores (não de maneira interessante, a Atari). O popular microprocessador 6502 usava um relógio de duas fases e sempre realizava seus acessos à memória na segunda metade de cada ciclo (o endereço estava disponível durante a primeira metade, mas os dados seriam gravados durante a segunda metade ou bloqueados no final de A segunda parte). As máquinas Apple e Commodore usariam, durante a primeira metade de cada ciclo de memória, um endereço gerado pelo circuito de vídeo, bloqueando os dados no final da metade; durante a segunda metade de cada ciclo, eles usariam o endereço gerado pela CPU,

Essa abordagem exigia memória duas vezes mais rápida do que seria necessária sem intercalação de memória e exigia a adição de drivers de três estados nas saídas de endereço do processador (as saídas de endereço do 6502 sempre eram conduzidas altas ou baixas), mas, de outra forma, funcionava muito bem disponibilizar a mesma memória ao processador e aos circuitos externos.

supercat
fonte
0

Existem várias maneiras de fazer o que você deseja.

  • Programe outro "buffer MCU" para ficar entre suas duas CPUs e armazene em buffer a comunicação - algo como o "conversor Baudrate" mostrado em http://www.romanblack.com/PICthread.htm . Programe-o para apresentar à "porta dupla" uma interface independente de cada lado. A SRAM (interna ou externa) está diretamente conectada somente a este buffer MCU.
  • Reprograme seu MCU "transmissor" para armazenar um buffer na SRAM, em vez de enviá-lo diretamente para o receptor, e atue como escravo para extrair dados desse buffer e enviá-lo somente quando seu MCU "receptor" (atuando como mestre) solicitar isto. O buffer SRAM (externo ou interno) está conectado diretamente apenas ao transmissor. (ou seja, combine a funcionalidade do que o seu receptor está fazendo agora e o "buffer MCU" acima).
  • Use algumas linhas GPIO, como sugeriram Andrew Kohlsmith e mjh2007, para arbitrar entre o transmissor e o receptor que obtém acesso a um chip SRAM externo de 32 KByte compartilhado, como o RAMTRON FM24C256.
davidcary
fonte