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);
}