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:
感谢分享!