1. 项目概述与核心价值
在嵌入式系统开发中,尤其是涉及图形显示、数据采集或通信缓冲的应用,片上SRAM的容量常常捉襟见肘。这时,扩展一片高速、低成本的外部PSRAM(伪静态随机存储器)就成了一个非常实用的选择。然而,将MCU与外部PSRAM高效、稳定地连接起来,远不止是连几根线那么简单,其核心挑战在于时序的精确匹配。MCU的速度动辄上百兆赫兹,而外部存储器的访问延迟(Latency)是纳秒级的,两者如何“对表”?这就引出了我们今天要深入探讨的主角:基于Tiva™ C系列微控制器EPI模块的主机总线模式,以及其中至关重要的iRDY信号与等待状态配置。
我遇到过不少工程师,在调试外部PSRAM时,系统要么跑不起来,要么在连续读写时出现零星的数据错误,调试起来犹如大海捞针。问题的根源,十有八九出在接口时序的配置上,尤其是对iRDY(Input Ready)信号和WAIT引脚的理解与运用不到位。EPI模块的主机总线模式提供了一套高度可配置的机制,允许我们精细地控制每次存储器访问的时序,以适配不同速度、不同型号的PSRAM芯片。这不仅仅是配置几个寄存器那么简单,更是理解MCU如何与异步设备“握手”通信的过程。
本文将从一个资深嵌入式工程师的视角,带你彻底吃透EPI主机总线模式下PSRAM的接口配置。我们会从最基础的原理和信号定义讲起,然后一步步拆解初始化流程,重点攻克iRDY信号的应用、等待状态的计算与配置,并深入分析在突发读写和刷新冲突等复杂场景下的时序行为。最后,我会分享几个在实际项目中踩过的“坑”和调试技巧,目标是让你读完就能动手,配置出一个既稳定又高效的PSRAM接口。
2. 核心原理:主机总线模式与PSRAM接口基础
在深入配置细节之前,我们必须先建立两个核心概念:EPI的主机总线模式是什么,以及PSRAM这种存储器有什么特殊之处。这决定了我们后续所有配置动作的逻辑起点。
2.1 EPI主机总线模式精解
EPI模块是Tiva™微控制器上一个非常灵活的外部并行接口,它可以模拟多种标准总线协议,主机总线模式是其中一种。你可以把它想象成MCU扮演一个“主机”,去主动访问外部像PSRAM、SRAM、NOR Flash这样的“从设备”。在这个模式下,EPI会生成一系列标准的控制信号,如片选(CSn)、地址锁存使能(ALE)、读使能(RDn/OEn)、写使能(WRn)以及字节选择(BSELn)等。
对于PSRAM,我们通常使用16位地址/数据复用的子模式。所谓复用,是指同一组物理引脚(例如EPI0S[15:0])在访问周期的不同阶段,分别传输地址信息和数据信息。这样做的好处是极大地节省了MCU的引脚资源。在地址阶段,ALE信号拉高,外部锁存器(通常是一片74系列锁存器芯片)会抓住此时总线上的地址值并锁存;随后进入数据阶段,ALE变低,同一组总线转而传输读写数据。这种“分时复用”的机制,要求外部电路配合一个锁存器,但对MCU来说,它看到的逻辑视图依然是一个有独立地址和数据总线的标准存储器。
2.2 PSRAM的特性与访问挑战
PSRAM本质上是一种DRAM,但它内部集成了刷新逻辑,对外表现得像SRAM一样简单,无需控制器主动刷新,故称“伪静态”。然而,它的内核仍然是DRAM,这带来了两个关键特性:
- 访问延迟:从给出地址到数据有效,需要固定的几个时钟周期,这就是我们常说的等待状态。
- 内部刷新:虽然不需要外部控制,但PSRAM芯片内部会定期进行刷新操作。如果在刷新周期内发起访问,芯片会通过WAIT(或iRDY)引脚通知主机“请稍等”,导致访问被插入额外的等待周期。
EPI模块的聪明之处在于,它提供了硬件级别的支持来优雅地处理这两个挑战。一方面,我们可以通过配置固定的等待状态(Wait States)来匹配PSRAM的标称访问延迟;另一方面,我们可以启用iRDY功能,让PSRAM通过WAIT引脚动态地告诉EPI“我还没准备好”,从而实现可变延迟,完美应对刷新冲突。理解并正确配置这两者,是保证PSRAM稳定工作的基石。
注意:很多初学者会混淆“等待状态”和“iRDY延迟”。等待状态是MCU主动插入的、固定的延迟周期,用于匹配存储器最典型的访问时间。而iRDY延迟是存储器被动要求的、可变的延迟,主要用于处理刷新冲突等非典型情况。一个用于保障“常态”,一个用于应对“异常”。
3. 信号定义与硬件连接要点
硬件连接是软件配置的物理基础,连错了线,再完美的代码也无济于事。我们重点关注与PSRAM和iRDY相关的关键信号。
3.1 关键信号引脚映射
在16位复用主机总线模式下,EPI引脚的功能是重新分配的。根据你的具体MCU型号(如TM4C129x),需要查阅数据手册的引脚复用表。以下是一个典型的映射关系,用于连接一个16位数据宽度的PSRAM:
- EPI0S[15:0]: 地址/数据复用总线。在ALE有效期间传输地址(A[15:0]),在其他时间传输数据(D[15:0])。
- EPI0S[19:16](可选): 高位地址线(A[19:16])。在复用模式下,这些地址线是独立的,不参与复用。
- EPI0S28 (OEn): 输出使能,低电平有效。读操作时,此信号拉低,指示PSRAM将数据驱动到总线上。
- EPI0S29 (WRn): 写使能,低电平有效。写操作时,此信号拉低,指示PSRAM锁存总线上的数据。
- EPI0S30 (ALE): 地址锁存使能,高电平有效。其上升沿通知外部锁存器捕获当前复用总线上的地址。
- EPI0S31: EPI模块的工作时钟输出(EPICLK)。这个时钟的频率由系统时钟分频得到,是EPI所有时序的基准。
- EPI0S32 (iRDY):输入就绪信号,这是本文的重中之重。此引脚应连接到PSRAM的WAIT输出引脚。当PSRAM因内部刷新等原因无法立即响应访问时,会将WAIT引脚拉低(或拉高,取决于极性配置),EPI检测到此信号后,会自动暂停当前传输,插入等待周期,直到WAIT信号解除。
3.2 iRDY信号连接与电路设计考量
图11-6清晰地展示了iRDY信号的连接方式:PSRAM的WAIT引脚直接连接到MCU的EPI0S32。这里有几个硬件设计上的经验点:
- 上拉/下拉电阻: 务必根据PSRAM数据手册中WAIT引脚的电气特性,决定是否需要外部上拉或下拉电阻。有些PSRAM的WAIT是开漏输出,必须加上拉电阻才能产生有效的高电平。忽略这一点可能导致MCU永远检测不到就绪信号,造成访问超时或失败。
- 信号完整性: iRDY是一个异步输入信号,其跳变沿可能发生在EPICLK的任何时刻。如果PCB走线过长或环境噪声较大,可能引发误触发。在高速或干扰较大的系统中,建议将iRDY信号线走在内层,并远离高速时钟或数据线,必要时可在MCU端添加一个小的RC滤波(如10欧姆电阻串联100pF电容到地),但要注意这会引入微小延迟。
- 多设备共享: 如果你的系统中有多个支持WAIT信号的设备共享EPI总线(不常见),需要确保它们的WAIT引脚是开漏输出并连接在一起,通过一个公共的上拉电阻接到MCU的iRDY引脚,实现“线与”逻辑。任何设备未就绪都会拉低总线。
4. 软件配置全流程拆解
硬件连接妥当后,我们就进入核心的软件配置环节。这个过程就像给EPI模块和PSRAM芯片“配对”,告诉它们彼此应该如何通信。配置必须严格按照步骤进行。
4.1 初始化步骤与寄存器详解
以下是初始化一个16位复用模式PSRAM接口的完整步骤,我会逐一解释每个步骤背后的意图和关键寄存器字段。
步骤1:EPI模块全局初始化首先,我们需要使能EPI模块的时钟,并配置其工作模式。这是通过EPICFG寄存器完成的。
// 假设系统时钟为120MHz,我们想设置EPI时钟为30MHz SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R11; // 使能EPI所在GPIO端口时钟(PORTQ) SYSCTL_RCGCEEPROM_R |= SYSCTL_RCGCEEPROM_R0; // 使能EPI0模块时钟 delay_cycles(3); // 等待时钟稳定 // 配置EPI0S引脚为EPI功能,具体AFSEL和PCTL值需查数据手册 // ... 此处省略具体的GPIO复用配置代码 ... EPI0_CFG = 0x13; // MODE[4:0] = 10011, 选择Host-Bus 16-bit模式这里MODE=0x13是关键,它选择了16位主机总线模式。INTDIV位(在EPICFG中)决定了波特率分频是取整还是四舍五入,对于精确的时钟要求,需要根据公式计算。
步骤2:配置波特率(EPI工作时钟)EPI模块的工作频率(EPICLK)由EPIBAUD寄存器控制。它基于系统时钟(SysClk)分频。
// 目标EPICLK = 30MHz, SysClk = 120MHz // 分频值 N = SysClk / (2 * EPICLK) - 1 = 120 / (2*30) - 1 = 2 - 1 = 1 // COUNT0字段存放的就是这个N值 EPI0_BAUD = 1; // 设置COUNT0 = 1这个时钟是所有EPI时序的基准,后续的等待状态计算都基于EPICLK周期。务必确保你设置的EPICLK频率不超过PSRAM芯片数据手册上标称的最大操作频率,并留有一定余量。
步骤3:配置主机总线16位模式参数接下来,我们需要配置具体的主机总线16位模式寄存器EPIHB16CFG。这里涉及多个关键配置。
// 以配置CS0对应的存储器区域为例,使用EPIHB16CFG寄存器(基址+0x004) uint32_t tempCFG = 0; tempCFG |= (0x0 << 8); // MODE[1:0] = 00, 选择地址数据复用(ADMUX)子模式,这是PSRAM必需的。 tempCFG |= (0x1 << 10); // ALEHIGH = 1, 表示ALE信号高电平有效。 tempCFG |= (0x1 << 14); // BSEL = 1, 启用字节选择信号。这对于16位PSRAM进行8位访问是必要的。 // WRWS和RDWS字段暂时设为0,等待状态稍后结合时间寄存器精细设置。 // WRCRE/RDCRE位也先保持为0,我们稍后再进行PSRAM配置寄存器的读写。 EPI0_HB16CFG = tempCFG; // 写入配置MODE子字段选择复用模式,ALEHIGH定义ALE极性,BSEL启用字节选择以便进行字节操作。
步骤4:准备PSRAM配置寄存器(CR)写入PSRAM芯片内部有一个配置寄存器(CR),我们需要通过EPI总线向它写入特定的值,来告诉PSRAM我们的访问参数(如是否使用iRDY、等待状态数等)。EPI模块专门提供了EPIHBPSRAM寄存器来暂存要写入的数据,并通过WRCRE位触发写入操作。
但这里有一个至关重要的前提:PSRAM的CR寄存器只能在异步模式下编程。因此,在写入CR之前,我们必须确保EPI时钟被门控(暂时停止),以避免在同步模式下误操作。
// 1. 门控EPI时钟,进入异步编程模式 EPI0_HB16CFG |= (0x1 << 13) | (0x1 << 12); // 设置CLKGATE和CLKGATEI位为1 // 2. 配置EPIHBPSRAM寄存器 // 我们需要组合一个22位的值(CR[21:0])写入PSRAM的CR寄存器。 // 根据数据手册和我们的需求来设置每一位: uint32_t psramCRValue = 0; psramCRValue |= (0x2 << 18); // CR[19:18] = 0x2, 表示这是一个配置CR寄存器的命令。 psramCRValue |= (0x1 << 15); // CR[15] = 1, 启用异步访问模式。 psramCRValue |= (0x1 << 14); // CR[14] = 1, **启用iRDY/WAIT功能**。如果不用WAIT信号,则清0。 // CR[13:11] 设置读/写等待状态数。这个值必须与EPI侧的等待状态配置严格匹配! // 假设我们设置固定延迟为3个时钟周期(查表11-10,对应BCR Code 2)。 // 对于固定延迟模式,需要设置CR[13:11] = 0x0 (RWSM=0, RDWS[1:0]=0)。 psramCRValue |= (0x0 << 11); // CR[13:11] = 0x0 psramCRValue |= (0x1 << 10); // CR[10] = 1, 设置WAIT信号极性为低电平有效。这必须与EPI的IRDYINV配置匹配。 psramCRValue |= (0x1 << 8); // CR[8] = 1, 配置为适当的等待配置(与CR[13:11]相关)。 psramCRValue |= (0x7 << 0); // CR[2:0] = 0x7, 因为EPI在PSRAM模式下是连续突发访问。 EPI0_HBPSRAM = psramCRValue; // 将配置值加载到EPI的发送缓冲区CR[14]位是启用iRDY功能的关键。CR[10]定义了WAIT信号的极性,必须与EPI模块EPIHB16CFG寄存器中的IRDYINV位配置一致。CR[13:11]定义的等待状态数,必须与EPI模块自身配置的等待状态(通过RDWS/WRWS等位)在时序上对齐,否则会导致访问失败。表11-10是PSRAM侧固定延迟等待状态的编码表,必须对照使用。
步骤5:执行PSRAM CR寄存器写入将数据准备好后,我们通过设置WRCRE位来触发一次特殊的写操作,这次操作的目标不是PSRAM的存储阵列,而是其内部的配置寄存器。
// 设置WRCRE位,启动对PSRAM CR寄存器的写操作 EPI0_HB16CFG |= (0x1 << 11); // 设置WRCRE位 // 等待传输完成。WRCRE位会在传输完成后由硬件自动清除。 while(EPI0_HB16CFG & (0x1 << 11)) { // 空循环等待。在此期间,不能有任何其他的系统访问或非阻塞读操作干扰! } // 6. 重新使能EPI时钟,退出异步编程模式 EPI0_HB16CFG &= ~((0x1 << 13) | (0x1 << 12)); // 清除CLKGATE和CLKGATEI位警告:在
WRCRE或RDCRE位被置位且尚未清除的这段时间内,绝对不允许有任何其他的系统总线访问(包括DMA)或EPI的非阻塞读操作。任何干扰都可能导致对PSRAM CR寄存器的写入失败或写入错误数据,进而导致后续所有PSRAM访问异常。这是一个非常隐蔽的坑,我曾在早期项目中被它折磨了很久。
步骤6:精细配置EPI侧的等待状态与iRDYPSRAM配置好了,现在需要配置EPI模块自身,让它知道如何与这个已经“设定好参数”的PSRAM通信。这主要涉及EPIHB16CFG和EPIHB16TIME寄存器。
固定等待状态配置:如果我们使用固定延迟(即不依赖iRDY信号动态插入等待),就需要设置
RDWS和WRWS字段。例如,我们之前在PSRAM CR中设置了3个时钟周期的固定延迟(BCR Code 2)。查表11-11可知,在EPI侧,要产生3个EPI时钟周期的数据相位等待,需要设置WRWSM/RDWSM=1且WRWS/RDWS=0x1。// 配置EPIHB16CFG的等待状态字段 EPI0_HB16CFG &= ~(0x3 << 4); // 先清零RDWS字段 EPI0_HB16CFG |= (0x1 << 4); // 设置RDWS = 0x1 (读等待状态) EPI0_HB16CFG &= ~(0x3 << 6); // 先清零WRWS字段 EPI0_HB16CFG |= (0x1 << 6); // 设置WRWS = 0x1 (写等待状态) // 配置EPIHB16TIME的等待状态模式位 EPI0_HB16TIME |= (0x1 << 0); // 设置RDWSM = 1 EPI0_HB16TIME |= (0x1 << 1); // 设置WRWSM = 1这样,EPI在每次读写的数据相位都会主动插入3个时钟周期的等待,与PSRAM的3周期延迟匹配。
iRDY信号相关配置:如果我们启用了PSRAM的WAIT功能(CR[14]=1),并希望EPI能响应它,就需要配置iRDY相关位。
// 配置IRDYINV位,匹配PSRAM CR[10]的极性设置(假设我们设为低电平有效) EPI0_HB16CFG &= ~(0x1 << 9); // 设置IRDYINV = 0,表示iRDY低电平有效(WAIT拉低表示未就绪)。 // 配置IRDYDLY位。这个位控制EPI在采样iRDY信号前插入的延迟周期数。 // 其目的是为了避开总线上的信号建立时间,确保采样稳定。 // IRDYDLY=00: 无延迟 // IRDYDLY=01: 1个EPICLK周期延迟 // IRDYDLY=10: 2个EPICLK周期延迟 // IRDYDLY=11: 3个EPICLK周期延迟 EPI0_HB16TIME |= (0x3 << 2); // 设置IRDYDLY = 0x3, 插入3个周期延迟后再采样iRDY。IRDYDLY的配置非常关键。如果设置得太小,EPI可能在iRDY信号稳定之前就采样,导致误判。如果设置得太大,则会不必要地增加访问延迟。通常需要根据PCB走线延迟和PSRAM的WAIT信号输出时序来调整。图11-5展示了不同IRDYDLY值下,访问被iRDY信号阻塞(Stall)的时序差异。
4.2 突发模式(BURST)配置与优化
为了提高连续读写的效率,EPI支持突发传输模式。在PSRAM模式下,启用突发(BURST位)后,只有一次突发访问中的第一个数据传输需要完整的延迟周期(包括固定的等待状态和可能的iRDY等待),后续的连续数据传输每个只需一个周期,这极大地提升了带宽。
// 启用突发模式 EPI0_HB16CFG |= (0x1 << 3); // 设置BURST位启用BURST位后,图11-7和图11-8所示的突发读/写时序就会生效。可以看到,在第一个数据(DATA0)经历了完整的延迟(Latency)后,DATA1、DATA2、DATA3等数据在每个时钟周期都能被连续传输。
实操心得:突发模式是提升PSRAM吞吐量的利器,但要注意两点:第一,确保你的PSRAM芯片支持突发访问模式;第二,在启用突发模式的同时,不能在同一个
EPIHB16CFG寄存器中设置等待状态配置位(RDWS/WRWS)。突发模式的时序是硬件预定义的,与单独的等待状态配置互斥。
5. 高级话题:iRDY信号在刷新冲突中的关键作用
配置好了固定延迟和突发模式,系统在大部分时间应该能稳定工作。但PSRAM的DRAM内核会定期刷新,这时才是真正考验接口可靠性的时刻。iRDY信号正是为此而生。
5.1 刷新冲突与iRDY响应机制
当PSRAM正在进行内部刷新时,如果MCU恰好发起一次访问,这次访问就会与刷新操作产生冲突。此时,PSRAM无法立即响应访问请求。如果没有iRDY机制,MCU会在固定的等待状态结束后,不管不顾地去读数据总线,读到的将是无效或错误的数据。
启用iRDY后,流程完全不同:PSRAM会在刷新期间,通过拉低(假设低有效)WAIT引脚来通知EPI。EPI在采样到有效的iRDY信号(未就绪)后,会自动暂停当前的传输时序,不断地插入等待周期,直到采样到iRDY信号变为无效(就绪状态),然后才继续完成本次访问。这个过程对软件是完全透明的,硬件自动处理。
图11-9和图11-10分别展示了在读和写操作期间发生刷新冲突的时序。可以看到,在正常的延迟周期之后,因为iRDY信号被PSRAM拉低,EPI自动插入了一个额外的等待状态(One wait state),直到iRDY恢复高电平,数据传输才继续进行。
5.2 可变初始延迟模式配置
为了最大化性能,我们可以利用iRDY信号实现“可变初始延迟”模式。在这种模式下,我们将EPI侧的固定等待状态设置为最小值(例如0或1),而主要依赖PSRAM通过iRDY信号来动态延长第一次访问的延迟。这要求PSRAM的CR寄存器配置为相应的模式。
- PSRAM侧配置:设置
CR[13:11] = 0x2,这通常对应一种可变延迟模式(具体需查PSRAM型号手册)。 - EPI侧配置:将
WRWS和RDWS字段设置为较小的值(如0x0),并将WRWSM和RDWSM位清零。同时,确保IRDYDLY设置合理,且IRDYINV极性正确。 - 工作原理:EPI发起访问后,只插入很少的固定等待。PSRAM如果已就绪,会很快释放WAIT信号,EPI随即完成访问,实现了低延迟。如果PSRAM正在刷新,则通过WAIT信号让EPI等待,实现了延迟的可变扩展。这种模式在访问随机且刷新概率不高的场景下,平均延迟更低。
5.3 时序参数计算与匹配要点
整个配置的核心是时序匹配。你需要根据以下几个关键参数进行计算和核对:
- EPICLK周期(T_epi):由
EPIBAUD寄存器决定。T_epi = (COUNT0 + 1) * 2 / SysClk_Freq。 - PSRAM访问时间(t_AA, t-OE等):从PSRAM数据手册获取,这是芯片的物理特性。
- EPI固定等待状态数(N_ws):由
RDWS/WRWS和RDWSM/WRWSM共同决定,查表11-11。 - 总延迟时间:
T_delay = N_ws * T_epi + T_other。T_other包括地址建立时间、控制信号有效时间等,这些由EPI硬件固定产生。 - 匹配条件:必须满足
T_delay >= max(t_AA, t-OE),即EPI提供的总延迟必须大于等于PSRAM所需的最长访问时间,并留有足够的裕量(通常20%-30%)。
例如,EPICLK=30MHz(T_epi≈33.3ns),PSRAM的t_AA=70ns。那么至少需要70ns / 33.3ns ≈ 2.1个周期,即需要配置3个等待状态(N_ws=3)。查表11-11,需要设置RDWSM=1且RDWS=0x1。
6. 调试技巧与常见问题排查实录
理论配置完成,但系统可能仍不工作。以下是我在多个项目中总结的调试清单和问题定位方法。
6.1 硬件连接检查
- 电源与地:首先用万用表确认PSRAM的VCC和GND引脚电压稳定,纹波在允许范围内。不稳定的电源是许多灵异问题的根源。
- 信号连通性:使用示波器或逻辑分析仪,检查关键控制信号(ALE, CSn, WRn, RDn)是否已经连接到PSRAM和锁存器(如果使用)的正确引脚。特别注意复用总线是否连接到了PSRAM的地址/数据复用引脚(通常是A/DQ[15:0])。
- iRDY/WAIT连线:确认MCU的EPI0S32是否确实连接到了PSRAM的WAIT引脚。检查WAIT引脚是否需要上拉电阻。
6.2 软件配置与信号抓取
- 初始化顺序:务必严格遵守第4.1节的初始化步骤。特别是门控时钟(CLKGATE)后再写PSRAM CR寄存器,写完再打开时钟。顺序错误会导致配置无法写入。
- 示波器/逻辑分析仪抓取时序:这是最直接的调试手段。
- 触发设置:以CSn下降沿或ALE上升沿作为触发源。
- 观察信号:
- ALE和地址:在ALE高电平期间,复用总线上是否出现了正确的地址值?
- CSn, WRn, RDn:它们的时序关系是否符合数据手册的波形图(参考图11-7, 11-8)?脉冲宽度是否足够?
- 数据总线:在读周期,数据是否在RDn上升沿之前稳定?在写周期,数据是否在WRn低电平期间保持稳定?
- iRDY信号:在访问期间,iRDY信号是否有被拉低的情况?其持续时间是否与
IRDYDLY设置匹配?
- 使用GPIO模拟调试:如果时序非常复杂,可以暂时将EPI配置为GPIO模式,用软件位敲(Bit-Banging)的方式模拟出最基础的读写时序,先验证PSRAM芯片本身和硬件连接是好的。然后再切换到EPI硬件控制模式,对比波形。
6.3 常见问题速查表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| 读写全部失败,数据全为0或0xFF | 1. 片选CSn信号未连接或配置错误。 2. PSRAM未上电或损坏。 3. 初始化流程错误,PSRAM未进入工作模式。 | 1. 检查CSn引脚连接,用示波器看是否有跳变。 2. 检查电源电压,测量PSRAM静态电流。 3. 单步调试,确认PSRAM CR寄存器写入流程成功(可通过回读验证)。 |
| 随机单个数据错误 | 1. 时序裕量不足,处于临界状态。 2. 电源噪声或地线干扰。 3. 总线负载过重,信号边沿变差。 | 1. 增加等待状态(RDWS/WRWS)或降低EPICLK频率。2. 检查电源去耦电容,在PSRAM电源引脚就近加0.1uF和10uF电容。 3. 检查PCB走线,确保数据线等长,减少过孔和分支。 |
| 突发读写时,第二个及之后数据错误 | 突发模式配置或时序问题。 | 1. 确认PSRAM支持突发模式,且CR寄���器已正确配置(如CR[2:0])。 2. 检查 BURST位是否已启用,且与等待状态配置位冲突。3. 抓取突发读写时序,对比图11-7/11-8,看连续数据周期是否符合预期。 |
| 系统运行一段时间后死机或数据错乱 | 1. 刷新冲突处理不当,iRDY未正确配置或响应。 2. 软件在WRCRE操作期间进行了其他访问。 | 1. 确认CR[14]已置1启用WAIT,IRDYINV极性正确,IRDYDLY设置合理。抓取iRDY信号看刷新期间是否有动作。2. 检查代码,确保在 WRCRE位置位到清除期间,没有其他任何总线访问(包括中断服务程序中的访问)。 |
| 只能读写低8位或高8位数据 | 字节选择(BSEL)信号问题。 | 1. 确认EPIHB16CFG寄存器中的BSEL位已启用。2. 检查BSEL0n和BSEL1n引脚是否正确连接到了PSRAM的UB#和LB#(或类似)引脚。 3. 确认软件进行字节访问时,地址是否正确(字节访问时地址LSB有效)。 |
6.4 性能优化建议
- 在速度与稳定性间权衡:首先以保证稳定为第一要务。在满足PSRAM最差时序(包括刷新冲突带来的额外延迟)的前提下,尽可能提高EPICLK频率并减少固定等待状态。可以先用保守参数让系统跑起来,再逐步收紧时序进行压力测试。
- 利用突发传输:对于大数据块的连续访问(如图像缓冲区操作),务必启用
BURST模式,这能带来数倍的带宽提升。 - 考虑使用可变延迟模式:如果PSRAM支持且你的应用对访问延迟敏感,可以尝试配置为可变初始延迟模式,让iRDY信号动态管理延迟,在多数无刷新冲突的情况下获得更快响应。
- 关注
IRDYDLY:这个参数对iRDY功能的可靠性影响很大。如果系统不稳定,可以尝试增大IRDYDLY值,给iRDY信号更多的稳定时间。