EPI与FPGA通信的问题

现在我们的一个项目需要一个高速的数据传送,速率大概为40M Bit/s,FPGA将这个高速的数据采集进来,在内部建一个FIFO,M3通过EPI总线与FPGA进行数据的传送,现在项目只需要M3将FIFO中的数据读出而不需要向FIFO中写数据,M3将数据接收后以UDP的形式向上位机发送。

通信机制如下:

EPI采用GP MODE,8bit data,0bit address,clk en ,iRDY en.FPGA中的FIFO在有数据时将iRDY拉高,读空后将iRDY拉低。clk一直发给FIFO,作为我的读时钟。

实际测试时发现读出的数据会出现FIFO中的数据每个都被读了很多次的情况。

想请问一下按照我的这种配置,我的读数据的时钟周期和我发给FIFO的CLK(EPI0S31引脚的输出)是怎样的一个关系,datasheet上的介绍不明确。

代码如下:void EPI_Init()

{

SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0); //使能EPI模块

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);

GPIOPinConfigure(GPIO_PH3_EPI0S0); //引脚设置

GPIOPinConfigure(GPIO_PH2_EPI0S1);

GPIOPinConfigure(GPIO_PC4_EPI0S2);

GPIOPinConfigure(GPIO_PC5_EPI0S3);

GPIOPinConfigure(GPIO_PC6_EPI0S4);

GPIOPinConfigure(GPIO_PC7_EPI0S5);

GPIOPinConfigure(GPIO_PH0_EPI0S6);

GPIOPinConfigure(GPIO_PH1_EPI0S7);

GPIOPinConfigure(GPIO_PH7_EPI0S27);

    GPIOPinConfigure(GPIO_PD5_EPI0S28);

GPIOPinConfigure(GPIO_PD6_EPI0S29);

// GPIOPinConfigure(GPIO_PJ6_EPI0S30);

GPIOPinConfigure(GPIO_PG7_EPI0S31);  

GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_3 );  //D0

GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_2 );  //D1

GPIOPinTypeEPI(GPIO_PORTC_BASE,GPIO_PIN_4 );  //D2

GPIOPinTypeEPI(GPIO_PORTC_BASE,GPIO_PIN_5 );  //D3

GPIOPinTypeEPI(GPIO_PORTC_BASE,GPIO_PIN_6 );  //D4

GPIOPinTypeEPI(GPIO_PORTC_BASE,GPIO_PIN_7 );  //D5

GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_0 );  //D6

GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_1 );  //D7

GPIOPinTypeEPI(GPIO_PORTH_BASE,GPIO_PIN_7 );  //iRDY

GPIOPinTypeEPI(GPIO_PORTD_BASE,GPIO_PIN_5 );  //WR

GPIOPinTypeEPI(GPIO_PORTD_BASE,GPIO_PIN_6 );  //RD

// GPIOPinTypeEPI(GPIO_PORTJ_BASE,GPIO_PIN_6 );  //FRAME

GPIOPinTypeEPI(GPIO_PORTG_BASE,GPIO_PIN_7 );  //clk  

EPIModeSet(EPI0_BASE,EPI_MODE_GENERAL);  

EPIConfigGPModeSet(EPI0_BASE,EPI_GPMODE_ASIZE_NONE|EPI_GPMODE_DSIZE_8|EPI_GPMODE_RDYEN|EPI_GPMODE_CLKPIN|EPI_GPMODE_READWRITE|EPI_GPMODE_READ2CYCLE,0,0); //no addr/8bit data/clk/iRDY

EPIFIFOConfig(EPI0_BASE,EPI_FIFO_CONFIG_RX_1_2);

EPIDividerSet(EPI0_BASE, 2);  //25M

EPIIntEnable(EPI0_BASE,EPI_INT_RXREQ);  //接收中断  

IntEnable(INT_EPI0);

IntMasterEnable();

// EPIAddressMapSet(EPI0_BASE,EPI_ADDR_PER_BASE_NONE|EPI_ADDR_RAM_BASE_NONE);

EPINonBlockingReadConfigure(EPI0_BASE,0,EPI_NBCONFIG_SIZE_8,0);

}

  • 建议可以先用IO模拟读取FPGA的数据,已确定FPGA侧工作正常。

  • 读了的,IO模拟读出的数据是对的,现在出现的新问题是读出的包之间总要丢8个Byte,如:

    00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17,这之间就丢了8个byte

  • 兄弟,你还没明白Stephen的意思,EPI可以完全用软件模拟,软件模拟完全正确之后再使用硬件方式来实现。

    确认丢byte的问题在软件模拟的情况下不会发生。

  • 谢上面仁兄的关心,Stephen的方式我试过的,我将前面的速率降低,然后采用IO口去读,是正常的。给TI技术支持发邮件,结果被拒绝提供支持,理由是我们公司和航天有一点关系,,这个,,,汗。。。