根据《STR91xFA Reference manual.pdf》此使用手册的1.12小节External memory interface (EMI)中一步一步地进行EMI的配置,首先精读此章节,再根据此章节的内容及相关的寄存器来进行EMI的配置。
在程序仿真中可以通过相关的操作来观察是否正确设置了这些寄存器,通过代码的调试来使得这些相关寄存器的指定位都配置正确。
(1)EMI配置
- 复用/非复用模式
寄存器 :SCU_SCR0 bit 6 (0:复用模式 1:非复用模式)
- ALE的长度
寄存器 :SCU_SCR0 bit 8 (0:一个BCLK周期 1:两个BCLK周期)
- ALE的极性
寄存器 :SCU_SCR0 bit 7 (0:active low 1:active high)
- GPIO Port8的EMI功能
寄存器 : SCU_EMI bit 0 (0 :port8作为普通IO口 1:Port8与EMI时钟相连)
(2)EMI时钟(BCLK)
通过SCU_CLKCNTR寄存器的EMIRATIO位来进行选择(00:fBCLK=HCLK 01:fBCLK=HCLK/2)
此处的EMI进行时钟的选择是1分频,即EMI_BCLK为96MHz。具体的前端的时钟配置见Nand Flash调试日志(1)——时钟频率配置。
(3)EMI总线定时
在使能EMI总线前需要做的准备工作就是设置好总线定时的配置寄存器,这些参数直接影响到了在时序图中的各个操作的时间长短。关键的时间参数有:
- WSTOEN:读使能。片选选中到EMI_RDn信号之间的延迟时间。其由BCLK时钟周期来定义。
- WSTRD:读等待状态。EMI_RDn信号的脉冲宽度(因为是低电平有效,故脉宽是指的低电平的持续时间)。由BCLK周期定义,=(WSTRD-WSTOEN+1)此公式容易发生误解在于等号左边为具体的脉宽时间ns,数值为(WSTRD-WSTOEN+1)个BCLK时钟周期。
- WSTWEN:写使能。片选选中到EMI_WRn信号之间的延迟时间。其由BCLK时钟周期来定义,对于异步写访问,其具体时间为(WSTWEN+1/2)。
- WSTWR:写等待状态。EMI_WRn信号的脉冲宽度(因为是低电平有效,故脉宽是指的低电平的持续时间)。由BCLK周期定义,=(WSTWR-WSTWEN+1)此公式容易发生误解在于等号左边为是具体的脉宽时间ns,数值为(WSTWR-WSTWEN+1)个BCLK时钟周期。
Example: 对于一个读周期,其WSTRD=4,WSTOEN=2。【在CS片选选中后产生EMI_RDn信号的延迟时间】即为2个BCLK周期。【EMI_RDn信号的脉宽】为4-2+1=3个BCLK周期。 |
(4)定时规则
WSTRD ≥ WSTOEN > ALE
WSTWR ≥ WSTWEN > ALE
具体的寄存器见手册,此处的为且仅为其设置的数字的大小比较,而非其对应着的时序图中的时间,极容易混淆 |
以下的程序是从0517_J_NANDFlash文件夹中拷出的已调通程序。各个参数是在FIRMWARE\EMI_AN_Examples\Mux_Mode_Flash中的程序的基础上对照着《STR91xFA Reference manual.pdf》手册1.12小节来进行选择确定。
/**************************EMI configuration*********************************/
EMI_StructInit(&EMI_InitStruct);
/* Number of bus turnaround cycles added between read and write accesses.*/
EMI_InitStruct.EMI_Bank_IDCY = 0x0F ;
/* Number of wait states for read accesses*/
EMI_InitStruct.EMI_Bank_WSTRD = 0x1F ;
/* Number of wait states for write accesses*/
EMI_InitStruct.EMI_Bank_WSTWR = 0x1F ;
/*Output enable assertion delay from chip select assertion*/
EMI_InitStruct.EMI_Bank_WSTROEN = 0x02; // 手册AN2647要求的最小值为2
/*Write enable assertion delay from chip select assertion*/
EMI_InitStruct.EMI_Bank_WSTWEN = 0x02; // 手册AN2647要求的最小值为1
/*This member Controls the memory width*/
EMI_InitStruct.EMI_Bank_MemWidth = EMI_Width_Byte;
/*Write protection feature */
EMI_InitStruct.EMI_Bank_WriteProtection = EMI_Bank_NonWriteProtect;
/* Normal mode read*/
EMI_InitStruct.EMI_Burst_and_PageModeRead_Selection = EMI_NormalMode;
/*Use Bank0 (CS0)*/
EMI_Init(EMI_Bank0, &EMI_InitStruct);
摘自《STR91xFA Reference manual.pdf》手册1.12小节
进行实际的地址指针的赋值的时候,需要参考此EMI memory map,在EMI配置时配置的即为EMI_Bank0(见8.2节的代码),因此进行赋值的时候是采用的0x3C000000或0x2C000000,根据实际情况来确定是两者中的哪个。
目前我自己对这方面的地址研究不深,因此在编写程序的时候两个都进行着尝试。如有大侠可以指点一下不胜感激!