外部存储器接口(EMIF)软件设置


外部存储总线在处理器和外部存储空间之间起着沟通桥梁的作用。处理器通过它可连接多个不同类型的存储器,在访问时按照对应的地址分区进行确定访问,地址线发送具体位置。

片选信号(CE0~CE3):
每个片选信号对应一块独立的外部存储区域(比如CE0接闪存,CE1接SDRAM)。
作用:相当于给每个设备发“点名卡”,选中哪个设备,哪个设备才响应操作。
示例:
当CPU访问地址 400000~7F FFFF 时,自动激活CE1片选信号,通知CE1连接的设备(如SDRAM)开始工作。

地址总线和数据总线:
地址总线:告诉外部设备“我要访问哪个位置”(类似快递单上的门牌号)。
数据总线:传输实际数据(比如快递包裹的内容)。

时序控制:
接口会根据存储器的类型(异步/SDRAM)自动调整读写信号的节奏,确保设备能正确接收指令。
异步存储器(如SRAM):需手动配置时序参数(比如读写延迟)。
同步存储器(如SDRAM):接口内置时钟同步,自动匹配高速传输。

1. 核心目标

通过软件配置 EMIF 的寄存器,告诉处理器:

  • 连接了哪些外部设备(如 SRAM、SDRAM)
  • 如何与这些设备通信(如时序参数、数据位宽)

你提供的代码正是通过 芯片支持库(CSL) 完成这一配置。


2. 代码解析(分步骤说明)

(1) 包含头文件
#include <csl_emif.h>  // 引入 EMIF 的库函数和寄存器定义
(2) 声明 EMIF 配置结构体

定义 EMIF_Config 结构体,填入寄存器值,描述每个参数的作用:

EMIF_Config Config_EMIF = {
    // ------------ 全局控制寄存器 ------------
    0x0281,  // 配置全局工作模式(如时钟、HOLD信号是否启用)
    /*
       CLKMEM=OFF   → 关闭存储器时钟输出(若无需同步设备)
       HOLD_disabled → 禁用总线保持功能
    */

    // ------------ 初始化寄存器 ------------
    0xFFFF,  // 初始化默认值(通常无需修改)

    // ------------ CE0空间配置(异步存储器) ------------
    0x100c,  // CE0控制寄存器1(设置读时序)
    /*
       MTYPE=001B    → 16位异步存储器(如SRAM)
       READ_START=0000b → 读建立周期=0个时钟(地址稳定到读信号开始的时间)
       READ_STROBE=000011b → 读选通周期=3个时钟(读信号持续的时长)
       READ_HOLD=01b → 读保持周期=1个时钟(读信号结束后保持地址的时间)
    */

    0x0FFF,  // CE0控制寄存器2(设置写时序)
    /*
       WRITE_SETUP=1111b  → 写建立周期=15个时钟
       WRITE_STROBE=111111b → 写选通周期=63个时钟
       WRITE_HOLD=11b → 写保持周期=3个时钟
    */

    0x00FF,  // CE0控制寄存器3(超时设置)
    /*
       TIMEOUT=0xFF → 超时计数=255(防止总线死锁)
    */

    // ------------ CE1空间配置(异步存储器) ------------
    0x013E,  // CE1控制寄存器1(读时序)
    /*
       MTYPE=000B → 8位异步存储器(如某些ROM)
       READ_START=0001b → 读建立周期=1个时钟
       READ_STROBE=001111b → 读选通周期=15个时钟
    */

    0x0FFF,  // CE1控制寄存器2(写时序,同CE0)
    0x00FF,  // CE1控制寄存器3(超时)

    // ------------ CE2空间配置(异步存储器) ------------
    0x1105,  // CE2控制寄存器1(读时序)
    0x0105,  // CE2控制寄存器2(写时序)
    0x00FF,  // CE2控制寄存器3(超时)

    // ------------ CE3空间配置(异步存储器) ------------
    0x110D,  // CE3控制寄存器1(读时序)
    0x010D,  // CE3控制寄存器2(写时序)
    0x00FF,  // CE3控制寄存器3(超时)

    // ------------ SDRAM相关配置(未使用)------------
    0x07FF,  // SDRAM控制寄存器1(默认值)
    0x0FFF,  // SDRAM刷新周期(未使用)
    0x07FF,  // SDRAM初始化命令(未使用)
    0x03FF   // SDRAM控制寄存器2(默认值)
};
(3) 调用配置函数
EMIF_config(&Config_EMIF); // 将配置写入EMIF寄存器,完成初始化

3. 关键参数详解

(1) 时序参数
  • 读/写建立周期(Setup Time)
    地址信号稳定后,需要等待的时间才能发出读/写信号(防止信号抖动)。
    示例:读建立周期=1 → 等待1个时钟周期。

  • 读/写选通周期(Strobe Time)
    读/写信号保持有效的时长,确保数据可靠传输。
    示例:读选通周期=3 → 读信号持续3个时钟周期。

  • 读/写保持周期(Hold Time)
    读/写信号结束后,地址信号继续保持的时间(避免设备提前释放数据)。
    示例:写保持周期=3 → 写信号结束后地址保持3个时钟。

(2) 存储器类型(MTYPE)
  • 000B:8位异步存储器(如某些ROM)
  • 001B:16位异步存储器(如SRAM)
  • 010B:32位异步存储器
  • 其他值:支持SBSRAM或SDRAM(需结合时序配置)。
(3) 超时设置(TIMEOUT)

防止总线死锁,若设备未响应,超过设定时间后强制释放总线。


4. 实际开发中的操作步骤

####(1) 根据硬件设计确定参数

  • 查阅存储器手册:获取时序要求(如tSU, tH, tW)。
  • 计算时钟周期数
    假设CPU时钟50MHz(周期20ns),若tSU要求30ns → 建立周期=30ns/20ns=1.5 → 向上取整为2。
(2) 配置结构体

按代码模板填入参数,重点关注:

  • CE空间分配:确保地址范围不重叠(参考表5-6)。
  • 时序参数:匹配存储器性能。
  • 数据位宽(MTYPE):与硬件连接一致(如16位存储器需接16根数据线)。
(3) 调试验证
  • 逻辑分析仪:检查实际波形是否符合时序要求。
  • 读写测试:向外部存储器写入特定模式(如0xAA55),再读回验证。

5. 常见问题

(1) 地址错误导致数据损坏
  • 现象:写入数据后读回不一致。
  • 解决:检查地址映射是否与硬件连接匹配(如CE空间范围)。
(2) 时序不匹配导致设备无响应
  • 现象:访问外部存储器时系统卡死。
  • 解决:增加建立或保持周期,或降低时钟频率。
(3) 数据位宽配置错误
  • 现象:16位存储器只能读取低8位数据。
  • 解决:检查MTYPE是否设置为16位(如001B)。

总结

这段代码的本质是:通过寄存器配置,告诉EMIF模块如何与外部设备“对话”
关键操作:

  1. 匹配时序:根据设备手册计算周期数。
  2. 分配空间:确保CE片选信号与地址范围对应。
  3. 验证调试:用工具确认信号稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值