现在我们的一个项目需要一个高速的数据传送,速率大概为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);
}
兄弟,你还没明白Stephen的意思,EPI可以完全用软件模拟,软件模拟完全正确之后再使用硬件方式来实现。
确认丢byte的问题在软件模拟的情况下不会发生。
谢上面仁兄的关心,Stephen的方式我试过的,我将前面的速率降低,然后采用IO口去读,是正常的。给TI技术支持发邮件,结果被拒绝提供支持,理由是我们公司和航天有一点关系,,这个,,,汗。。。