两个芯片可以读写的SRAM


9

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

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

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

此外,接收设备仅具有2KB的可用数据存储器(最大),因此看起来似乎无法使用DMA或通过I2C或其他接口进行的类似传输机制。

Answers:


10

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

对于SPI,必须使用上拉电阻将MOSI,CS和CLK线设为三态(或集电极开路),以防止线浮动。您还需要某种形式的总线仲裁。这就像两个主机之间的单个GPIO一样简单,因此优先级较高的主机会向优先级较低的主机发出信号,告知该总线不可用,但是更优雅的解决方案是在主机之间使用一条集电极开路。总线空闲时,任何主机都不会将线路拉低,因此上拉时它会浮空。逻辑是,如果线路为高电平,则总线可用。想要使用该存储器的主机将查看“总线可用”线路,如果该总线为高电平,则将该线路驱动为低电平,并等待几毫秒,以确保另一个主机没有同时抓住总线。如果RAM SPI CS线仍然无效,可以肯定地认为公共汽车是您的。进行传输,将MOSI / CLK线置于三态,然后释放“总线活动”信号。

“将总线请求线拉低后等待几毫秒”是必要的,因为两个主站都有可能同时抓住该线。

如果您仅使用一台共享设备,而该设备不需要多次传输,则可以将其CS线路用作“总线可用”信号,但这并不十分可靠。


但是,如果他们都在同一时间抓住线路,并在传输之前等待相同的时间,那是否与根本不等待一样?
endolith

想法是等待几毫秒+随机几毫秒。大概他们将运行不同的软件,并且各种延迟/中断/等都会导致延迟的随机性。
akohlsmith

2
以我的经验,I2C在多主机环境中运行良好。但是,它不如SPI快,因此,如果您的性能目标要求高于400 kb / s的突发传输,则应采用SPI。
RBerteig

1
@endolith:如果两个设备都传输相同的内容,则它们将不会意识到彼此的存在。如果它们发送不同的内容,则第一个发送“ 1”而另一个发送“ 0”的设备应检测到它已失去仲裁,立即停止发送,最有可能期望从头开始重新发送其整个命令。
超级猫

3

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


2

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

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

2)与两个SPI主设备(在两个uController中)共享Microchip提到的SRAM。当第一个使用时,其他uController中的SPI端口必须处于高阻抗状态,而第二个使用Controller时,则相反。您将需要在uController之间使用一些简单的握手接口(类似于读取请求/已完成读取/忙线)。可以使用uController之间的2或3个单向连接来实现。您的想象力是极限。


1

顺便提及,尚未提及的用于并行存储器的一种方法是使两个或多个设备具有固定的时隙来访问数据。这种方法在Apple,Commodore和其他一些供应商(不有趣的是Atari)生产的许多基于6502的计算机中使用。流行的6502微处理器使用两相时钟,并且始终在每个周期的后半段执行其内存访问(地址在前半段可用,但数据将在后半段写入或在后半段锁存)下半年)。因此,Apple和Commodore机器将在每个存储周期的前半部分使用由视频电路生成的地址,在后半部分将数据锁存;在每个周期的后半段,他们将使用CPU生成的地址,

这种方法所需的内存速度是不进行内存交错处理的两倍,并且需要在处理器的地址输出上添加三态驱动器(6502的地址输出始终被驱动为高电平或低电平),但否则运行非常平稳使相同的内存可用于处理器和外部电路。


0

有几种方法可以做您想要的。

  • 对另一个“缓冲MCU”进行编程,使其位于两个CPU之间并缓冲通信-类似于http://www.romanblack.com/PICthread.htm上的“波特率转换器”。对其进行编程,以在每侧提供“双端口”独立接口。(内部或外部)SRAM仅直接连接到该缓冲MCU。
  • 重新编程“发送器” MCU以将缓冲区存储在SRAM中,而不是直接将其发送到接收器,并充当从设备从该缓冲区中提取数据并仅在您的“接收器” MCU(充当主机)请求时发送数据它。(外部或内部)SRAM缓冲区仅直接连接到发送器。(即,将您的接收器正在执行的功能以及上述“缓冲MCU”的功能结合在一起)。
  • 使用Andrew Kohlsmith和mjh2007建议的一些GPIO线,在可以访问共享的外部32 KB SRAM芯片(例如RAMTRON FM24C256)的发送器和接收器之间进行仲裁。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.