DSP

dsp EMIF接口

2019-07-13 10:11发布

EMIF,全称是External Memory Interface,外部存储器接口,用于片外储存器扩展和外部数据接口的一种并行数据传输片上外设。它能与三种外部存储器无缝连接:同步突发静态存储器(SBSRAM),同步动态存储器(SDRAM),异步存储器(SRAM,ROM,FLASH)等。 这里补充一下它们的区别,虽然我觉得不是重点: SDRAM:读写操作要求与外部时钟同步;动态存储,芯片需要定时刷新;同步技术使得用于大容量、高速存储领域。 SBSRAM:支持同步突发访问,所以读写速度高;属于SRAM范畴,属于静态RAM,不需要刷新。 异步存储器:简单直接,时钟不必同步;但容量小,主要用于小容量数据存储和程序存储。
EMIF主要和EDMA和外设存储器连接通信,通过引脚。引脚中的CE片选引脚很重要,每个片选引脚对应一个CE空间。其它引脚如图:
虽然不同型号dsp寄存器名称有差别,但大体有如下最重要的EMIF寄存器: GBLCTL:EMIF全局控制寄存器 CECTL0/1/2/3:CE空间控制寄存器 SDCTL:SDRAM控制寄存器 SDTIM:SDRAM时序控制寄存器 SDEXT:SDRAM扩展控制寄存器
对于与SDRAM连接的配置过程: 配置开始-》全局控制寄存器配置EMIF时钟-》CE空间寄存器配置SDRAM空间-》SDCTL配置SDRAM工作模式-》SDTIM配置刷新模式-》配置扩展功能-》配置结束
对于与Flash连接的配置过程: 配置开始-》全局配置时钟,Flash接口选择-》CE空间读写时序控制-》配置结束
一般程序架构: #...宏定义 #include #include ... void erase_Flash(); //函数声明 void write_Flash(); unsigned int read_Flash();
EMIF_Config myFlash = { //通过结构体配置 //配置全局寄存器 EMIF_GBLCTL_RMK( ... ), //配置CE寄存器1,但0、2、3忽略 EMIF_GECTL_DEFAULT, EMIF_GECTL_RMK( ... ), EMIF_GECTL_DEFAULT, EMIF_GECTL_DEFAULT, //忽略SDRAM相关寄存器 EMIF_SDCTL_DEFAULT, EMIF_SDTIM_DEFAULT, EMIF_SDEXT_DEFAULT, ... ... }
void main() { ... CSL_init(); EMIF_config(&myFlash); erase_Flash(); //对flash而言,写入前先擦除 Flash_ptr = (unsigned int *)FLASH_BEGIN; //写入的初始地址 for(i = 0;i{ write_Flash(bootfile[i],Flash_ptr++); } ... }
void erase_Flash() { *FLASH_ADR2 = 0xaa; //擦除操作命令序列,flash特殊 *FLASH_ADR1 = 0x55; *FLASH_ADR2 = 0x80; *FLASH_ADR2 = 0xaa; *FLASH_ADR1 = 0x55; *FLASH_ADR2 = 0x10; }
void write_Flash(unsigned int data,unsigned int addr) { *FLASH_ADR2 = 0xaa; //写操作命令序列,flash特殊,换作SDRAM则不用。 *FLASH_ADR1 = 0x55; *FLASH_ADR2 = 0xa0; *addr = data; }
unsigned int read_Flash(unsigned int addr) { return (*addr); }