SRAM, две микросхемы для чтения / записи

9

Я ищу небольшое устройство объемом 32 КБ SRAM, которое два MCU могут читать или записывать (в разное время; мне не нужно одновременное чтение / запись). Было бы хорошо, если бы он также использовал последовательный интерфейс.

Проблема, которую я пытаюсь решить, - это отправка данных между двумя устройствами, чтобы другое устройство не делало паузу, чтобы получить это. Я бы перенес аудиосэмпл в буфер, затем другой чип при необходимости считывал звук и что-то делал с ним.

Я обнаружил, что серийные SRAM похожи на микрочипы 23A256 / 23K256, однако, похоже, что они имеют один последовательный интерфейс. Есть ли способ получить доступ к двум чипам?

Кроме того, принимающее устройство имеет только 2 КБ свободной памяти данных (максимум), поэтому похоже, что использование DMA или какого-либо подобного механизма передачи через I2C или другой интерфейс не будет работать.

Томас О
источник

Ответы:

10

Вам не нужно двухпортовое ОЗУ или даже последовательное ОЗУ с двумя интерфейсами; Для SPI это немного сложнее, но I2C позволяет использовать несколько мастеров "из коробки". В любом случае, вашему программному обеспечению придется следить за состоянием шины, чтобы определить, не потеряна ли она, и если это так, дождаться другой возможности.

Для SPI линии MOSI, CS и CLK должны иметь три положения (или открытый коллектор) с подтягивающими резисторами, чтобы линии не плавали. Вам также понадобится какой-то автобусный арбитраж. Это может быть так же просто, как один GPIO между двумя мастерами, так что один с более высоким приоритетом сигнализирует мастеру с более низким приоритетом, что шина недоступна, но более элегантным решением будет одна линия с открытым коллектором между мастерами. Когда автобус простаивает, ни один из хозяев не дергает линию вниз, поэтому она поднимается высоко с подтягиванием. Логика в том, что если линия высокая, шина доступна. Мастер, который хочет использовать память, посмотрел бы на линию «доступная шина» и, если она высокая, опустил линию и подождал несколько мс, чтобы убедиться, что другой мастер не захватил шину в то же время. Если линия RAM SPI CS все еще неактивна, можно с уверенностью предположить, что автобус принадлежит вам. Выполните передачу, отключите три линии MOSI / CLK и отпустите сигнал «шина активна».

Необходимо «подождать несколько мс после восстановления низкого уровня строки запроса шины», поскольку оба мастера могут одновременно захватить линию.

Если вы когда-либо используете только одно совместно используемое устройство и это устройство не требует многократных передач, вы можете использовать его линию CS в качестве сигнала «доступная шина», но это не так надежно.

akohlsmith
источник
Но если они оба захватывают линию в одно и то же время и ждут одинаковое количество времени перед передачей, разве это не то же самое, что вообще не ждать?
эндолит
Идея состоит в том, чтобы подождать несколько мс + случайные несколько мс. Предположительно, они будут использовать различное программное обеспечение, и различные задержки / прерывания / и т.д. будут способствовать случайности задержки.
akohlsmith
2
По моему опыту, I2C хорошо работает в среде с несколькими мастерами. Однако он не такой быстрый, как SPI, поэтому, если для достижения вашей цели требуется скорость передачи данных, превышающая 400 кбит / с, вам следует использовать SPI.
RBerteig
1
@endolith: Если оба устройства передают одну и ту же вещь, они не будут знать о существовании друг друга. Если они передают разные вещи, первое устройство, которое передает «1», в то время как другое передает «0», должно обнаружить, что оно проиграло арбитраж, немедленно прекратить передачу и, скорее всего, ожидать повторной передачи всей своей команды с самого начала.
суперкат
3

Самый простой способ - реализовать шину SPI с несколькими мастерами. Вы можете использовать две дополнительные линии ввода / вывода между мастерами для арбитража, используя механизм квитирования.

mjh2007
источник
2

Я вижу два возможных решения вашей проблемы:

1) Найдите чип FIFO, который соответствует вашим потребностям (один пример ). Это может быть непросто / невозможно использовать, поскольку я не знаю, существует ли чип FIFO с простым интерфейсом (например, SPI). Я знаю, что FIFO имеют параллельный интерфейс.

2) Поделитесь упомянутой SRAM от Microchip с двумя мастерами SPI (в двух uController). Когда первый используется, порты SPI в другом uController должны быть с высоким импедансом и наоборот, когда второй uController будет использовать SRAM. Вам понадобится простой интерфейс рукопожатия между uControllers (что-то вроде запроса на чтение / чтения / занятых строк). Это может быть реализовано с использованием 2 или 3 однонаправленных соединений между uControllers. Ваше воображение это предел.

mazurnification
источник
1

Между прочим, один подход, еще не упомянутый для использования с параллельными запоминающими устройствами, состоит в том, чтобы двум или более устройствам были предоставлены фиксированные временные интервалы для доступа к данным. Этот подход использовался во многих компьютерах на базе 6502, выпущенных как Apple, Commodore, так и некоторыми другими поставщиками (не интересно, Atari). Популярный микропроцессор 6502 использовал двухфазные часы и всегда выполнял свои обращения к памяти во второй половине каждого цикла (адрес был доступен в течение первой половины, но данные записывались во второй половине или фиксировались в конце вторая половина). Таким образом, компьютеры Apple и Commodore в течение первой половины каждого цикла памяти будут использовать адрес, сгенерированный видео схемой, фиксируя данные в конце половины; во второй половине каждого цикла они будут использовать адрес, сгенерированный процессором,

Этот подход требовал, чтобы память была в два раза быстрее, чем требовалось бы без чередования памяти, и требовал добавления драйверов с 3 состояниями на адресные выходы процессора (адресные выходы 6502 всегда вели на высокий или низкий уровень), но в остальном он работал очень плавно сделать одну и ту же память доступной как для процессора, так и для внешних схем.

Supercat
источник
0

Есть несколько способов сделать то, что вы хотите.

  • Запрограммируйте другой «буфер MCU», чтобы он находился между вашими двумя процессорами, и буферизируйте связь - что-то вроде «Преобразователя скорости передачи», показанного по адресу http://www.romanblack.com/PICthread.htm . Запрограммируйте его так, чтобы он представлял «двухпортовый» независимый интерфейс с каждой стороны. (Внутренний или внешний) SRAM напрямую связан только с этим буфером MCU.
  • Перепрограммируйте ваш MCU "передатчик", чтобы хранить буфер в SRAM, вместо того, чтобы напрямую отправлять его получателю, и действовать как ведомое устройство, чтобы извлекать данные из этого буфера и отправлять его только тогда, когда ваш MCU "приемник" (действующий как ведущий) запрашивает Это. (Внешний или внутренний) буфер SRAM напрямую подключен только к передатчику. (т.е. объедините функциональность как того, что ваш приемник делает сейчас, так и вышеупомянутый «буфер MCU»).
  • Используйте некоторые линии GPIO, как предложили Эндрю Колсмит и mjh2007, для арбитража между передатчиком и приемником, который получает доступ к общей внешней микросхеме объемом 32 Кбайт SRAM, такой как RAMTRON FM24C256.
davidcary
источник