
1. 项目概述与EMC核心价值在嵌入式音频处理系统里尤其是像Freescale现NXP的Symphony DSP56720/21这类多核音频处理器上外部存储器控制器External Memory Controller, EMC的角色远不止是一个简单的“地址翻译官”。你可以把它想象成整个系统数据吞吐的“交通枢纽”和“调度中心”。DSP内核运算能力再强如果数据“喂”不进去或者结果“吐”不出来性能就是空谈。音频处理无论是多通道混音、效果器链还是编解码本质上都是高带宽、实时性要求苛刻的数据流处理。EMC正是在这个背景下承担起高效、可靠连接DSP内核与外部SDRAM、SRAM、Flash乃至其他存储映射外设的重任。它的核心价值在于“可配置性”和“灵活性”。不同于固定时序的简单接口EMC提供了三种可编程的访问“机器”通用片选机GPCM、同步动态随机存取存储器机SDRAM和用户可编程机UPM。这意味着工程师可以根据外接存储器的具体型号和时序要求“量体裁衣”地配置访问协议。比如用SDRAM模式来驱动大容量的音频缓冲区用UPM模式来对接一块老式的异步SRAM或者特殊的FPGA接口用GPCM来访问Boot ROM。这种设计哲学使得单一芯片能够适配复杂多变的硬件环境是嵌入式系统特别是专业音频设备这种对成本和板级面积敏感的应用场景中实现高性能的关键。2. EMC核心架构与寄存器模型深度解析要驾驭EMC必须从理解其寄存器模型开始。手册里那一大堆表格BRx, ORx, MxMR, SDMR等乍看令人望而生畏但它们的组织逻辑非常清晰遵循着“定义空间 - 配置属性 - 控制时序”的层次。2.1 地址映射的基石基址寄存器(BRx)与选项寄存器(ORx)这是EMC配置的起点决定了“哪块物理内存芯片响应哪个逻辑地址范围”。其工作原理是一个经典的“基址掩码”比较器模型。基址寄存器(BRx)定义了存储区域的起始地址。关键字段包括BA (Base Address): 存储区域的高位地址A23-A14。它定义了这块内存空间在处理器24位物理地址空间中的起始位置。XBA (Extended Base Address): 扩展基址用于区分X、Y、P程序三个独立的数据/程序空间。这是DSP哈佛架构的体现允许将同一物理存储器映射到不同的逻辑空间方便数据与程序的分离访问。MSEL (Machine Select): 机器选择。这是最重要的字段之一决定了该存储区域由哪个“机器”来管理00代表GPCM01代表SDRAM10或11代表UPM A/B/C。一旦地址匹配成功控制权就交给了对应的机器。选项寄存器(ORx)则与BRx配对定义了存储区域的“形状”和访问属性。其核心是地址掩码(AM)和扩展地址掩码(XAM)字段。地址掩码(AM)的工作原理AM位与地址位一一对应ORHx对应A23-A14ORLx[15]对应A13。当AM位设置为0时在地址比较时对应的地址位被“忽略”屏蔽设置为1时该位参与精确比较。为什么需要掩码这实现了灵活的空间大小定义。例如如果你有一块容量为1MB地址线需要20位A19-A0的SRAM你希望将它映射到从0x200000开始的地址空间。你可以设置BRx[BA] 0x20即0x200000的高位然后设置ORx[AM]的掩码使得A23-A20参与比较值为0010而A19-A14被屏蔽不参与比较。这样任何访问地址在0x200000到0x2FFFFF范围内的请求都会命中这个存储块。掩码允许你定义非2的幂次方大小的内存块或者将一块物理内存映射到多个不连续的逻辑地址区间这在某些特定驱动场景下非常有用。扩展地址掩码(XAM)用于屏蔽XBA位实现更灵活的X/Y/P空间映射控制。例如你可以配置让一块物理内存同时响应X和Y空间的访问这在DSP进行数据搬移如用Y空间作为源X空间作为目标时能简化操作。实操心得地址空间规划在项目初期画一张地址映射图是绝对必要的。根据硬件设计每块内存芯片的容量、连接的数据线宽度计算出每块芯片需要的地址线数量然后据此规划BRx和ORx。一个常见的坑是地址重叠。EMC的仲裁规则是当多个存储块地址范围重叠时编号小的Bank如Bank0优先级最高。如果你不小心将两块不同的物理芯片映射到了重叠的地址空间低编号Bank会“霸占”该区域导致高编号Bank永远无法被访问这种错误在调试时非常隐蔽。务必确保各存储块的地址范围互不冲突或者你明确知晓并利用了优先级规则。2.2 三大访问引擎GPCM、SDRAM与UPM模式详解EMC的三种模式对应三种不同的外设复杂度和性能需求。2.2.1 通用片选机(GPCM)模式这是最简单、最直接的模式。你可以把它理解为“傻瓜式”接口。配置好BRx/ORx后主要就是设置几个基本的时间参数如地址建立时间、写脉冲宽度、读保持时间等通常在相关配置寄存器中。GPCM生成固定的、非突发的读写时序。它的优点是配置简单几乎无需计算复杂时序缺点是性能最低因为每次访问都是独立的没有突发传输和页模式优化。因此GPCM通常用于连接Boot Flash、低速配置芯片或简单的并行接口外设。2.2.2 同步动态随机存取存储器(SDRAM)模式这是为了高性能、大容量存储设计的模式也是音频缓冲区最常用的类型。SDRAM内部是复杂的行列寻址架构并且需要定期刷新以保持数据。EMC的SDRAM机器内置了状态机自动处理这些复杂操作。关键配置寄存器SDMR (SDRAM Machine Mode Register)ROWS/COLS: 这两个字段在ORLx中必须根据你使用的SDRAM芯片手册准确设置。它告诉EMC你的SDRAM内部有多少行ROWS和多少列COLS。这直接决定了EMC如何拆分处理器发出的地址将其转换为正确的行地址RAS和列地址CAS。设置错误会导致寻址混乱数据读写全错。BSMA (Bank Select Multiplexed Address): 选择哪两根地址线作为SDRAM的Bank选择线BA0, BA1。这需要与硬件PCB布线对应。如果布线时SDRAM的BA0连到了DSP的LA17BA1连到了LA16那么BSMA就需要设置为000LA17:LA16。时序参数簇: 这是SDRAM配置的核心和难点包括ACTTORW(Active to Read/Write Delay, tRCD)、PRETOACT(Precharge to Active Delay, tRP)、WRC(Write Recovery Time, tWR) 和CL(CAS Latency)。这些值必须严格遵循SDRAM芯片数据手册中的时序表并根据EMC的时钟频率由LCRR[CLKDIV]决定换算成时钟周期数。例如如果SDRAM的tRCD最小值是18ns而你的EMC总线时钟周期是10ns100MHz那么ACTTORW至少需要设置为2个周期20ns 18ns。为了稳定性通常会再加1-2个周期的余量。刷新配置:RFEN使能刷新SRT(SDRAM Refresh Timer) 设置刷新间隔。刷新间隔的计算公式手册已经给出Timer Period SRT / (F_sysclk / MRTPR[PTP])。你需要根据SDRAM芯片要求的刷新周期例如64ms内完成8192次刷新即每7.8µs一次来反推SRT值。刷新不及时会导致数据丢失。2.2.3 用户可编程机(UPM)模式这是EMC最强大、最灵活也是最复杂的模式。它本质上是一个微码引擎。你需要为UPM的RAM阵列共64个字每个字32位编写“程序”这个程序定义了在访问的每个时钟周期所有控制信号如LCSn, LRW, LALE, LGPL[4:0]等应该是什么状态。核心寄存器组:MxMR (UPM Mode Registers): 控制UPM的全局行为。OP字段用于向UPM RAM写入微码WRITE、读取验证READ或执行模式RUN。AM字段定义地址复用模式对于需要行列地址复用的DRAM至关重要。RLFx/WLFx/TLFx分别定义了读、写、刷新循环的执行次数用于控制突发长度。MAR (Memory Address Register): 存储当前要访问的地址UPM微码可以控制将其输出到地址总线上。MDR (Memory Data Register): 作为与UPM RAM交换微码数据的缓冲区。UPM RAM Array: 这才是UPM的“大脑”。每个32位的RAM字其每一位都对应一个外部引脚或内部控制信号。通过编程这些字你可以生成几乎任意波形从而模拟出各种异步存储器如PSRAM、NOR Flash、总线外设甚至自定义接口的精确时序。UPM模式实操心得配置UPM就像在为一个极简的、硬件级别的状态机编程。步骤通常是分析目标器件时序图从存储器数据手册中找到读、写、刷新操作的时序波形图标注出每个关键事件CS#有效、地址建立、数据有效等相对于时钟边沿的时间要求。将时间转换为时钟周期根据EMC总线时钟频率将ns级的时间要求转换为整数个时钟周期。考虑建立和保持时间。设计UPM微码序列为读、写、刷新等不同操作分别设计一串UPM RAM字。每个字代表一个时钟周期内所有信号的状态。你需要规划好每个周期是输出地址、输出数据、等待还是改变控制信号。编写加载程序在DSP初始化代码中先将MxMR[OP]设置为写模式01然后依次将设计好的微码字写入MDR并通过触发一次对UPM控制Bank的“假”访问地址匹配即可让EMC自动将MDR内容写入MAD指向的UPM RAM位置并递增MAD。循环直到所有微码加载完毕。切换至运行模式将MxMR[OP]设置为运行模式11并将MAD指向读/写模式的起始地址。此后当CPU访问该UPM控制的存储区域时EMC就会自动执行你预设的微码序列。这个过程非常繁琐但一旦调通其灵活性和对非标设备的支持能力是无与伦比的。很多老型号的存储器或专用ASIC都是靠UPM模式驱动的。3. 关键功能模块与配置实战3.1 刷新定时器配置数据可靠性的守护者无论是UPM控制的DRAM还是SDRAM机器控制的SDRAM刷新都是生命线。EMC提供了独立的刷新定时器URTUPM刷新定时器和SRTSDRAM刷新定时器。配置流程与计算示例假设系统时钟F_sysclk 200 MHz我们使用SDRAM其要求每64ms进行8192次刷新。计算刷新间隔64ms / 8192 ≈ 7.8125 µs。这是每次刷新操作必须发生的最大间隔。设置预分频器MRTPR[PTP]为了获得一个合适的计数基准我们选择预分频值。例如设PTP 32则刷新定时器的时钟频率为200 MHz / 32 6.25 MHz周期为0.16 µs。计算SRT值所需定时器周期 7.8125 µs。定时器时钟周期 0.16 µs。因此SRT 7.8125 µs / 0.16 µs ≈ 48.83。取整并考虑余量我们设置为50。验证Timer Period 50 / (200 MHz / 32) 50 / 6.25 MHz 8 µs。这小于要求的7.8125µs满足条件且有一定余量。寄存器设置MRTPR[PTP] 32 (0x20),SRT 50 (0x32)。同时必须将对应SDRAM Bank的SDMR[RFEN]置1使能刷新功能。注意事项中断与阻塞刷新操作由EMC硬件自动发起在刷新期间对该SDRAM Bank的访问会被暂时阻塞插入等待状态。在计算系统实时性时必须考虑刷新带来的最坏情况访问延迟。低功耗模式在系统进入低功耗模式如Stop前如果SDRAM需要保持数据应将其设置为自刷新模式通过SDMR[OP]然后才能关闭EMC或系统主时钟。唤醒后再执行一系列命令使其退出自刷新。3.2 错误诊断与处理机制EMC提供了一套完整的错误检测机制这对于复杂系统的调试和可靠性至关重要。相关寄存器包括TESR状态、TEDR检查禁用、TEIR中断使能、TEATR属性和TEAR地址。常见错误类型总线监控超时 (TESR[BM])访问发起后在LBCRL[BMT]定义的时间内BMT * 8个总线周期没有收到外设的传输应答TA#信号。这通常意味着1) 外设不存在2) 时序配置错误访问太快外设来不及响应3) 物理连接问题断线、虚焊。写保护错误 (TESR[WP])尝试向一个配置为只读在BRx中设置的存储区域进行写操作。片选错误 (TESR[CS])发起的访问地址没有命中任何已配置的存储Bank。这可能是程序跑飞访问了未映射的地址空间。调试技巧启用中断在开发初期强烈建议使能TEIR中的相应中断位BMI, WPI, CSI。一旦发生错误CPU能立刻捕获而不是让程序在错误数据上继续运行导致更诡异的后续错误。检查TEAR和TEATR当错误发生时TEAR寄存器会锁存导致错误的访问地址TEATR会锁存是读还是写操作RWB位以及来自哪个内存空间XA位。这是定位问题代码的黄金信息。例如如果TEAR显示错误地址是0x0000_1234而TEATR显示是Y空间写操作你就可以去检查所有对Y空间地址0x1234附近的写指令。善用TEDR在调试特定问题时可以暂时禁用某些错误检查。例如当你确认某段代码就是会触发写保护但你有意为之可以禁用WPD以避免频繁进入错误处理流程。但产品发布前务必重新启用。3.3 时钟与总线配置精要LCRR (Clock Ratio Register)是EMC与系统时钟的桥梁其配置直接影响总线速度和信号质量。CLKDIV (时钟分频)这是最关键的设置之一定义了EMC总线时钟LCLK与系统输入时钟的比率。例如系统时钟100MHzCLKDIV4则LCLK为25MHz。总线时钟频率必须满足所有外接存储器的最快时序要求。过高的LCLK会导致时序违例数据不稳定。DBYP (PLL旁路)当总线时钟频率较低手册建议低于50MHz时可以旁路内部用于数据采样的PLL以降低功耗和复杂度。在旁路模式下数据在总线时钟周期中间被采样。EADC (外部地址锁存延迟)当使用外部地址锁存器时通过LALE信号这个字段可以增加LALE的断言周期数以满足锁存器的保持时间要求。BUFCMDC 与 SDMR[BUFCMD]这是一对配合使用的控制位。当系统板上在控制信号线如RAS#, CAS#, WE#上使用了缓冲器时信号会有额外的传播延迟。设置SDMR[BUFCMD]1并配置LCRRH[BUFCMDC]可以让EMC将这些控制信号多保持几个周期确保在SDRAM端看到满足时序要求的信号波形。4. 嵌入式音频系统中的EMC配置实战与优化在DSP56720/21这样的多核音频处理器上EMC的配置直接关系到音频处理的实时性和稳定性。下面以一个典型的音频处理应用为例阐述配置流程和优化点。场景假设系统外接一片32MB的SDRAM作为音频缓冲区一片4MB的NOR Flash存放程序和数据系统时钟150MHz。4.1 配置步骤分解硬件连接确认首先根据原理图确认SDRAM的地址线、数据线、控制线RAS#, CAS#, WE#, CS#, DQM等与DSP的哪些引脚LAxx, LDxx, LGPLx等相连。记录下SDRAM的Bank选择线连接例如BA0-LA17, BA1-LA16。计算时钟分频查阅SDRAM芯片手册其最高运行频率为133MHz。为留有余量我们设定EMC总线时钟LCLK为100MHz。系统时钟150MHz因此LCRRL[CLKDIV] 1.5不对CLKDIV只有几个固定分频值2,4,8...。最接近的是分频值2LCLK75MHz或4LCLK37.5MHz。为了保证性能我们选择CLKDIV2即LCLK75MHz。然后需要验证SDRAM在75MHz下能否满足所有时序。SDRAM Bank配置确定容量与地址线32MB SDRAM地址线通常为A12-A0行A8-A0列共22根地址线行13列9加上2根Bank线。我们将其映射到X数据空间。设置BR0假设映射到X空间起始地址0x2000_0000。则BR0[XBA]01(X空间)BR0[BA]取0x2000_0000的高10位。BR0[MSEL]01(SDRAM模式)。设置OR0根据容量计算掩码。32MB地址空间需要25根地址线2^2532M但我们只关心高10位A23-A14的掩码。我们需要屏蔽A23-A22实际上由于我们只用了24位地址A23-A22固定为0。更关键的是根据行列数设置OR0[ROWS]1213根行地址线OR0[COLS]89根列地址线对应值010。OR0[BSMA]根据硬件连接设置为000LA17:LA16。配置SDMR时序根据75MHz LCLK周期约13.3ns和SDRAM手册时序参数如tRCD18ns, CL2 cycles, tRP18ns计算。ACTTORW(tRCD): 18ns/13.3ns ≈ 1.35向上取整为2个周期。CL设置为2。PRETOACT(tRP): 同样18ns取2个周期。将这些值填入SDMR。NOR Flash Bank配置 (GPCM模式)将其映射到P程序空间例如起始地址0x0000_0000用于启动。BR1[XBA]10(P空间)BR1[BA]0x0000BR1[MSEL]00(GPCM)。OR1设置合适的地址掩码和GPCM特定的时序参数如GPCM_ATR中的建立、保持时间这些参数需要根据NOR Flash的读/写周期时间如70ns来换算。初始化序列在main()函数或启动代码中必须严格按照以下顺序初始化 a. 配置LCRR设置总线时钟。 b. 配置各存储Bank的BRx和ORx。注意在配置期间该Bank可能无法正常访问因此配置代码本身不能位于正在被配置的存储区域内。通常初始化代码在片内SRAM中运行。 c. 对于SDRAM执行必要的初始化序列通过SDMR[OP]字段发送“预充电所有Bank”、“模式寄存器设置”、“自动刷新”等命令。这个序列必须严格按照SDRAM数据手册的流程。 d. 配置刷新定时器MRTPR和SRT并使能SDMR[RFEN]。 e. 对于UPM如果有加载UPM RAM微码然后切换到运行模式。4.2 性能优化与避坑指南Bank Interleaving (Bank交错)这是提升SDRAM带宽的关键技术。SDRAM在预充电或激活一个Bank时可以同时访问另一个Bank。EMC的SDRAM控制器支持此功能。确保你的数据缓冲区地址在多个SDRAM Bank间交错分布例如将一个大数组的奇偶元素分别放在不同Bank可以显著减少因行激活Active和预充电Precharge带来的延迟。突发访问优化无论是SDRAM的突发模式还是UPM编程实现的突发都能大幅提升连续数据块的传输效率。在音频处理中对缓冲区进行搬移或滤波时应尽量组织成顺序的、长度匹配突发长度的访问如8个字。设置合适的SDMR[BL]突发长度和UPM中的循环次数RLFx/WLFx。缓存与内存布局虽然DSP56720/21可能没有硬件缓存但软件层面同样需要注意。将频繁访问的数据如当前处理的音频块、系数表尽量放在片内SRAM中。对于必须放在外部SDRAM中的大型缓冲区确保其起始地址与缓存行或DSP的DMA最优访问边界对齐可以避免低效的跨边界访问。时序余量Margin永远不要在时序参数上卡着芯片手册的最小值Min.来设置。必须考虑PCB走线延迟、电源噪声、温度漂移等因素。通常在计算出的时钟周期数基础上增加1到2个周期的余量是保证系统长期稳定运行的良好实践。特别是在音频产品中任何偶发的数据错误都可能导致可闻的爆音或杂音。上电与复位时序有些SDRAM或Flash对上电和复位后到首次有效命令之间的时间有要求。确保你的DSP启动代码中在初始化EMC和存储器之前有足够的延迟通常用简单的循环实现。同时注意复位时GPIO的默认状态确保存储器在配置完成前处于非选中状态避免总线冲突。调试手段除了利用错误中断还可以用示波器或逻辑分析仪抓取实际的总线波形。对照EMC配置的时序参数和存储器手册的要求逐一检查CS#、RAS#、CAS#、WE#、地址、数据等信号的建立时间、保持时间和脉冲宽度。这是解决疑难杂症如间歇性读写失败的最直接方法。