请问,我在DSP端配置好异步EMIFA接口,采用oe we clk cs2 这几个信号,和地址、数据总线与fpga连接,DSP配置如下:
DEVICE_LPSCTransition(PSCNUM0, LPSC_EMIFA, PD0, PSC_ENABLE); // //// Set PINMUX for EMIF useDEVICE_pinmuxControl(6 ,0x0000000F,0x00000001); // EMA_CLKDEVICE_pinmuxControl(7 ,0xF0FF000F,0x10110001); // nEMA_WE, nEMA_OE, nEMA_CS[2]DEVICE_pinmuxControl(8 ,0xFFFFFFFF,0x11111111); // EMA_D[15:8]DEVICE_pinmuxControl(9 ,0xFFFFFFFF,0x11111111); // EMA_D[7:0]DEVICE_pinmuxControl(11,0xFFFFFFFF,0x11111111); // EMA_A[15..8]DEVICE_pinmuxControl(12,0xFFFFFFFF,0x11111111); // EMA_A[7..0]//Set async mode as normal modeEMIFAAsyncDevOpModeSelect(SOC_EMIFA_0_REGS, EMIFA_CHIP_SELECT_2, EMIFA_ASYNC_INTERFACE_NORMAL_MODE);//Disable the wait pinEMIFAExtendedWaitConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_2,EMIFA_EXTENDED_WAIT_DISABLE);//Timing configEMIFAWaitTimingConfig(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_2, EMIFA_ASYNC_WAITTIME_CONFIG(1,2,1,1,2,1,0));//Width configEMIFAAsyncDevDataBusWidthSelect(SOC_EMIFA_0_REGS,EMIFA_CHIP_SELECT_2,EMIFA_DATA_BUSWITTH_16BIT);
程序主循环
while(1) { HWREG(SOC_EMIFA_CS2_ADDR+emifa_cs2_offset) = emifa_cs2_offset * 2; Delay(0x000000f); emifa_read = HWREG(SOC_EMIFA_CS2_ADDR+emifa_cs2_offset) ; // read a data; Delay(0x000000f); if(emifa_cs2_offset++ >= 1023) emifa_cs2_offset = 0; }
现在产生的问题是,每一个读写周期中,CS片选拉低的时间内,读写操作分别会产生2个oe和we信号,并且第一个we有效时,数据总线是正确的,但是第二个we信号,总线数据是0。请问这是怎么回事,是不是我哪里配置错了
Tony Tang:
HWREG是32bit的指针操作,而EMIFA是16bit的,一个32bit的CPU操作到EMIFA接口分解为2个16bit的硬件动作。是正确的。
Camel Santo:
回复 Tony Tang:
您好,麻烦问下,我用的16bit,发送数据正常,但是地址偏移需要*2 是为什么?就是想发送0x0003的地址,emif偏移就得0x0006。。。也是异步CS5和fpga通讯