TI中文支持网
TI专业的中文技术问题搜集分享网站

FPGA获得的EMIF地址为什么被右移了一位?

DSP通过EMIF接口往CE4 地址 0x6400 0080 写了个 byte 0x01,FPGA那边得到的地址(24位)却是 000040,正常应该是 000080,各位大神,这是什么原因呢?

下面是 EMIF 的配置:

HWREG(SOC_EMIFA_0_REGS + EMIFA_CE4CFG) &= 0x00000000u;/* Configure Data BUS: 16bit */EMIFAAsyncDevDataBusWidthSelect(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4,EMIFA_DATA_BUSWITTH_16BIT);/* set Normal mode */EMIFAAsyncDevOpModeSelect(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4,EMIFA_ASYNC_INTERFACE_NORMAL_MODE);/* disable WAIT pin */EMIFAExtendedWaitConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4,EMIFA_EXTENDED_WAIT_DISABLE);/* set W_SETUP/R_SETUPW_STROBE/R_STROBEW_HOLD/R_HOLDTA value */EMIFAWaitTimingConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4,EMIFA_ASYNC_WAITTIME_CONFIG(1, 2, 1, 1, 2, 1, 0 ));

非常感谢!

Nancy Wang:

检查一下硬件地址线部分有没有问题,具体参考·TRM 18.2.5.1 Interfacing to Asynchronous Memory 异步 16bit 设备。
DSP这边地址部分不需要寄存器配置,FPGA的代码检查看看。

,

Jing Chi:

感谢你的快速回复!!

我又做了些测试,发现跟开始写的地址有关(应该只是表象),下面是我的代码:

EMIFA_Init();volatile uint16_t* p = (uint16_t*)(0x60000000);int i = 0;uint16_t v = 0;for ( ; i < 300; ++i){*p++ = v++;}

这个case写的数据地址都是对的,包括 0x60000100后的地址写入也是对的,但是,如果我把地址p的值改为 '

volatile uint16_t* p = (uint16_t*)(0x60000100);'

,就不对了,在FPGA那边看到的地址就成了 000080开始。

下面这个是对的数据的截图:

这个是不对的数据的截图:

,

Jing Chi:

对了,DSP与FPGA是这样子连接的:

我的问题是:

1. DSP这边能不能以 BYTE 的方式写?(设置数据宽度为8 bits)

2. FPGA得到的地址应该是什么样子的?

,

Nancy Wang:

可以以BYTE的方式写。
地址的映射关系可以参考以下帖子看一下。
e2e.ti.com/…/365309

,

Jing Chi:

OK,谢谢

地址问题基本搞定,总结一下,仅供参考:

1. EMIFA 有 8-bits 和 16-bits 模式

2. 8-bits 模式需要用到 Bank 地址 BA[0-1],作为低位2 bits 和 地址A[0-]拼一块成为对该片选寄存器基址的偏移量,以字节为单位;

3. 16-bits 模式需要用到 Bank 地址 BA[1],作为低位 1 bits 和地址 A[0-]拼一块成为对该片选寄存器基址的偏移量,以word双字节为单位;

4. 不同模式下硬件连接是不同的

5. 不同模式下软件最好分别以 uint8_t 和 uint16_t 去访问寄存器

,

Nancy Wang:

感谢分享!

赞(0)
未经允许不得转载:TI中文支持网 » FPGA获得的EMIF地址为什么被右移了一位?
分享到: 更多 (0)