异步EMIF接口时序配置与NAND Flash访问实践详解

发布时间:2026/7/26 17:21:44
异步EMIF接口时序配置与NAND Flash访问实践详解 1. 异步外部存储器接口EMIF核心概念与选型考量在嵌入式系统开发中处理器与外部存储器的连接是决定系统性能与稳定性的关键一环。异步外部存储器接口EMIF作为连接处理器与外部异步存储设备如SRAM、NOR Flash、NAND Flash的桥梁其核心职责是精确地协调地址、数据和控制信号的时序确保数据交换的准确无误。与同步接口如SDRAM控制器不同异步接口没有统一的时钟信号进行同步因此其时序完全由处理器侧即EMIF通过一系列可配置的延时参数来控制这赋予了设计者极大的灵活性也带来了配置上的复杂性。EMIF通常支持多种操作模式以适应不同存储设备的时序特性。其中选通模式Select Strobe Mode是一种高效且常用的模式。在该模式下传统的片选信号EM_CS被赋予了新的角色——它不再在整个访问周期内保持有效而是仅在数据选通期间Strobe Period被激活。这种设计可以显著减少信号线上的无效活动时间降低功耗和电磁干扰尤其在对时序要求严格或需要低功耗的应用场景中优势明显。模式的选择通过配置异步配置寄存器AnCR中的SS位来实现SS0为常规模式SS1则进入选通模式。在实际项目中选择使用EMIF的哪种模式主要基于目标存储器的数据手册和系统整体需求。例如连接一块老式的异步SRAM其数据手册要求片选信号在地址建立后、整个读写周期内保持有效那么常规模式可能更合适。而如果连接的是一个对片选信号下降沿和上升沿敏感的NAND Flash器件或者系统对功耗有严格要求选通模式则是更优的选择。理解这两种模式的本质区别是进行正确配置的第一步。2. 选通模式Select Strobe Mode下的时序配置详解选通模式的核心在于将一次完整的存储器访问周期清晰地划分为三个可独立配置的时间段建立时间Setup、选通时间Strobe和保持时间Hold。这三个参数直接决定了EMIF控制信号如EM_CS, EM_OE, EM_WE与地址/数据信号之间的相对时序关系必须根据外部存储器的时序要求进行精确计算和设置。2.1 关键时序参数解析与计算这三个参数存储在异步配置寄存器AnCR中分为读操作和写操作两组分别对应R_SETUP/R_STROBE/R_HOLD和W_SETUP/W_STROBE/W_HOLD。它们的单位是EMIF模块的工作时钟周期。建立时间Setup 指地址信号EM_A, EM_BA和数据信号对于写操作有效之后到选通信号EM_CS和EM_OE或EM_WE有效变为低电平之间的时钟周期数。这段时间确保了外部存储器有足够的时间来锁存稳定的地址。选通时间Strobe 指选通信号保持有效的时钟周期数。对于读操作这是EM_OE输出使能为低电平的时间外部存储器在此期间将数据驱动到数据总线上对于写操作这是EM_WE写使能为低电平的时间EMIF在此期间将数据驱动到总线上供存储器锁存。这是数据实际被传输的窗口。保持时间Hold 指选通信号无效变为高电平之后地址和数据信号继续保持有效的时钟周期数。这段时间确保了外部存储器有足够的时间在控制信号变化后仍然能可靠地完成数据的锁存或读取。如何确定这些值这需要查阅你所使用的外部存储器的数据手册。以一款典型的异步SRAM为例其数据手册会给出如下关键参数t_{RC}(Read Cycle Time): 读周期时间。t_{AA}(Address Access Time): 从地址有效到数据有效的时间。t_{OE}(Output Enable Access Time): 从OE#有效到数据有效的时间。t_{OH}(Output Hold Time): OE#无效后数据保持时间。t_{WC}(Write Cycle Time): 写周期时间。t_{WP}(Write Pulse Width): 写使能脉冲宽度。t_{DS}(Data Setup Time): 数据建立时间相对于WE#的上升沿。t_{DH}(Data Hold Time): 数据保持时间相对于WE#的上升沿。配置时EMIF的时序参数必须满足存储器的最小时序要求。一个简化的计算示例如下假设EMIF时钟周期为T_{EMIF}读操作R_STROBEceil(t_{OE} / T_{EMIF})。必须确保选通时间OE有效时间长于存储器的t_{OE}。R_HOLDceil(t_{OH} / T_{EMIF})。必须确保OE无效后地址保持时间能满足存储器的t_{OH}。R_SETUP通常设置为1-2个周期确保地址稳定。写操作W_STROBEceil(t_{WP} / T_{EMIF})。写脉冲宽度必须满足存储器要求。W_HOLDceil(t_{DH} / T_{EMIF})。确保数据保持时间。W_SETUPceil(t_{DS} / T_{EMIF})。确保数据建立时间。注意 实际配置中必须考虑PCB走线延迟、信号完整性等因素通常会在计算值上增加一定的裕量例如1-2个时钟周期以确保在最坏工况下的稳定性。2.2 读操作与写操作的信号行为对比在选通模式下读操作和写操作的信号序列有显著区别理解这些区别对于调试硬件问题至关重要。异步读操作流程翻转周期Turnaround EMIF收到读请求后首先插入由AnCR中TA字段定义的等待周期。例外情况如果当前读操作紧接在另一个对同一片选空间的读操作之后则不插入翻转周期如果TA字段为0且前一个操作不是读则插入1个周期。建立期开始 地址总线EM_A, EM_BA变为有效。R_SETUP、R_STROBE、R_HOLD值被载入。选通期开始EM_CS和EM_OE同时变为低电平。这是选通模式的特征EM_CS在此刻起到选通作用。保持期开始 EM_CS和EM_OE同时变为高电平。EMIF在此时刻采样数据总线EM_D上的数据。保持期结束 地址总线变为无效。异步写操作流程翻转周期 逻辑与读操作类似但针对写操作序列。建立期开始 地址总线EM_A, EM_BA和数据总线EM_D变为有效。EM_RW引脚拉低若之前未拉低表示写操作。W_SETUP等参数被载入。选通期开始EM_CS和EM_WE同时变为低电平。保持期开始 EM_CS和EM_WE同时变为高电平。保持期结束 地址总线和数据总线变为无效。如果当前请求完成EM_RW引脚拉高。关键区别与注意事项控制信号 读操作使用EM_OE写操作使用EM_WE。在选通模式下它们都与EM_CS同步动作。数据总线驱动方 读操作时数据总线由外部存储器驱动EMIF在保持期开始时采样写操作时数据总线由EMIF在建立期开始驱动直到保持期结束。EM_RW引脚 这是一个指示读写方向的状态信号在写操作建立期开始时被拉低在整个写操作序列期间保持低电平直到该次多字节写入请求完全结束。在读操作期间它始终被驱动为高电平。3. NAND Flash设备的接口配置与操作NAND Flash因其高容量、低成本的特点在嵌入式系统中广泛用于存储程序代码、文件系统等。但NAND Flash接口与传统的SRAM/NOR Flash不同它采用复用的命令/地址/数据总线并通过专用的控制信号CLE, ALE来区分总线上的内容类型。EMIF的NAND Flash模式正是为了适配这种接口而设计。3.1 NAND Flash模式使能与基础连接首先需要将对应的片选空间配置为NAND Flash模式。这是通过设置NAND Flash控制寄存器NANDFCR中对应的CSnNAND位例如CS2NAND为1来实现的。每个片选空间可以独立配置。硬件连接上需要将EMIF的地址线复用为NAND Flash的控制信号。通常建议使用EM_A[2]连接NAND的CLE命令锁存使能EM_A[1]连接ALE地址锁存使能。这是因为这些引脚通常没有与其他外设复用在系统启动时即可用。EM_CS[n]连接NAND的CE#片选EM_WE连接WE#EM_OE连接RE#读使能数据总线EM_D[7:0]8位或EM_D[15:0]16位连接NAND的I/O口。NAND的R/B就绪/忙信号应连接至EMIF的EM_WAIT引脚以便EMIF或软件查询器件状态。配置寄存器要点AnCR寄存器 在NAND Flash模式下SS位必须设置为0即不使用选通模式EW位扩展等待也必须为0。W/R_SETUP/STROBE/HOLD等时序参数仍需根据具体的NAND Flash型号的时序要求进行配置。ASIZE字段需设置为与NAND Flash数据总线宽度一致8或16。驱动CLE和ALE 由于EMIF总是将32位字地址的最低有效位驱动到EM_A[0]上因此在通过写特定地址来驱动CLE和ALE时需要计算正确的地址偏移。例如若EM_A[2]接CLEEM_A[1]接ALE则写地址基址 0x00 CLE0, ALE0 通常用于数据周期写地址基址 0x04 CLE0, ALE1 地址周期。注意0x04的二进制是...0100A[2]0, A[1]1写地址基址 0x08 CLE1, ALE0 命令周期。0x08的二进制是...1000A[2]1, A[1]0 向这些地址进行写操作数据内容即命令码或地址值EMIF就会在对应的CLE/ALE信号配合下将数据总线上的内容作为命令或地址锁存进NAND Flash。3.2 NAND Flash访问周期与软件流程EMIF的NAND Flash模式硬件不会自动生成完整的NAND访问周期命令-地址-数据。它仅提供了底层的、单个的异步访问周期生成能力。因此一个完整的NAND操作如页读、页写、擦除必须由软件通过发起一系列连续的、特定顺序的异步读写操作来模拟实现。一个典型的NAND Flash页读取软件流程如下发送读命令Command Phase 软件向(CS基地址 CLE高电平偏移地址)写入命令码如0x00表示读开始。发送列地址和行地址Address Phase 软件分多次通常5次对于2K64B的页向(CS基地址 ALE高电平偏移地址)写入地址字节。发送确认命令 再次向命令地址写入第二个命令码如0x30表示读确认。等待R/B变高 轮询NANDFSR寄存器它反映EM_WAIT引脚状态即NAND的R/B信号或等待EMIF的“等待上升沿”中断直到NAND Flash准备好数据。读取页数据Data Phase 软件循环从(CS基地址 数据偏移地址)读取数据每次读取触发一个EMIF异步读周期。为了提高效率此阶段常使用DMA如EDMA来搬运数据。一个重要的限制与应对 文档明确指出EMIF不支持那些在读取数据等待时间tR期间要求CE#信号一直保持低电平的NAND Flash器件。因为EMIF在每次异步访问周期之间会释放EM_CS。解决方法是使用一个通用的GPIO引脚来控制NAND Flash的CE#信号。在操作开始时软件拉低该GPIO在发送完命令、地址并启动读操作后保持GPIO为低直至数据读取完成最后再拉高GPIO。这样就能满足此类NAND Flash的时序要求。3.3 使用EDMA进行高效数据搬运在NAND Flash的读写操作中数据阶段一页512字节甚至更多的数据量最大最适合使用EDMA来解放CPU。但配置EDMA传输NAND数据时需要特别注意地址递增问题。核心矛盾 EMIF不支持“恒定地址”的DMA传输模式只支持线性递增模式。而为了在数据阶段保持CLE和ALE为低即驱动它们的地址线EM_A[2:1]为0我们访问的地址必须落在能保证这些位为0的范围内。解决方案 精心配置EDMA参数确保在整个数据块传输过程中目标地址对于读或源地址对于写的递增不会“溢出”到改变CLE/ALE状态的地址区域。EDMA配置示例以AB同步传输类型为例NAND数据读EMIF - 内存ACNT单次传输字节数 设置为 ≤ 8字节或≤外部数据总线宽度。例如设为8。BCNT传输次数 总字节数 /ACNT。例如读512字节则BCNT64。SIDX源地址索引 0。因为每次读操作都访问EMIF的同一个“数据地址”。DIDX目的地址索引ACNT。因为内存中的目的地址需要连续存放。同步类型 AB同步。这意味着每完成一次ACNT字节的传输一个Array才递增地址。NAND数据写内存 - EMIFACNT ≤ 8字节。BCNT 总字节数 /ACNT。SIDX源地址索引ACNT。内存中的源数据是连续的。DIDX目的地址索引 0。因为每次写操作都写入EMIF的同一个“数据地址”。同步类型 AB同步。通过将ACNT设置为一个较小的值如8并配合SIDX或DIDX为0可以确保在传输整个数据页的过程中访问EMIF的地址始终在同一个“数据页”地址附近小幅波动而不会改变高位地址线即连接到CLE/ALE的地址线的状态。4. ECC校验生成机制与使用错误校验与纠正ECC是保障NAND Flash数据可靠性的关键机制因为NAND Flash存在固有的位错误率。EMIF硬件支持为每个配置为NAND Flash模式的片选空间生成ECC校验码最大支持512字节数据块。4.1 ECC的启用与计算流程启用ECC 首先确保对应片选的CSnNAND位已置1。然后在发起对NAND Flash的读或写操作之前通过软件将NANDFCR寄存器中对应的CSnECC位置1。例如对CS2空间设置CS2ECC1。此操作会同时清零对应的NANDFnECC寄存器。执行数据传输 随后进行正常的NAND Flash数据读写操作命令、地址、数据阶段。在数据传输阶段数据通过EMIF总线进出EMIF硬件会同步计算数据的ECC。获取ECC值 当512字节的数据传输完成后软件应立即读取对应的NANDFnECC寄存器例如CS2对应NANDF1ECC。读取该寄存器的操作会自动将CSnECC位清零表明一次ECC计算周期结束。存储或校验 对于写操作将读取到的ECC值写入到NAND Flash页的备用区Spare Area。对于读操作从备用区读出之前存储的ECC值并与刚计算出的新ECC值进行比较以检测和纠正错误。警告 ECC计算是针对连续的512字节数据流设计的。如果软件读写的数据超过512字节硬件计算的ECC将是错误的。如果数据少于512字节如256字节则需要忽略ECC结果中对应高位奇偶校验位例如p2048e, p2048o等。具体算法和位映射请参考器件数据手册中的图示。4.2 ECC算法简介与软件处理EMIF使用的是一种汉明码Hamming Code变体能够检测2位错误并纠正1位错误。如图9所示对于8位NANDECC结果为22位或更多取决于实现分为列奇偶校验位p1e, p1o, p2e, p2o, p4e, p4o, p8e, p8o和行奇偶校验位p16e-p2048e/o。硬件自动完成这些位的计算。软件的责任在于管理ECC的启停、存储和比对。一个健壮的驱动通常会实现以下函数ECC_Start(): 设置CSnECC位。ECC_GetResult(): 读取NANDFnECC寄存器并返回格式化后的ECC值如3个字节。ECC_Compare(): 比较读出的旧ECC和计算出的新ECC判断错误类型无错、1位可纠错、2位可检不可纠错、多位错并在可能的情况下进行数据纠正。5. 高级功能与系统集成考量5.1 扩展等待模式Extended Wait Mode与EM_WAIT引脚对于某些速度较慢或响应时间不固定的异步设备固定的选通时间可能不够。扩展等待模式通过EM_WAIT引脚允许外部设备动态延长访问周期。工作原理 当设置AnCR的EW1后EMIF在选通期内会采样EM_WAIT引脚。如果该引脚被外部设备置为有效状态极性由AWCCR的WP0位配置EMIF会暂停并插入额外的等待周期直到EM_WAIT引脚变为无效然后才结束选通期进入保持期。超时保护 AWCCR中的MEWC字段设置了最大扩展等待周期数。如果EM_WAIT信号有效时间超过此限制EMIF将强制结束选通期并可以产生异步超时中断如果使能。配置限制 在扩展等待模式下读/写的建立时间与选通时间之和R_SETUPR_STROBE, W_SETUPW_STROBE必须大于4否则EMIF可能无法正确识别EM_WAIT信号。5.2 中断支持与状态监控EMIF提供一个中断信号给CPU主要用于两个事件等待上升沿中断Wait Rise 当EM_WAIT引脚上出现上升沿时触发。在连接NAND Flash时这通常表示R/B信号由低变高即NAND Flash从“忙”变为“就绪”可用于实现高效的异步操作等待。异步超时中断Asynchronous Timeout 当扩展等待时间超过MEWC设置的最大值时触发。中断的管理通过四个寄存器完成EIRR原始状态、EIMR屏蔽后状态、EIMSR置位使能、EIMCR清零禁用。软件通常的流程是在EIMSR中使能所需中断然后在中断服务程序中读取EIRR判断中断源并进行相应处理最后向EIRR的对应位写1以清除中断标志。5.3 初始化流程、数据总线驻留与竞态条件EMIF初始化步骤配置设备引脚复用将相关引脚功能设置为EMIF。上电EMIF所用的IO引脚电源域通过VDD3P3V_PWDN等寄存器。通过电源与睡眠控制器PSC使能EMIF模块时钟。配置AWCCR设置EM_WAIT信号极性和最大扩展等待周期。配置各片选空间的AnCR设置操作模式、时序参数、数据宽度等。配置中断寄存器EIRR, EIMR等。若使用NAND Flash配置NANDFCR等相关寄存器。数据总线驻留Data Bus Parking EMIF在空闲时会持续驱动数据总线为上一次写入的数据值。这有助于稳定总线状态减少噪声。只有当EMIF发起读操作时它才会释放总线由外部设备驱动。潜在的竞态条件 当多个主设备如CPU、DMA通过EMIF访问共享内存时如果主设备A写入数据后不等待写完成确认就通知主设备B去读B可能会读到旧数据。标准解决方案是A在写操作后对同一片选空间进行一次虚读Dummy Read。该读操作的完成保证了之前所有针对该空间的写操作均已落地从而确保了数据一致性。EDMA和ATA外设通常已内部处理此问题但其他主设备如另一个CPU核需要软件实现此工作区。