两个芯片可以读/写的SRAM

电器工程 图片 记忆 共享总线
2022-01-07 05:11:44

我正在寻找一个 32KB 左右的小型 SRAM 设备,两个 MCU 可以读取或写入(在两个不同的时间;我不需要同时读取/写入。)如果它也使用串行接口会很好。

我要解决的问题是在两台设备之间发送数据,而另一台设备不必暂停接收。我会将音频样本传输到缓冲区中,然后另一个芯片根据需要读取音频并对其进行处理。

我发现像 Microchip 的 23A256/23K256 这样的串行 SRAM,但是,它们似乎只有一个串行接口。有没有办法让两个芯片访问这个?

此外,接收设备只有 2KB 的可用数据内存(最大),因此看起来使用 DMA 或通过 I2C 或其他接口的一些类似传输机制将无法正常工作。

4个回答

您不需要双端口 RAM,甚至不需要具有两个接口的串行 RAM;对于 SPI,它有点棘手,但 I2C 允许多个主机“开箱即用”。无论哪种方式,您的软件都必须监视总线状况以查看它是否丢失了总线,如果是,请等待另一个机会。

对于 SPI,MOSI、CS 和 CLK 线必须为三态(或集电极开路),并带有上拉电阻,以防止线浮动。您还需要某种总线仲裁。这可以像两个主设备之间的单个 GPIO 一样简单,以便具有较高优先级的主设备向低优先级主设备发出总线不可用的信号,但更优雅的解决方案是主设备之间的单个集电极开路线路。当总线空闲时,两个主机都不会拉下线路,因此它会通过上拉电阻浮高。逻辑是,如果线路为高电平,则总线可用。想要使用内存的主机会查看“总线可用”线,如果它为高电平,则将线拉低并等待几毫秒,以确保其他主机没有同时抢占总线。如果 RAM SPI CS 线仍处于非活动状态,可以安全地假设公共汽车是你的。进行传输,将 MOSI/CLK 线设为三态,然后释放“总线激活”信号。

“将总线请求线拉低后等待几毫秒”是必要的,因为两个主控器可能同时抢占线路。

如果您只使用一个共享设备并且该设备不需要多次传输,则可以将其 CS 线用作“总线可用”信号,但这并不那么可靠。

最简单的方法是实现多主 SPI 总线。您可以使用握手机制在主设备之间使用两条额外的 I/O 线进行仲裁。

对于您的问题,我看到了两种可能的解决方案:

1)找到适合您需求的FIFO芯片(一个例子)。由于我不知道是否存在具有简单接口(例如 SPI)的 FIFO 芯片,因此使用它可能并不简单/可能。我知道的 FIFO 有并行接口。

2) 与两个 SPI 主机(在两个 uController 中)共享来自 Microchip 的上述 SRAM。第一个使用时,其他uController的SPI端口必须处于高阻抗状态,第二个uController使用SRAM时相反。您将需要一些 uController 之间的简单握手接口(例如读取请求/读取完成/忙线)。这可以使用 uController 之间的 2 或 3 个单向连接来实现。你的想象力是极限。

顺便说一下,一种尚未提到的与并行存储器一起使用的方法是让两个或更多设备给定固定的时隙来访问数据。Apple、Commodore 和其他一些供应商(有趣的是,不是 Atari)制造的许多基于 6502 的计算机都使用了这种方法。流行的 6502 微处理器使用双相时钟,并且总是在每个周期的后半部分执行其内存访问(地址在前半部分可用,但数据将在后半部分写入或在结束时锁存下半场)。因此,Apple 和 Commodore 机器将在每个内存周期的前半部分使用由视频电路生成的地址,并在半部分结束时锁存数据。在每个周期的后半部分,他们将使用 CPU 生成的地址,

这种方法需要的内存速度是没有内存交错时所需速度的两倍,并且需要在处理器的地址输出上添加三态驱动程序(6502 的地址输出总是被驱动为高电平或低电平),但除此之外它工作得非常顺利为处理器和外部电路提供相同的内存。