This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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_SETUP   W_STROBE/R_STROBE    W_HOLD/R_HOLD    TA value */
    EMIFAWaitTimingConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_4,
                           EMIFA_ASYNC_WAITTIME_CONFIG(1, 2, 1, 1, 2, 1, 0 ));

非常感谢!

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

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

        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开始。

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

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

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

    我的问题是:

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

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

  • 可以以BYTE的方式写。
    地址的映射关系可以参考以下帖子看一下。
    e2e.ti.com/.../365309
  • 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 去访问寄存器