深入解析TI EMIFA:NAND Flash状态监控、中断与电源管理实战
1. 项目概述与核心价值
在嵌入式系统开发中,处理器与外部存储器的“对话”效率,直接决定了整个系统的性能上限和响应能力。无论是从NAND Flash中加载启动代码,还是在SDRAM中高速处理数据流,一个高效、可靠的外部存储器接口控制器都是不可或缺的核心枢纽。德州仪器(TI)的EMIFA(External Memory Interface A)正是这样一个角色,它远不止是一个简单的“接线员”,而是一个集成了复杂状态机、可编程时序控制、中断管理和电源管理策略的智能管家。
我接触过不少基于TI C6000或ARM系列处理器的项目,从早期的工业网关到后来的车载信息娱乐系统,EMIFA的配置和调试往往是硬件驱动工程师的“必修课”,也是性能优化的关键战场。很多新手工程师拿到芯片手册,看到EMIFA那几十个寄存器,常常感到无从下手。实际上,理解了其核心设计哲学——通过硬件状态机解放CPU,通过可编程时序适配多样设备,通过中断机制实现异步协同——就能化繁为简。
本文将聚焦EMIFA与NAND Flash交互时的两个高级主题:状态监控与中断响应,以及系统级的电源管理策略。这两个主题是确保系统既“跑得快”又“睡得香”的关键。我们会深入解析NAND Flash状态寄存器(NANDFSR)和中断系统的工作原理,并拆解如何利用自刷新、时钟门控等技术实现动态功耗管理。这些内容不仅是驱动开发的指南,更是进行系统级架构设计时,评估实时性和功耗预算的重要依据。
2. EMIFA与NAND Flash交互的核心机制
要让处理器高效、安全地访问NAND Flash,EMIFA需要解决几个核心问题:如何知道Flash芯片是否准备好数据(状态查询)?如何避免CPU在等待时“空转”(异步等待与中断)?当遇到不常见的Flash芯片时,如何变通(非标准芯片的接口支持)?本节将围绕这三个问题展开。
2.1 NAND Flash状态寄存器(NANDFSR)与忙闲检测
NAND Flash是一种典型的“慢速”设备。当CPU发出读命令后,Flash芯片需要时间从存储单元中读取数据;发出写命令后,则需要更长时间进行编程操作。在这段“忙”的时期内,如果CPU试图去读取数据总线,得到的是无效数据。
2.1.1 硬件信号连接:EMA_WAIT与R/B#
EMIFA设计了一个巧妙的硬件机制来应对这个问题。它提供了一个专用的引脚:EMA_WAIT。在配置为NAND Flash模式时,工程师需要将Flash芯片的R/B#(Ready/Busy#)信号引脚连接到处理器的EMA_WAIT引脚上。
R/B#信号:这是NAND Flash芯片的输出信号。当Flash内部在执行读、写或擦除操作时,此信号被拉低(Busy状态);当操作完成,数据就绪或编程完毕时,此信号恢复为高电平(Ready状态)。EMA_WAIT引脚:作为输入,EMIFA持续采样此引脚的电平。
2.1.2 NANDFSR寄存器:一个直接的观察窗口
NANDFSR寄存器的作用非常简单直接:它实时反映EMA_WAIT引脚的电平状态。软件读取这个寄存器的一位,就能立刻知道当前连接的NAND Flash是“忙”还是“闲”。这为软件轮询(Polling)方式提供了最基础的支撑。
注意:
NANDFSR反映的是EMA_WAIT的原始(Raw)状态。这意味着,无论EMIFA是否配置了扩展等待模式(Extended Wait Mode),也不管异步等待周期配置寄存器(AWCC)中的极性位(WPn)如何设置,NANDFSR的值都只与EMA_WAIT引脚的实际电平相关。这为调试提供了极大的便利,你可以直接读取此寄存器来确认硬件连线是否正确,Flash芯片是否正常工作。
2.1.3 操作流程中的状态切换
理解状态变化对于编写正确的驱动代码至关重要:
- 读操作:CPU通过EMIFA向NAND Flash发送读命令和地址后,Flash的
R/B#信号变低。此时读取NANDFSR会得到“忙”状态。Flash内部开始寻址和读取数据到页缓存。完成后,R/B#变高,NANDFSR显示“就绪”,此时CPU才能通过EMIFA从数据总线上读取到有效数据。 - 写/编程操作:CPU通过EMIFA发送写命令、地址和数据后,Flash的
R/B#信号变低。此时NANDFSR为“忙”。Flash内部开始将页缓存中的数据编程到存储单元中,这个过程比读操作慢得多。编程完成后,R/B#变高,NANDFSR显示“就绪”,标志着此次写操作成功完成,可以发起下一次操作。
2.2 中断机制:从轮询到事件驱动的飞跃
虽然轮询NANDFSR可以工作,但它极大地浪费了CPU资源。CPU需要不断地读取寄存器,在Flash操作的几微秒到几百微秒内,它什么也做不了。这对于多任务或实时性要求高的系统是不可接受的。EMIFA的中断机制就是为了解决这个问题。
2.2.1 等待上升沿中断(Wait Rise Interrupt)
这是与NAND Flash状态监控最相关的中断。当EMIFA检测到EMA_WAIT引脚上发生一个上升沿(从低到高的跳变)时,就会在中断原始状态寄存器(INTRAW)中设置WR(Wait Rise)位。
这个设计的精妙之处在于:它不是检测电平,而是检测边沿。这意味着中断只在状态发生改变(从忙变为就绪)的那一刻触发一次。这完美地匹配了NAND Flash的操作模型:你只需要在操作完成时被通知一次。
关键点:与NANDFSR寄存器不同,WR中断位的设置不受AWCC寄存器中WPn位的影响。无论WPn配置为何种极性(高电平等待还是低电平等待),只要EMA_WAIT引脚上出现了上升沿,WR位就会被置位。这保证了中断触发条件的绝对性和可靠性。
2.2.2 中断的使能与处理流程
仅有原始中断状态是不够的,还需要一套使能和控制机制,防止误触发或管理不同中断源。
- 中断使能:通过设置中断掩码设置寄存器(
INTMSKSET)中的WR_MASK_SET位为1,来使能等待上升沿中断。只有使能后,中断事件才会被提交给CPU。 - 中断状态:有两个寄存器反映中断状态:
INTRAW:记录原始中断事件。只要事件发生,对应位就被置1,无论是否使能。INTMSK:记录已被使能且已发生的中断事件。仅当中断使能且事件发生时,对应位才置1。通常,CPU查询这个寄存器来判断是否有需要处理的有效中断。
- 中断清除:向
INTRAW寄存器中的WR位写入1,可以同时清除INTRAW.WR位和INTMSK.WR_MASKED位。这是一种典型的“写1清0”的中断清除方式。
2.2.3 其他中断源:异步超时与行陷阱
除了等待中断,EMIFA还提供了另外两个重要的中断源,用于增强系统的健壮性:
- 异步超时中断(Asynchronous Timeout):在扩展等待模式下,如果外部设备(如慢速Flash)保持
EMA_WAIT信号有效的时间超过了AWCC.MAX_EXT_WAIT字段设定的最大周期数,EMIFA将强制结束等待并产生超时中断。这可以防止因设备故障导致系统死锁。 - 行陷阱中断(Line Trap):EMIFA只支持线性递增和缓存行回绕两种地址模式。如果DMA或CPU请求了一个不支持的地址模式(如位反转模式),EMIFA会将该请求按线性递增模式处理,同时触发行陷阱中断,通知软件发生了非预期的访问请求。
2.3 与非“CE无关”型NAND Flash的接口变通
NAND Flash市场上有多种型号,其接口时序并非完全统一。TI的EMIFA在设计时,可能为了简化状态机或提高通用性,对某些不常见的时序支持不完整。原文中提到了一种情况:不支持在读取操作的tR时间内需要保持片选(CE#)信号为低的Flash芯片(通常称为“CE Don‘t Care”类型中的一种特殊变体)。
对于这类芯片,标准的EMIFA NAND Flash控制器时序可能无法满足要求。TI手册中提供了一种实用的软件变通方案:
- 硬件连接:不使用EMIFA的
EMA_CS[n](片选)引脚来控制Flash的CE#。而是将一个通用的GPIO引脚连接到Flash的CE#上。 - 软件控制:在驱动程序中,在发起NAND Flash操作(命令、地址、数据周期)之前,先由软件将该GPIO拉低(使能芯片)。然后,通过EMIFA发起标准的访问序列。在所有操作周期完成后,再由软件将GPIO拉高(禁用芯片)。
这种方法将片选信号的控制权从EMIFA硬件时序中剥离出来,交给了软件。软件可以自由控制CE#信号在tR期间保持为低,从而兼容这类特殊的Flash芯片。当然,这增加了软件的开销和复杂性,并且要求GPIO的操作速度足够快,不能影响整体访问时序。这通常是在硬件选型后期发现兼容性问题时的一种补救措施,在原理图设计阶段,应优先选择与EMIFA时序完全兼容的Flash型号。
3. 扩展等待模式与精确的时序控制
当系统需要连接一些响应速度不固定、或比标准异步时序更慢的设备时,简单的固定周期等待可能不够高效。要么设置过长的固定等待时间浪费性能,要么设置过短导致访问失败。EMIFA的扩展等待模式(Extended Wait Mode)提供了一种由外设主动控制等待周期的动态机制。
3.1 扩展等待模式的工作原理
扩展等待模式的核心思想是:让外部设备自己告诉EMIFA:“我还没准备好,请再等等。”
3.1.1 启用与信号监控要启用此模式,需要在对应片选(n=2,3,4,5)的异步配置寄存器(CEnCFG)中设置EW位。一旦启用,EMIFA在执行对该片选空间的内存访问时,会在每个访问周期的选通(Strobe)阶段,持续采样EMA_WAIT引脚。
3.1.2 动态插入等待周期
- 如果
EMA_WAIT信号处于“有效”状态(具体电平由AWCC.WPn位定义,WPn=1时高电平有效,WPn=0时低电平有效),EMIFA会暂停当前周期,插入一个额外的等待时钟周期。 - EMIFA会持续采样
EMA_WAIT,只要它保持有效,就持续插入等待周期。 - 当外部设备使
EMA_WAIT信号变为无效时,EMIFA会结束等待,继续完成当前编程的选通周期剩余部分,然后进入保持(Hold)周期,最终结束本次访问。
这个过程就像两个人交接物品,接收方(外部设备)如果没准备好,就举手示意(拉高EMA_WAIT),交付方(EMIFA)就保持伸手的姿势等待;等接收方放下手(拉低EMA_WAIT),交付方才完成交付动作。
3.2 超时保护机制:MAX_EXT_WAIT
无限等待是危险的,万一外部设备故障,EMA_WAIT信号永远有效,系统就会死锁。为此,EMIFA引入了超时保护机制。
在AWCC寄存器中,有一个MAX_EXT_WAIT字段,用于设定允许扩展等待的最大EMA_CLK周期数。当EMIFA插入的扩展等待周期数达到这个最大值时,无论EMA_WAIT信号状态如何,EMIFA都会强制终止等待,继续执行后续操作,并可以产生一个异步超时中断,通知CPU可能发生了设备故障。
这个值需要根据外设的最长响应时间来谨慎设置。例如,如果某个Flash芯片在最坏情况下的编程时间为200μs,系统EMA_CLK为100MHz(周期10ns),那么MAX_EXT_WAIT至少应设置为200μs / 10ns = 20000个周期。为了留有余地,可以设置为22000。
3.3 关键配置与限制
要成功使用扩展等待模式,有几个关键配置点必须注意:
- 极性匹配:
AWCC寄存器中的WPn位必须正确设置,以匹配EMA_WAIT引脚的有效电平。如果外设在“忙”时拉低EMA_WAIT,则需设置WPn=0(低电平插入等待);反之则设WPn=1。配置错误将导致EMIFA在外设忙时误判为就绪,从而读取到错误数据。 - 最小周期数限制:手册中明确提到,在扩展等待模式下,写操作的建立(W_SETUP)与选通(W_STROBE)周期数之和,以及读操作的建立(R_SETUP)与选通(R_STROBE)周期数之和,都必须大于4。这是因为EMIFA需要一定的初始周期来稳定地址和数据总线,并采样到稳定的
EMA_WAIT信号状态。如果设置小于等于4,EMIFA可能无法正确识别EMA_WAIT的断言,导致时序错误。
4. 数据总线保持与复位初始化
在复杂的嵌入式系统中,总线的稳定性和模块的可靠启动是基础。EMIFA在这两方面都有其独特的设计考虑。
4.1 数据总线保持(Data Bus Parking)
这是一个容易被忽视但很重要的特性。当EMIFA空闲(没有进行读操作)时,它不会让数据总线(EMA_D)悬空(高阻态),而是会持续驱动总线,使其保持在上一次写入的数据值上。
4.1.1 工作原理与优势
- 写操作后:EMIFA驱动总线保持最后写入的数据。
- 读操作期间:当EMIFA发出读命令并断言片选信号时,它会释放(三态)数据总线,以便外部存储设备能够驱动数据。读操作完成后,经过一个短暂的周转时间,EMIFA会重新驱动总线,恢复为总线保持状态。
- 优势:
- 降低功耗:避免了总线引脚因悬空而产生的振荡电流。
- 减少噪声:稳定的电平有助于减少电磁干扰(EMI)。
- 防止误触发:对于某些对输入电平敏感的后级设备,保持稳定电平可以防止意外动作。
4.1.2 自刷新状态下的例外与应对措施存在一个重要的例外情况:当EMIFA处于自刷新状态时,如果执行了一个异步读操作,读操作完成后,EMIFA不会重新驱动数据总线,而是会保持三态。这会导致数据总线悬空,输入引脚处于不确定的浮空状态,可能增加功耗并引发噪声问题。
解决方案:
- 最佳实践:尽量避免在EMIFA自刷新状态下进行异步读操作。如果需要访问内存,先将其退出自刷新模式。
- 硬件加固:如果系统设计无法避免这种情况,必须在硬件上为那16位没有内部上拉电阻的EMIFA数据总线引脚(
EMA_D[15:0])添加外部上拉电阻。电阻值(如10kΩ)需要精心计算,确保在最坏情况下的所有引脚漏电流之和,不会将总线电平拉低到输入高电平阈值(VIH)以下。这通常需要查阅处理器的电气特性手册和所有连接在总线上的设备的漏电流参数。
4.2 复位与初始化流程
EMIFA内存控制器有两个复位信号:CHIP_RST和MOD_G_RST。理解它们的区别对系统稳定启动至关重要。
4.2.1 两种复位信号
CHIP_RST(芯片复位):这是一个全局性的硬复位。当它有效时,会复位EMIFA内部的所有逻辑,包括状态机和所有的内存映射寄存器。这通常对应于整个芯片的上电复位或看门狗复位。MOD_G_RST(模块门控复位):这是一个由电源与睡眠控制器(PSC)发出的局部复位。它只复位EMIFA的状态机,而不会复位其配置寄存器。这用于在系统运行时,单独重启EMIFA模块而不影响其当前配置。
4.2.2 复位期间的访问禁忌与初始化序列
- 访问禁忌:在
CHIP_RST或MOD_G_RST有效期间,绝对禁止任何主设备(如CPU、DMA)对EMIFA控制的内存空间或其配置寄存器进行访问。否则可能导致访问主设备挂起。软件必须确保在触发复位前,所有对EMIFA的访问都已结束。 - FIFO数据丢失:复位发生时,EMIFA内部FIFO中暂存的所有命令和数据都会丢失。软件需要有能力处理或重试因此失败的事务。
- 自动初始化:复位释放后(上升沿),EMIFA会自动开始执行SDRAM的初始化序列。即使这个过程是自动的,软件也必须遵循一个特定的流程(手册第16.2.4.5节),通常是在初始化完成后,对SDRAM配置寄存器(
SDCR)进行特定的写操作,以确认初始化完成并启动正常操作。跳过这一步可能导致SDRAM工作不稳定。
5. 中断处理与系统级考量
EMIFA的中断虽然只有一根线连接到CPU,但其内部可以管理多个事件。理解其多路复用、处理流程以及中断对系统的影响,是编写稳定驱动的基础。
5.1 中断的多路复用与处理
EMIFA将等待上升沿、异步超时和行陷阱这三个中断事件,通过内部逻辑合并成一个中断信号输出。具体这个中断信号连接到CPU的哪个中断输入引脚,需要查阅芯片特定的数据手册。例如,它可能映射到CPU的INT4或INT5。
5.1.1 中断服务程序(ISR)设计要点在中断服务程序中,标准的处理流程如下:
- 判断中断源:读取
INTMSK寄存器,检查WR_MASKED、AT_MASKED、LT_MASKED中哪个位被置1,以确定是哪个事件触发了中断。 - 处理中断:执行相应的操作。
- 对于
WR_MASKED(等待上升沿):通常意味着一个NAND Flash操作(读/写)完成,可以读取数据或发起下一个命令。 - 对于
AT_MASKED(异步超时):意味着外部设备响应超时。应记录错误,可能需要进行设备复位或错误恢复流程。 - 对于
LT_MASKED(行陷阱):意味着软件或DMA发出了不支持的访问模式。应检查程序或DMA配置中的错误。
- 对于
- 清除中断标志:向
INTRAW寄存器中对应的位(WR、AT、LT)写入1,以清除原始中断标志和掩码后的中断标志。这是通知EMIFA中断已被处理的关键步骤。
5.2 系统级时序冲突与仲裁策略
当系统中同时存在SDRAM和异步存储器(如NOR Flash)时,EMIFA需要公平且高效地处理来自不同主设备(CPU、DMA)的请求,同时还要满足SDRAM苛刻的定时刷新要求。这带来了两个主要的系统级挑战。
5.2.1 异步请求的最大时长限制这是一个至关重要的约束。SDRAM需要定期刷新,并且行激活(ACTV)到预充电(PRE)命令之间有时间限制(tRAS)。如果一个异步请求(例如,从一个慢速NOR Flash中读取大量数据)耗时过长,可能会耽误SDRAM的刷新或预充电,导致数据丢失。
因此,任何异步请求的完成时间,不能超过以下两个值中的较小者:
- tRAS:通常是120μs。这是SDRAM一行打开的最长时间。
- 11倍的刷新周期:例如,刷新周期为15.7μs,则11倍约为172.7μs。这是保证不会错过刷新命令的保守时间窗口。
如何保证:这需要驱动工程师和系统架构师共同计算。异步请求的时长由访问周期数 × 单周期时间决定。单周期时间又由配置的建立、选通、保持时间和可能的扩展等待决定。必须确保在最坏情况下(如扩展等待达到MAX_EXT_WAIT),最大的异步请求(EMIFA最大支持16字,在8位数据总线下是64个访问周期)的总时间不超过上述限制。如果超标,可能需要调整异步时序参数,或使用更宽的数据总线,或从软件上限制单次异步访问的数据量。
5.2.2 缓存填充请求的优先级影响现代CPU通常带有指令缓存。当CPU从外部存储器(通过EMIFA映射)执行代码时,会发生缓存行填充请求。EMIFA为这种请求提供了一个高优先级的专用端口。
- 风险一:缓存填充被阻塞:如果有一个高优先级的主设备(如视频处理DMA)持续向EMIFA发起请求,它可能会长时间“霸占”EMIFA,导致CPU的缓存填充请求被延迟,从而造成CPU流水线停滞,严重影响系统实时性。
- 风险二:其他请求被延迟:反之,当一个缓存填充请求正在进行时(特别是填充多字),它会占用EMIFA,此时所有其他来源的请求都会被挂起。如果某个实时性要求高的外设(如音频接口的DMA)正在等待EMIFA响应,就可能错过其数据交换的截止时间。
设计建议:在系统设计时,必须分析所有主设备对EMIFA的访问模式和实时性要求。可以通过调整系统互联(System Interconnect)中的仲裁优先级,或合理规划数据存放位置(将实时性要求最高的数据放在片内SRAM,而非通过EMIFA访问的外部内存),来规避这些风险。
6. 电源管理:实现低功耗的关键
在电池供电或对功耗敏感的嵌入式设备中,EMIFA及其连接的外部存储器(尤其是SDRAM)往往是系统的耗电大户。EMIFA提供了从模块级到芯片级的多层次电源管理手段。
6.1 自刷新模式(Self-Refresh Mode)
这是最常用且最有效的SDRAM省电方式。SDRAM需要不断刷新以保持数据,通常由EMIFA周期性地发送自动刷新命令。
6.1.1 工作原理当软件设置SDRAM配置寄存器(SDCR)中的SR位为1后,EMIFA会完成所有已排队的事务和积压的刷新周期,然后向SDRAM发送一个进入自刷新模式的命令。此后:
- EMIFA停止发送任何刷新命令和时钟。
- SDRAM切换到自刷新状态,使用其内部振荡器来维持最低限度的刷新,功耗大幅降低(通常从几十毫瓦降至几百微瓦)。
- EMIFA自身也进入一种低活动状态,但寄存器配置保持不变,可以快速恢复。
6.1.2 进入与退出流程
- 进入:通过字节写操作(避免触发初始化序列)将
SDCR的高字节中的SR位置1。 - 退出:同样通过字节写操作将
SR位清0。EMIFA会执行必要的恢复时序(满足tXSR时间要求),然后SDRAM恢复正常操作。
6.2 掉电模式(Power Down Mode)
这是一种比自刷新更轻量级的省电模式。在此模式下,EMIFA通过将EMA_SDCKE信号驱动为低电平,使SDRAM进入掉电状态。
- SDRAM掉电状态下,其内部电路大部分关闭,功耗极低,但数据依赖芯片的保持特性,存在丢失风险,且恢复时间很短。
- EMIFA会监控刷新计数器。当需要发送刷新命令时,它会临时拉高
EMA_SDCKE,发送刷新命令,然后再次将其拉低。 - 任何来自主设备的内存访问请求都会导致EMIFA立即退出掉电模式。
掉电模式适用于系统处于短暂空闲、但又需要极快唤醒的场景。
6.3 时钟门控(Clock Gating)与LPSC状态控制
最彻底的省电方式是关闭EMIFA模块的输入时钟。这需要通过电源与睡眠控制器(PSC)和锁相环(PLL)控制器在EMIFA外部实现。EMIFA的本地电源与睡眠控制器(LPSC)模块提供了几种状态来配合此操作。
6.3.1 自动睡眠(Auto Sleep)与自动唤醒(Auto Wake)这是最智能的时钟门控方式,适用于间歇性工作的系统。
- 进入流程:
- 首先,必须将EMIFA和SDRAM置于自刷新模式(设置
SDCR.SR=1)。这是关闭时钟的前提,否则SDRAM数据会丢失。 - 然后,将EMIFA的LPSC状态编程为自动睡眠。PSC/PLL会据此关断EMIFA的核心时钟。
- 首先,必须将EMIFA和SDRAM置于自刷新模式(设置
- 运行机制:在自动睡眠状态下,EMIFA的时钟停止,功耗极低。神奇的是,如果此时有主设备向EMIFA的存储空间发起访问请求,硬件逻辑会自动将LPSC状态切换回使能(Enable),打开时钟,处理完这个请求后,又自动返回自动睡眠状态。这个过程对软件完全透明,实现了按需供电。
6.3.2 同步复位(Sync Reset)与使能(Enable)这是一种更强制性的状态控制。
- 进入流��:
- 同样,先进入自刷新模式。
- 将EMIFA的LPSC状态编程为同步复位。这会复位EMIFA的状态机(但寄存器不重置),并关闭时钟。
- 关键区别:在同步复位状态下,任何对EMIFA的寄存器或内存访问请求都将被忽略,不会像自动睡眠那样触发自动唤醒。这适用于需要确保EMIFA绝对静止的场景。
- 退出:软件必须显式地将LPSC状态编程回使能,然后让EMIFA退出自刷新模式,才能恢复正常操作。
实操心得:在实际项目中,电源管理策略往往是分层的。例如,在系统待机时,可以先让EMIFA进入自刷新模式。如果待机时间较长,再进一步将其LPSC设置为自动睡眠以关闭时钟。在调试时,务必注意操作的顺序:进入低功耗前,必须先确保SDRAM进入自刷新;退出低功耗后,必须等待SDRAM退出自刷新并稳定(满足tXSR时间)后,才能进行正常的存储访问。错误的顺序是导致系统唤醒后数据错误或死机的常见原因。
7. 配置实例与常见问题排查
理论最终要服务于实践。我们以一个具体的硬件连接为例,讲解配置流程,并总结调试过程中常见的“坑”。
7.1 硬件连接与软件配置实例
假设我们需要将EMIFA连接到一个64Mb的SDRAM(三星K4S641632H)和两个8Mb的异步NOR Flash(夏普LH28F800BJ)。连接示意图中,Flash的RDY/BY#信号连接到了EMA_WAIT引脚。
7.1.1 SDRAM接口配置步骤配置SDRAM是EMIFA初始化中最复杂的一环,核心是计算并设置好三个关键寄存器:SDTIMR、SDSRETR和SDRCR。所有计算都基于EMA_CLK的频率(例如100MHz)和SDRAM芯片数据手册中的时序参数。
- 配置PLL与自刷新:首先,通过字节写操作设置
SDCR.SR=1,让SDRAM进入自刷新。然后,安全地调整PLL,将EMA_CLK设置为目标频率(100MHz)。最后,清除SDCR.SR位,退出自刷新。 - 计算并设置
SDTIMR(SDRAM时序寄存器):这是最繁琐的一步。需要根据SDRAM的tRFC、tRP、tRCD、tWR、tRAS、tRC、tRRD等时间参数,计算对应的周期数。公式为:T_XXX >= (tXXX × fEMA_CLK) - 1。计算出的值填入寄存器对应字段。例如,tRAS最小为49ns,在100MHz下,T_RAS >= (49ns * 100) -1 = 4.9 -1 ≈ 4,向上取整为4个周期。 - 计算并设置
SDSRETR(自刷新退出时序寄存器):主要设置T_XS字段,需满足SDRAM从自刷新退出的时间tXSR(通常等于tRC)。计算方式同上。 - 计算并设置
SDRCR(刷新控制寄存器):核心是计算RR(Refresh Rate)值。公式为:RR ≤ fEMA_CLK × tRefresh Period / ncycles。其中,tRefresh Period是刷新周期(如64ms),ncycles是该周期内需要的刷新命令次数(如4096)。计算得RR ≤ 100e6 * 0.064 / 4096 = 1562.5,取整1562,即0x61A。
7.1.2 异步Flash接口配置要点对于连接了EMA_WAIT的Flash,配置相对简单:
- 配置片选空间:选择对应的
CEnCFG寄存器(例如CE3),设置数据位宽、访问模式(通常为“Normal”)、以及读/写的建立、选通、保持时间。这些时间参数需要查阅Flash数据手册。 - 配置等待:在异步等待周期配置寄存器(
AWCC)中,设置WPn位以匹配EMA_WAIT的有效电平(通常Flash忙时为低,故设WPn=0)。如果需要,设置MAX_EXT_WAIT作为超时保护。 - 使能中断:如果需要异步等待,在
INTMSKSET寄存器中使能等待上升沿中断(WR_MASK_SET)和/或异步超时中断(AT_MASK_SET)。
7.2 常见问题与排查技巧实录
在调试EMIFA驱动时,以下问题非常典型:
问题1:读取NAND Flash数据全为0xFF或随机错误。
- 排查思路:
- 检查硬件连接:首先确认
EMA_WAIT(连接Flash的R/B#)信号是否正常。用逻辑分析仪抓取读写时序,看R/B#信号是否在操作后变低,完成后变高。也可以直接读取NANDFSR寄存器,看其值是否随Flash状态变化。 - 检查时序配置:确认
CEnCFG中的建立、选通、保持时间是否满足Flash的最小时序要求。特别是tWP(写脉冲宽度)和tRP(读脉冲宽度)。 - 检查命令序列:NAND Flash操作有严格的命令周期(Command Cycle)、地址周期(Address Cycle)和数据周期(Data Cycle)序列。确保软件发出的命令、地址顺序正确,且每个周期都发生在正确的片选和读写信号组合下。
- 检查中断/轮询:如果使用中断,确认中断服务程序正确清除了中断标志。如果使用轮询,确认轮询的是
NANDFSR寄存器,并且在Flash忙时没有尝试读数据。
- 检查硬件连接:首先确认
问题2:系统运行一段时间后,SDRAM数据出现比特位错误。
- 排查思路:
- 首要怀疑刷新:这是最常见的原因。重新计算
SDRCR中的RR值。确保fEMA_CLK频率计算准确,并且系统没有长时间关闭SDRAM时钟而未将其置于自刷新模式。 - 检查时序裕量:在高温或低温环境下,SDRAM的时序参数会变化。确保
SDTIMR中配置的周期数有足够的裕量(例如,计算值如果是4,实际配置为5或6)。 - 检查电源完整性:用示波器测量SDRAM的电源引脚,看是否有明显的噪声或跌落。EMIFA高速操作时,同步开关噪声(SSN)可能影响供电质量。
- 检查PCB布线:SDRAM的时钟、地址、数据线是否等长?是否做了阻抗控制?过长的走线或严重的反射会导致信号完整性变差。
- 首要怀疑刷新:这是最常见的原因。重新计算
问题3:使能扩展等待模式后,访问异步设备不稳定,时而成功时而失败。
- 排查思路:
- 检查
WPn极性:这是最容易出错的地方。用示波器测量EMA_WAIT信号,确认设备“忙”时是拉高还是拉低,然后核对AWCC.WPn的设置是否与之相反(EMIFA在EMA_WAIT有效时插入等待)。 - 检查最小周期数限制:确认
CEnCFG中W_SETUP + W_STROBE以及R_SETUP + R_STROBE之和是否大于4。如果不满足,EMIFA可能无法正确采样到EMA_WAIT信号。 - 检查
MAX_EXT_WAIT设置:设置是否过小?如果设备在最坏情况下的响应时间超过了这个值,就会发生超时中断,访问被强制终止。根据设备手册的最大“忙”时间,重新计算并增大此值。 - 信号质量问题:
EMA_WAIT信号线是否过长?是否有串扰?可能需要在靠近处理器引脚处加一个上拉或下拉电阻(根据空闲状态)来稳定信号。
- 检查
问题4:系统进入低功耗模式后,无法正常唤醒,或唤醒后SDRAM数据丢失。
- 排查思路:
- 检查进入流程:是否在关闭EMIFA时钟或进入深度睡眠前,先将SDRAM置于了自刷新模式(设置
SDCR.SR=1)?正确的顺序是绝对关键的。 - 检查退出流程:唤醒后,是否在访问SDRAM前,先清除了
SDCR.SR位,并等待了足够的时间(满足tXSR)让SDRAM退出自刷新?很多驱动在清除SR位后没有延迟就直接访问,会导致初始访问失败。 - 检查时钟稳定性:唤醒后,供给EMIFA和SDRAM的时钟是否稳定?PLL是否已经完成锁定?需要在软件流程中确保时钟稳定后再操作EMIFA。
- 检查电源:深度睡眠时,SDRAM的VDD电源是否被切断?如果切断,数据必然丢失,这不是自刷新能解决的。需要确认硬件电源设计。
- 检查进入流程:是否在关闭EMIFA时钟或进入深度睡眠前,先将SDRAM置于了自刷新模式(设置
调试EMIFA相关的问题,一把好的逻辑分析仪和示波器是必不可少的。重点捕获EMA_CLK、EMA_CSn、EMA_WE、EMA_OE、EMA_WAIT以及关键地址和数据线的波形,将其与数据手册中的时序图进行比对,往往能快速定位是配置错误、时序不满足还是信号完整性问题。
