SDRAM 和 异步存储器共用EMIF引脚说明
EMA_D[x:0] EMIFA数据总线
EMA_A[x:0] EMIFA地址总线
当和SDRAM存储器连接时,地址线主要用于提供SDRAM的行列地址。
EMA_A[10] 管脚在PRE命令中用来选择哪个跳槽要去激活,当和异步存储器连接时,这些地址线 结合EMA_BA管脚形成一个地址给存储器。
EMA_BA[1:0] EMIFA 槽地址线
和SDRAM存储器连接时,这几个管脚用来选择SDRAM的槽。
当和异步存储器连接时,管脚和EMA_A结合生成存储器的内部地址。
EMA_WE_DQM[x:0] 低有效,字节使能
和SDRAM存储器连接时,这些管脚和SDRAM的DQM管脚连接,来对每个字节访问的使能和禁 止。当和异步存储器连接时,这些管脚和字节使能连接。
EMA_WE 低有效,写使能
和SDRAM芯片连接时,管脚和SDRAM芯片的WE管脚连接,用于给芯片发送命令。
和异步存储器连接时,管脚提供写使能信号。
EMA_CS[0] 低有效,SDRAM存储器的片选信号。
管脚和SDRAM存储器的片选信号管脚相连,用来使能和禁止命令。默认情况,EMIFA始终保持 SDRAM的片选信号有效,即使EMIFA没有和SDRAM相连。在访问异步设备时,管脚无效,在访问结 束后,管脚有效。
EMA_RAS 低有效,行地址选通管脚。
EMA_CAS 低有效,列地址选通管脚。
EMA_SDCKE 时钟使能管脚。
管脚和SDRAM的CKE管脚相连。在设备进入自刷新模式中,用来处理SELF REFRESH命令。
EMA_CLK SDRAM的时钟管脚。
和SDRAM的CLK管脚连接。
EMIFA
异步存储器专用管脚说明
EMA_CS[5:2] 低有效,异步存储器的片选。
这些管脚和异步存储器的片选信号管脚相连。管脚只有对异步设备访问时才有效。
EMA_WAIT 可编程输入NAND FLASH 读就绪输入信号。
异步设备可以通过EMA_WAIT信号来延长就绪的时间。通过对CE2CFG寄存器的EW位置位来使能这个功能。另外,WP0位用来指定EMA_WAIT信号的极性。当外部连接的是NAND FLASH时,该信号表示NAND FLASH就绪。
EMA_OE 低有效,异步设备使能管脚。
EMA_A_RW EMIFA异步读写控制。
读期间为高电平,写期间为低电平。
下面是广州创龙公司提供的DSP TMS320C6748 与FPGA基于EMIF总线通信的示例,以供参考:
- /****************************************************************************/
- /* */
- /* DSP 涓?FPGA 閫氫俊娴嬭瘯(EMIF) */
- /* */
- /* 2014骞?0鏈?4鏃? */
- /* */
- /****************************************************************************/
- #include "hw_types.h" // 瀹忓懡浠?#include "hw_syscfg0_C6748.h" // 绯荤粺閰嶇疆妯″潡瀵勫瓨鍣?#include "soc_C6748.h" // DSP C6748 澶栬瀵勫瓨鍣?#include "psc.h" // 鐢垫簮涓庣潯鐪犳帶鍒跺畯鍙婅澶囨娊璞″眰鍑芥暟澹版槑
- #include "gpio.h" // 閫氱敤杈撳叆杈撳嚭鍙e畯鍙婅澶囨娊璞″眰鍑芥暟澹版槑
- #include "rtc.h" // 瀹炴椂鏃堕挓瀹忓強璁惧鎶借薄灞傚嚱鏁板0鏄?#include "interrupt.h" // DSP C6748 涓柇鐩稿叧搴旂敤绋嬪簭鎺ュ彛鍑芥暟澹版槑鍙婄郴缁熶簨浠跺彿瀹氫箟
- #include "EMIFAPinmuxSetup.h"
- #include "emifa.h"
- #include "uartStdio.h" // 涓插彛鏍囧噯杈撳叆杈撳嚭缁堢鍑芥暟澹版槑
- /****************************************************************************/
- /* */
- /* 瀹忓畾涔? */
- /* */
- /****************************************************************************/
- #define EMIF_BUFFER_LENGTH 32768
- /****************************************************************************/
- /* */
- /* 鍏ㄥ眬鍙橀噺 */
- /* */
- /****************************************************************************/
- unsigned short emif_wbuffer[EMIF_BUFFER_LENGTH];
- unsigned short emif_rbuffer[EMIF_BUFFER_LENGTH];
- /****************************************************************************/
- /* */
- /* 鍑芥暟澹版槑 */
- /* */
- /****************************************************************************/
- void Delay(volatile unsigned int count);
- void PSCInit(void);
- void EMIFASetup(void);
- /****************************************************************************/
- /* */
- /* 涓诲嚱鏁? */
- /* */
- /****************************************************************************/
- int main(void)
- {
- volatile int EMIFA_error_count = 0;
- int i,j;
- char ch[2];
- /* 鍒濆鍖栦覆鍙g粓绔?浣跨敤涓插彛2*/
- UARTStdioInit();
- /* 鎵撳嵃涓插彛缁堢淇℃伅 */
- UARTPuts("rnEMIFA Test Application.rn", -2);
- UARTPuts("Waiting for FPGA to be ready .......rn", -2);
- Delay(0x0ffffff);
- /* 浣胯兘PSC */
- PSCInit();
- /* 鍒濆鍖朎MIFA */
- EMIFASetup();
- /* 鍒濆鍖栨暟鎹紦鍐插尯 */
- for (i = 0; i < EMIF_BUFFER_LENGTH; i++)
- {
- emif_wbuffer[i] = (short)(i);
- emif_rbuffer[i] = 0xDEAD;
- }
- /* 鍚慒PGA鍐欐暟鎹?*/
- UARTprintf( "Writing %d words to FPGArn", EMIF_BUFFER_LENGTH );
- for (i = 0; i < EMIF_BUFFER_LENGTH; i++)
- {
- ((short *)SOC_EMIFA_CS2_ADDR)[i] = emif_wbuffer[i];
- }
- /* 璇诲彇FPGA鏁版嵁缂撳啿鍖?*/
- UARTprintf( "Reading %d words to FPGArn", EMIF_BUFFER_LENGTH );
- for (i = 0; i < EMIF_BUFFER_LENGTH; i++)
- {
- emif_rbuffer[i] = ((short *)SOC_EMIFA_CS2_ADDR)[i];
- }
-
- /* 妫€鏌MIFA浼犺緭鐨勬暟鎹槸鍚︽纭?(loopback modes only) */
- for (i = 0; i
- {
- if (emif_wbuffer[i] != emif_rbuffer[i])
- {
- EMIFA_error_count++;
- }
- }
- if(EMIFA_error_count)
- {
- UARTPuts("Data mismatch in buffers.n",-2);
- UARTprintf( "EMIFA_error_count=%dn",EMIFA_error_count);
- while(1);
- }
- else
- UARTPuts("EMIFA transfers complete!n",-2);
- UARTPuts("Do you want to print all the data?(y/n) ",-2);
- UARTGets(ch,2);
- UARTPuts("n", -2);
- if(ch[0] == 'y')
- {
- /* 鎵撳嵃鍏ㄩ儴璇诲埌鐨勬暟鎹?*/
- for(i=0; i
- {
- for(j=0; j<5; j++)
- {
- UARTprintf("rd[%d]=%d ",i,emif_rbuffer[i]);
- i++;
- if(i >= EMIF_BUFFER_LENGTH)
- break;
- }
- UARTPuts("n",-2);
- }
- }
- /* 涓诲惊鐜?*/
- for(;;)
- {
- }
- }
- /****************************************************************************/
- /* */
- /* PSC 鍒濆鍖? */
- /* */
- /****************************************************************************/
- void PSCInit(void)
- {
- /* 浣胯兘EMIFA妯″潡 */
- PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_EMIFA, PSC_POWERDOMAIN_ALWAYS_ON,
- PSC_MDCTL_NEXT_ENABLE);
- }
- /****************************************************************************/
- /* */
- /* 鍒濆鍖?EMIFA */
- /* */
- /****************************************************************************/
- void EMIFASetup(void)
- {
- /* 閰嶇疆EMIFA鐩稿叧澶嶇敤寮曡剼 */
- EMIFAPinMuxSetup();
- /* 閰嶇疆鏁版嵁鎬荤嚎16bit */
- EMIFAAsyncDevDataBusWidthSelect(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_2,
- EMIFA_DATA_BUSWITTH_16BIT);
- /* 閫夌潃Normal妯″紡 */
- EMIFAAsyncDevOpModeSelect(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_2,
- EMIFA_ASYNC_INTERFACE_NORMAL_MODE);
- /* 绂佹WAIT寮曡剼 */
- EMIFAExtendedWaitConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_2,
- EMIFA_EXTENDED_WAIT_DISABLE);
- /* 閰嶇疆W_SETUP/R_SETUP W_STROBE/R_STROBE W_HOLD/R_HOLD TA绛夊弬鏁?*/
- EMIFAWaitTimingConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_2,
- EMIFA_ASYNC_WAITTIME_CONFIG(2, 3, 2, 2, 3, 2, 0 ));
- }
- /****************************************************************************/
- /* */
- /* 寤舵椂 */
- /* */
- /****************************************************************************/
- void Delay(volatile unsigned int count)
- {
- while(count--);
- }
复制代码
1