+EMIF总线使用
时间:10-02
整理:3721RD
点击:
外部存储器借口(EMIF),External Memory Interface,是TMS DSP器件上的一种接口,具体可以分为EMIFA和EMIFB。一般来说,EMIF可实现DSP与不同类型存储器(SRAM、Flash RAM、DDR-RAM等)的连接。一般EMIF与FPGA相连,从而使FPGA平台充当一个协处理器、高速数据处理器或高速数据传输接口。 设计接口提供了一个FPGA块至RAM的无缝连接。在读/写、FIFO或存储器模式中,双端口块RAM的一侧被用来实现与DSP的通信。另一侧用于实现与内部FPGA逻辑电路或平台-FPGA嵌入式处理器的通信。
下面是TMS320C6748的EMIFA 功能框图
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总线通信的示例,以供参考:
下面是TMS320C6748的EMIFA 功能框图
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("\r\nEMIFA Test Application.\r\n", -2);
- UARTPuts("Waiting for FPGA to be ready \r\n", -2);
- Delay(0x0ffffff);
- /* 浣胯兘PSC */
- PSCInit();
- /* 鍒濆鍖朎MIFA */
- EMIFASetup();
- /* 鍒濆鍖栨暟鎹紦鍐插尯 */
- for (i = 0; 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--);
- }
编码存在问题,一堆乱码