i.MX21嵌入式开发:EIM与BMI接口寄存器配置与实战指南

发布时间:2026/6/13 16:01:07

i.MX21嵌入式开发:EIM与BMI接口寄存器配置与实战指南 1. 项目概述深入i.MX21的“对外窗口”与“高速通道”在嵌入式系统开发尤其是基于ARM9内核的i.MX21这类应用处理器时我们常常需要与外部世界进行数据交换。这个“外部世界”可能是存放启动代码的NOR Flash是扩展出来的SDRAM也可能是需要高速传输数据的协处理器比如一块图形芯片。处理器如何与这些形形色色、时序要求各异的设备“对话”答案就藏在两个关键模块里外部接口模块EIM和总线主控接口BMI。你可以把EIM想象成处理器的“标准对外窗口”。它负责管理最多6个片选Chip Select信号每个片选都像是一个独立的“接待柜台”可以配置不同的“接待规则”时序参数来服务不同类型的访客外部存储器或外设。无论是需要快速突发读取的同步Flash还是慢吞吞的异步SRAMEIM都能通过精细的寄存器配置生成恰到好处的地址、数据和控制信号时序确保通信既稳定又高效。它的核心价值在于极致的可配置性让单一硬件接口能适配多种外部设备是系统启动和外部存储扩展的基石。而BMI则更像是一条专用的“高速数据通道”或“VIP通道”。它不是为了连接通用的存储器而是为了与另一个具备总线主控能力的外部设备如ATI的图形芯片进行高速、流式的数据交换。BMI内部集成了收发FIFO支持DMA请求其通信时序更接近于一种简化的、握手式的内存访问协议。它的价值在于卸载CPU负担实现高带宽的片间数据直传在需要实时图形处理或大数据流传输的场景中至关重要。我接触过不少项目初期因为对EIM时序配置理解不透导致系统不稳定、数据出错甚至无法启动。也有项目在集成外部图形芯片时因为没用好BMI的FIFO和中断机制CPU疲于应付数据搬运整体性能卡了脖子。因此吃透这两个模块的寄存器级编程绝非纸上谈兵而是稳定性和性能的保障。本文将结合i.MX21参考手册拆解EIM和BMI的核心寄存器分享从原理到实操的配置经验让你能真正驾驭这两个关键接口。2. EIM核心原理与设计思路拆解2.1 EIM的角色与核心任务EIM的本质是一个高度可配置的并行总线接口控制器。它位于处理器内部的AHB总线与外部芯片引脚之间充当翻译官和调度员的角色。当CPU或DMA控制器通过AHB总线发起一个对外部地址空间的访问时EIM会根据目标地址落在哪个片选CS0-CS5的地址范围内启用相应的“接待规则”即该片选的配置寄存器并生成符合规则的外部总线周期。它的核心任务可以分解为以下几点地址译码与片选生成将32位的AHB地址总线映射到外部地址引脚并根据配置的基地址和地址掩码在正确的时机断言拉低对应的片选信号。时序波形生成这是EIM最复杂也最核心的部分。它需要根据外部设备的读写速度、建立保持时间要求精确控制以下信号的时序关系CSn片选何时有效何时无效。OE输出使能用于读在读周期中何时有效以允许外部设备驱动数据总线。EB[3:0]字节使能/WEN写使能相关在写周期中何时有效以锁存数据。RW读写方向指示当前是读还是写操作。与同步设备交互的BCLK突发时钟、LBA突发地址锁存等信号。数据宽度适配支持8位、16位、32位端口宽度。对于窄于32位的设备EIM会自动将一次32位访问拆分成多次8位或16位访问并管理好字节序。工作模式切换支持异步模式用于常规SRAM、慢速外设和同步突发模式用于Burst Flash、PSRAM后者能大幅提升连续数据读写的吞吐率。2.2 寄存器布局与配置哲学i.MX21的EIM为每个片选CS0-CS5配备了一组64位的控制寄存器分为高32位CSxU和低32位CSxL两个寄存器。这种划分主要是出于地址对齐和访问便利性的考虑。CS0的复位值比较特殊它依赖于启动模式引脚BOOT[3:0]的设置这决定了系统从上电开始就能从外部Boot ROM正确读取代码。配置这些寄存器的过程本质上是在用软件“绘制”一张精确的信号时序图。每一个位域bit-field都对应着时序图中的一个关键参数比如WSC等待状态控制决定了在CS有效后插入多少个HCLK时钟周期来等待慢速设备准备好数据。OEA/OENOE断言/撤销时间控制OE信号相对于访问周期的精确位置。CSA/CSNCS断言/撤销时间专门为写周期调整CS信号的时序。SYNC位这是模式切换的总开关。置1则进入同步突发模式此时BCD突发时钟分频、BCS突发时钟启动等位域生效清零则为异步模式RWA/RWN读写信号控制等位域生效。实操心得配置顺序在配置一个片选时我习惯遵循“从整体到局部从模式到时序”的顺序确定基本模式先设SYNC位决定是同步还是异步。配置数据端口设置DSZ位匹配外部设备的实际数据线宽度8/16/32位。配置核心时序根据设备数据手册的tACC地址访问时间、tOE输出使能时间等参数计算并设置WSC、OEA、OEN等。配置高级特性如需要再配置WRAP回绕模式、PSRPSRAM模式、EDC额外死区周期等。最后使能在所有参数设置妥当后最后将CSEN位置1使能该片选。这个顺序可以避免在配置过程中产生意外的总线访问。3. EIM寄存器深度解析与配置实战3.1 关键寄存器位域详解与计算手册中的寄存器描述表信息量巨大我们需要从中提炼出最核心、最易出错的配置点并结合实际计算来理解。1. 等待状态WSC与写等待状态WWS这是应对慢速设备最直接的参数。WSC[5:0]定义了读访问和当WWS0时写访问的基本等待状态数。其编码并非直接对应周期数需要查表手册Table 20-7。例如WSC000010对应2个等待状态WSC001110对应15个等待状态。计算公式异步模式总访问周期数 基本周期通常为1 WSC设置的等待状态数 WWS带来的额外写等待。场景举例连接一个访问时间为70ns的异步SRAM系统HCLK为100MHz周期10ns。假设地址建立、数据采样等需要1个基础周期10ns那么还需要至少6个等待周期60ns来满足70ns的tACC。因此WSC应设置为001101对应13个等待状态这里需要查表确认编码13对应的值。注意手册指出WSC应配置为大于1的值这是为了满足内部逻辑的最小时间要求。2. 输出使能时序OEA/OEN这两个参数精细控制了OE信号的波形。OEA决定了OE在访问开始后延迟多少个半HCLK周期才有效OEN决定了OE在访问结束前提前多少个半HCLK周期无效。为什么需要配置对于某些存储器OE的有效时间必须晚于地址稳定时间tOE或者无效必须早于地址改变以避免总线冲突或读取到无效数据。配置要点手册强调OE的有效时间由OEA和WSC共同影响必须大于或等于1个完整的HCLK周期。这意味着如果你将OEA设得很大WSC也不能设得太小否则总的有效时间可能不满足这个内部约束。3. 数据端口大小DSZ与字节使能EBCDSZ[2:0]定义了外部设备的数据总线宽度。这是一个非常关键的配置配错了会导致数据错位、无法读写。000-011对应8位端口分别位于数据总线的高8位D[31:24]到低8位D[7:0]。这常用于连接8位的并行Flash或外设。100-101对应16位端口位于D[31:16]或D[15:0]。连接16位的SRAM或Flash时使用。11032位端口使用全部数据线。EBC位控制字节使能信号EB[3:0]的行为。当EBC0时读写访问都会断言EB信号此时EB作为字节使能例如对于32位总线上的16位设备通过EB[3:2]或EB[1:0]来选择高低半字。当EBC1时只有写访问会断言EB此时EB作为字节写使能用于连接那些需要按字节写入的存储器如某些PSRAM。3.2 同步突发模式与PSRAM模式配置同步突发模式SYNC1是提升连续读取性能的关键。在此模式下EIM会提供额外的控制信号BCLK突发时钟和LBA突发地址锁存与支持突发读的Flash或PSRAM协同工作。1. 突发时序参数BCD突发时钟分频决定BCLK的频率。BCLK频率 HCLK频率 / (BCD值 1)。例如HCLK100MHz,BCD01除2则BCLK50MHz。需要确保不超过存储器的最大操作频率。BCS突发时钟启动决定在LBA有效后延迟多少个半HCLK周期才产生第一个BCLK上升沿。这用于满足存储器tLBA地址锁存到时钟有效的时间要求。DOL数据输出长度在突发读中它指定了EIM在采样数据总线前需要等待的系统时钟周期数。这对应存储器参数tCLK时钟到数据输出有效和tDSU数据建立时间。2. PSRAM模式PSRAM伪静态RAM是一种兼具SRAM接口和DRAM内核的存储器性价比高。i.MX21的EIM通过设置PSR位来支持PSRAM的特殊时序。当PSR1时EIM会在写操作期间自动屏蔽WRAP模式因为PSRAM规范通常只支持读操作的突发回绕。在读操作时自动增加等待状态。持续采样ECB信号并在ECB无效时等待以配合PSRAM的自动刷新周期。配置流程除了设置PSR1通常还需要通过CRE控制寄存器使能位和特定的地址访问来配置PSRAM芯片内部的模式寄存器如突发长度、潜伏期等。CRE位会驱动到地址线ADDR[25]上在访问特定地址空间时CRE为高表示这是一个配置命令周期而非数据周期。3.3 典型配置代码示例与分析假设我们要配置CS1连接一个16位、70ns访问时间的异步SRAM基地址为0x80000000HCLK为100MHz。/* 定义EIM寄存器基地址 */ #define EIM_BASE 0xDF001000 /* CS1控制寄存器地址偏移 */ #define CS1U_OFFSET 0x08 #define CS1L_OFFSET 0x0C /* 位域定义 (示例需根据具体头文件调整) */ #define SYNC_MASK (1 20) /* 假设SYNC在CS1U的Bit 20 */ #define DSZ_16BIT_LOW (0x5 8) /* 假设DSZ在CS1L的Bit 10-8值101代表D[15:0] */ #define WSC_VALUE (0x0D 40) /* 假设WSC在CS1U的Bit 45-40值001101对应13个等待状态需查表确认编码 */ #define CSEN_MASK (1 0) /* CSEN在CS1L的Bit 0 */ void eim_cs1_config_for_async_sram(void) { volatile uint32_t *cs1u (uint32_t*)(EIM_BASE CS1U_OFFSET); volatile uint32_t *cs1l (uint32_t*)(EIM_BASE CS1L_OFFSET); uint32_t reg_cs1u 0; uint32_t reg_cs1l 0; /* 1. 配置CS1U寄存器 */ // 异步模式SYNC0 reg_cs1u ~(SYNC_MASK); // 设置等待状态WSC13 (假设编码0x0D对应13个等待状态需根据实际手册Table 20-7确认) reg_cs1u | WSC_VALUE; // 其他位如OEA, OEN, RWA, RWN等根据SRAM数据手册时序计算后设置此处假设为0 // ... /* 2. 配置CS1L寄存器 */ // 设置数据端口为16位位于D[15:0] reg_cs1l | DSZ_16BIT_LOW; // 使能字节控制EBC0读写均使用字节使能 reg_cs1l ~(1 11); // 假设EBC在Bit 11 // 最后使能片选 reg_cs1l | CSEN_MASK; /* 3. 写入寄存器 */ *cs1u reg_cs1u; *cs1l reg_cs1l; /* 4. 配置地址解码通常在系统内存控制器或MMU中设置将0x80000000开始的区域映射到CS1 */ // ... (此处省略内存控制器配置代码) }注意事项地址映射上述代码仅配置了EIM的时序参数。要让CPU访问0x80000000时真正触发CS1还必须通过处理器的内存控制器或静态内存控制器SMC模块如果存在将物理地址0x80000000映射到EIM的CS1所对应的存储区域。这一步的配置寄存器通常不在EIM模块内需要查阅芯片手册的Memory Controller章节。忘记这一步是新手最常见的错误之一表现为配置了EIM但片选信号永远不动作。4. BMI模块原理与高速数据通路搭建4.1 BMI架构与工作模式解析BMI是一个相对独立的并行从接口其核心是一个**双FIFO先入先出队列**结构一个16x32位的接收FIFORxFIFO和一个16x32位的发送FIFOTxFIFO。这种结构决定了它擅长处理流式数据。BMI支持两种主要工作模式通过BMICTLR1寄存器的MASTER_SEL和MMD_MODE_SEL位选择从模式Slave ModeMASTER_SEL0。此时BMI作为一个从设备由外部主设备如另一颗处理器或ASIC发起读写操作。外部主设备通过BMI_CLK/CS作为时钟或片选、BMI_WRITE方向控制等信号主动向BMI的FIFO写入或读取数据。i.MX21的CPU则通过AHB总线访问BMI的内部寄存器BMIRXD,BMITXD来获取或提供数据。这种模式常用于双核通信或协处理器数据流输入。主模式Master ModeMASTER_SEL1。此时BMI作为主设备主动发起对外部从设备如一个简单的缓冲芯片的读写访问。BMI控制BMI_CLK/CS作为片选、BMI_WRITE作为写使能、BMI_READ作为读使能等信号。CPU将待发送数据写入BMITXDBMI会自动将其送出外部设备写入的数据会被BMI存入BMIRXDCPU从中读取。这种模式给了i.MX21一个额外的、可编程时序的并行输出端口。ATI MMD模式MMD_MODE_SEL1。这是一种特殊的从模式时序针对ATI移动媒体处理器MMD进行了优化。在此模式下BMI_CLK/CS信号的功能由MMD_CLKOUT位进一步决定是由BMI驱动还是由外部MMD设备驱动。4.2 核心寄存器配置与数据流控制BMI的编程模型围绕五个寄存器展开其中BMICTLR1是控制核心。1. 时钟与等待状态配置DIV[1:0]在BMI作为主设备或输出时钟时用于对系统时钟HCLK进行分频生成内部操作时钟Int_Clk。分频系数为2、4、8、16。关键限制手册明确指出BMI_CLK/CS的频率必须小于HCLK/3。例如HCLK133MHz则BMI时钟必须低于44.3MHz。配置时务必核算。WS[2:0]在主模式下插入的等待状态数。这类似于EIM的WSC用于适应慢速外部从备。WAIT位主模式下若此位置1则BMI将采样BMI_WAIT输入信号由GPIO PA29复用而来来延长访问周期直到BMI_WAIT变高。这提供了更灵活的硬件流控。2. FIFO与水印Watermark中断这是实现高效DMA传输的关键。TxF_Water_Mark和RxF_Water_Mark分别设置TxFIFO“空”和RxFIFO“满”的触发阈值。当TxFIFO中空余位置数量大于等于TxF_Water_Mark时状态寄存器中的TxF_EMPTY位被置1同时BMI_DMA_REQ[0]信号有效可以触发DMA将更多数据从内存搬移到TxFIFO。当RxFIFO中**有效数据字数32位**大于等于RxF_Water_Mark时状态寄存器中的RxF_FULL位被置1同时BMI_DMA_REQ[1]信号有效可以触发DMA将数据从RxFIFO搬移到内存。中断使能位TxFE_INT_EN、RxFF_INT_EN等。当对应条件满足且中断使能时BMI会产生BMI_INT_B中断。你可以选择用中断还是DMA来服务FIFO。水印设置策略水印值需要平衡响应速度和效率。设得太小如1中断/DMA请求会非常频繁增加系统开销。设得太大如14则可能在数据搬空或填满FIFO时来不及响应造成数据丢失或发送停滞。对于高带宽场景通常结合DMA并将水印设置为FIFO深度的一半左右如8以留出足够的缓冲时间。3. 数据流操作流程以从模式CPU读取外部数据为例初始化配置GPIO复用为BMI功能使能BMI模块BMI_EN1设置数据宽度16BIT_SEL配置RxFIFO水印并开启相应中断或DMA。外部设备写入外部主设备通过BMI接口将数据写入BMI的RxFIFO。触发通知当RxFIFO中数据量达到水印触发中断或DMA请求。CPU/DMA读取CPU响应中断或DMA自动启动从BMIRXD寄存器读取数据。读取操作会自动从RxFIFO弹出数据。循环重复步骤2-4。避坑指南FIFO清除与启动顺序上电/初始化后务必清除FIFO在使能BMI模块BMI_EN1前或后应立即向TxFIFO_CLR和RxFIFO_CLR位写1以清除可能存在的残留数据确保FIFO指针处于正确位置。TxFIFO的“READ_REQ”机制当CPU向BMITXD写入数据后BMI会置起BMI_READ_REQ信号通知外部主设备“有数据可读”。如果外部主设备始终不发起读操作TxFIFO中的数据会一直堆积直到满之后CPU再写入会阻塞或失败。因此在从模式下必须确保外部主设备能正确响应BMI_READ_REQ信号。如果通信异常一个补救措施是软件写入TxFIFO_CLR1来复位发送队列。时钟极性注意CLK_CS_POL和READ_REQ_POL位它们可以反转相应信号的极性。务必与对接的外部设备时序要求保持一致否则可能采样到错误的边沿。4.3 BMI与DMA协同工作示例BMI与DMA控制器的配合能极大解放CPU。以下是一个简化的配置思路假设使用DMA通道0服务BMI的RxFIFO将数据搬移到内存buffer。/* 假设的寄存器地址和位定义 */ #define BMI_BASE 0xA0000000 #define BMICTLR1 (*(volatile uint32_t *)(BMI_BASE 0x00)) #define BMISTR (*(volatile uint32_t *)(BMI_BASE 0x08)) #define BMIRXD (*(volatile uint32_t *)(BMI_BASE 0x0C)) #define BMI_EN_MASK (1 0) #define RXFIFO_CLR_MASK (1 2) #define RXF_WATER_MARK_POS 16 #define RXFF_INT_EN_MASK (1 8) /* 假设Bit 8是RxFIFO满中断使能 */ #define RXF_FULL_STAT_MASK (1 1) /* 假设Bit 1是RxF_FULL状态位 */ void bmi_dma_rx_init(uint32_t *buffer, uint32_t buffer_size_words) { /* 1. 配置GPIO复用为BMI功能 (此处省略具体GPIO寄存器操作) */ // GIUS_A, GPR_A 相关位配置... /* 2. 配置BMI控制寄存器1 */ // 先禁用BMI进行配置 BMICTLR1 ~BMI_EN_MASK; // 清除RxFIFO BMICTLR1 | RXFIFO_CLR_MASK; // 设置16位数据模式 (假设Bit 3是16BIT_SEL) BMICTLR1 | (1 3); // 设置RxFIFO水印为8个字32位(假设4位水印在Bit19-16) BMICTLR1 ~(0xF RXF_WATER_MARK_POS); BMICTLR1 | (0x8 RXF_WATER_MARK_POS); // 水印8 // 使能RxFIFO满中断如果使用中断方式 // BMICTLR1 | RXFF_INT_EN_MASK; // 最后使能BMI模块 BMICTLR1 | BMI_EN_MASK; /* 3. 配置DMA控制器 (此处为概念性代码高度依赖具体DMA控制器) */ // a. 设置DMA源地址为BMI RxFIFO数据寄存器地址 (BMIRXD) // DMA_SRC_ADDR (uint32_t)BMIRXD; // b. 设置DMA目的地址为应用程序buffer // DMA_DST_ADDR (uint32_t)buffer; // c. 设置传输数量为 buffer_size_words // DMA_TRANSFER_SIZE buffer_size_words; // d. 设置源为外设BMI宽度为32位因为BMIRXD是32位寄存器地址固定非递增 // e. 设置目的为内存宽度为32位地址递增。 // f. 将DMA请求源映射到 BMI_DMA_REQ[1] RxFIFO满请求 // g. 使能DMA通道。 /* 4. 启动传输 */ // 一旦外部设备向BMI写入数据使得RxFIFO数据量8BMI_DMA_REQ[1]即有效触发DMA自动搬运。 }5. 常见问题排查与调试技巧实录5.1 EIM相关典型问题问题1配置了EIM片选但访问外部存储器时无任何信号CS、OE、地址变化。排查思路确认片选使能首先检查CSEN位是否已设置为1。这是最容易被忽略的一步。确认地址映射检查处理器的内存控制器或MMU配置确保你访问的物理地址确实落在了该片选配置的地址范围内。可以使用一个简单的指针解引用操作如*(volatile uint32_t *)0x80000000 0x12345678;然后用示波器或逻辑分析仪观察对应引脚。检查GPIO复用确认连接EIM相关信号ADDR[xx],DATA[xx],CSn,OE等的引脚其GPIO复用功能是否已正确设置为“EIM”或“外部总线”模式而不是普通的GPIO输入输出。查阅芯片的IOMUX章节。检查时钟与复位确认EIM模块所在的时钟域通常是HCLK已使能且模块未被全局复位或处于低功耗关断状态。问题2读写外部SRAM数据不稳定偶尔出错。排查思路用时序分析工具这是最有效的方法。使用逻辑分析仪或示波器捕获CS、OE/WE、ADDR、DATA的波形。重点测量tACS地址建立到CS有效时间是否符合SRAM要求的最小值tOEOE有效到数据输出有效EIM的OEA设置是否给了足够的时间tOHOE无效后数据保持时间OEN设置是否满足tWP写脉冲宽度WEA和WEN的设置是否保证了足够的写有效时间计算与调整根据测量结果和SRAM数据手册重新计算WSC、OEA、OEN、CSA、CSN等参数。通常需要增加等待状态或调整信号边沿位置。检查硬件检查PCB布线是否存在信号完整性问题过冲、振铃、地址/数据线短路、虚焊以及电源是否干净稳定。在高速下总线终端电阻也可能需要调整。问题3使用同步突发模式读取Burst Flash只能读到第一个数据后续突发数据错误。排查思路检查突发控制信号用逻辑分析仪查看BCLK、LBA信号是否正常产生。LBA是否在第一个BCLK上升沿之前有效BCLK的频率由BCD设置是否在Flash支持的范围内检查DOL参数DOL数据输出长度设置可能过小。Flash在BCLK边沿后需要一定时间tCLK才能将数据放到总线上DOL就是EIM采样前的等待周期。尝试增大DOL值。检查PSZ和WRAP确认PSZ页大小/突发长度设置与Flash的突发长度配置是否一致。如果Flash配置为线性突发而EIM设置了WRAP1回绕模式会导致地址序列不匹配。检查PME页模式仿真如果Flash本身不支持标准的同步突发是需要页模式可能需要设置PME1。5.2 BMI相关典型问题问题1BMI使能后外部设备无法通过BMI接口写入数据或CPU读不到数据。排查思路确认工作模式检查MASTER_SEL和MMD_MODE_SEL位确保BMI被配置为正确的模式从模式。检查信号极性检查CLK_CS_POL和READ_REQ_POL。如果外部设备在时钟上升沿采样数据而BMI在下降沿输出时钟就会出错。确保极性与外部设备期望的一致。检查FIFO状态读取BMISTR状态寄存器查看RxF_FULL、TxF_EMPTY等状态位。如果RxF_FULL一直为1说明RxFIFO已满且未被读取后续数据无法写入。此时需要CPU或DMA及时读取BMIRXD。检查BMI_READ_REQ信号在从模式下当TxFIFO有数据时BMI会断言BMI_READ_REQ通知外部主设备来读。如果外部设备不理会此信号数据会一直堵在TxFIFO。确认该信号已正确连接并被外部设备识别。问题2使用DMA搬运BMI数据出现数据丢失或错位。排查思路检查DMA传输宽度与BMI数据宽度如果BMI配置为16位模式16BIT_SEL1但DMA配置为按8位或32位传输必然导致数据错乱。确保DMA的传输宽度与BMI的数据端口宽度匹配。当16BIT_SEL1时每次读写BMIRXD/BMITXD寄存器操作的是16位数据位于低16位但DMA访问该寄存器地址时应配置为16位传输。检查水印与DMA速度如果数据流速度非常快而DMA响应速度或总线带宽不足可能导致FIFO溢出。尝试增大FIFO水印值给DMA更长的反应时间或者优化DMA优先级和总线仲裁。检查中断/DMA请求连接确认BMI_DMA_REQ[1]对应RxFIFO或BMI_DMA_REQ[0]对应TxFIFO信号是否正确连接到DMA控制器的指定请求输入引脚。这需要在芯片级交叉开关或DMA复用器中配置。问题3BMI通信速率达不到预期。排查思路检查时钟分频确认DIV设置。Int_Clk频率 HCLK/ (分频系数)。同时牢记BMI_CLK/CS频率必须 HCLK/3的限制。检查等待状态在主模式下WS设置会增加每个访问周期的长度。在满足外部设备时序的前提下尽可能减少WS。优化软件/驱动如果使用CPU轮询FIFO状态开销很大。务必使用中断或DMA。对于DMA设置合理的水印并确保DMA传输块大小足够大以减少总线仲裁和启动开销。检查总线竞争BMI通过AHB总线与内存交换数据。如果总线上有其他高优先级主设备如CPU、另一个DMA频繁占用会阻塞BMI的DMA传输。可以适当提高BMI相关DMA通道的优先级。5.3 调试工具与方法推荐逻辑分析仪必备工具。连接EIM/BMI的相关信号线数据、地址、控制可以最直观地看到时序波形对照数据手册和寄存器配置能快速定位绝大部分时序和协议问题。示波器用于测量关键信号的建立/保持时间、脉冲宽度、检查信号质量过冲、振铃、毛刺。寄存器查看与修改在调试器如JTAG中实时查看和修改EIM、BMI以及相关GPIO复用、时钟控制器的寄存器值进行动态调试。软件仿真对于一些复杂时序可以先用脚本或计算工具根据设备手册参数和HCLK频率预先计算出寄存器配置值减少硬件调试的盲目性。简化测试程序编写最简化的测试代码例如先配置EIM后循环向固定外部地址写入不同的可识别模式如0xAA55AA55,0x55AA55AA然后用逻辑分析仪观察排除复杂程序逻辑的干扰。配置EIM和BMI是一个对硬件时序和软件配置都要求精确的过程。我的经验是永远不要完全相信计算值一定要用逻辑分析仪进行实测验证。先从保守的、带较多等待状态的配置开始确保通信稳定然后再逐步收紧时序优化性能。同时仔细阅读芯片勘误表Errata有时一些异常行为是已知的硬件问题需要通过软件绕开。

相关新闻