Hello,
We are using EPI0 in TIVA to write data to an FPGA.
The code for initialization is:
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOS); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOT); // // Enable pin PN2 for EPI0 EPI0S29 // ROM_GPIOPinConfigure(GPIO_PN2_EPI0S29); GPIOPinTypeEPI(GPIO_PORTN_BASE, GPIO_PIN_2); // // Enable pin PH1 for EPI0 EPI0S1 // ROM_GPIOPinConfigure(GPIO_PH1_EPI0S1); GPIOPinTypeEPI(GPIO_PORTH_BASE, GPIO_PIN_1); // // Enable pin PK3 for EPI0 EPI0S3 // ROM_GPIOPinConfigure(GPIO_PK3_EPI0S3); GPIOPinTypeEPI(GPIO_PORTK_BASE, GPIO_PIN_3); // // Enable pin PK2 for EPI0 EPI0S2 // ROM_GPIOPinConfigure(GPIO_PK2_EPI0S2); GPIOPinTypeEPI(GPIO_PORTK_BASE, GPIO_PIN_2); // // Enable pin PC5 for EPI0 EPI0S6 // ROM_GPIOPinConfigure(GPIO_PC5_EPI0S6); GPIOPinTypeEPI(GPIO_PORTC_BASE, GPIO_PIN_5); // // Enable pin PM1 for EPI0 EPI0S14 // ROM_GPIOPinConfigure(GPIO_PM1_EPI0S14); GPIOPinTypeEPI(GPIO_PORTM_BASE, GPIO_PIN_1); // // Enable pin PL1 for EPI0 EPI0S17 // ROM_GPIOPinConfigure(GPIO_PL1_EPI0S17); GPIOPinTypeEPI(GPIO_PORTL_BASE, GPIO_PIN_1); // // Enable pin PA6 for EPI0 EPI0S8 // ROM_GPIOPinConfigure(GPIO_PA6_EPI0S8); GPIOPinTypeEPI(GPIO_PORTA_BASE, GPIO_PIN_6); // // Enable pin PK7 for EPI0 EPI0S24 // ROM_GPIOPinConfigure(GPIO_PK7_EPI0S24); GPIOPinTypeEPI(GPIO_PORTK_BASE, GPIO_PIN_7); // // Enable pin PN3 for EPI0 EPI0S30 // ROM_GPIOPinConfigure(GPIO_PN3_EPI0S30); GPIOPinTypeEPI(GPIO_PORTN_BASE, GPIO_PIN_3); // // Enable pin PB2 for EPI0 EPI0S27 // ROM_GPIOPinConfigure(GPIO_PB2_EPI0S27); GPIOPinTypeEPI(GPIO_PORTB_BASE, GPIO_PIN_2); // // Enable pin PC4 for EPI0 EPI0S7 // ROM_GPIOPinConfigure(GPIO_PC4_EPI0S7); GPIOPinTypeEPI(GPIO_PORTC_BASE, GPIO_PIN_4); // // Enable pin PK6 for EPI0 EPI0S25 // ROM_GPIOPinConfigure(GPIO_PK6_EPI0S25); GPIOPinTypeEPI(GPIO_PORTK_BASE, GPIO_PIN_6); // // Enable pin PL4 for EPI0 EPI0S26 // ROM_GPIOPinConfigure(GPIO_PL4_EPI0S26); GPIOPinTypeEPI(GPIO_PORTL_BASE, GPIO_PIN_4); // // Enable pin PA7 for EPI0 EPI0S9 // ROM_GPIOPinConfigure(GPIO_PA7_EPI0S9); GPIOPinTypeEPI(GPIO_PORTA_BASE, GPIO_PIN_7); // // Enable pin PK0 for EPI0 EPI0S0 // ROM_GPIOPinConfigure(GPIO_PK0_EPI0S0); GPIOPinTypeEPI(GPIO_PORTK_BASE, GPIO_PIN_0); // // Enable pin PG0 for EPI0 EPI0S11 // ROM_GPIOPinConfigure(GPIO_PG0_EPI0S11); GPIOPinTypeEPI(GPIO_PORTG_BASE, GPIO_PIN_0); // // Enable pin PL0 for EPI0 EPI0S16 // ROM_GPIOPinConfigure(GPIO_PL0_EPI0S16); GPIOPinTypeEPI(GPIO_PORTL_BASE, GPIO_PIN_0); // // Enable pin PB3 for EPI0 EPI0S28 // ROM_GPIOPinConfigure(GPIO_PB3_EPI0S28); GPIOPinTypeEPI(GPIO_PORTB_BASE, GPIO_PIN_3); // // Enable pin PM2 for EPI0 EPI0S13 // ROM_GPIOPinConfigure(GPIO_PM2_EPI0S13); GPIOPinTypeEPI(GPIO_PORTM_BASE, GPIO_PIN_2); // // Enable pin PQ2 for EPI0 EPI0S22 // ROM_GPIOPinConfigure(GPIO_PQ2_EPI0S22); GPIOPinTypeEPI(GPIO_PORTQ_BASE, GPIO_PIN_2); // // Enable pin PG1 for EPI0 EPI0S10 // ROM_GPIOPinConfigure(GPIO_PG1_EPI0S10); GPIOPinTypeEPI(GPIO_PORTG_BASE, GPIO_PIN_1); // // Enable pin PC6 for EPI0 EPI0S5 // ROM_GPIOPinConfigure(GPIO_PC6_EPI0S5); GPIOPinTypeEPI(GPIO_PORTC_BASE, GPIO_PIN_6); // // Enable pin PQ3 for EPI0 EPI0S23 // ROM_GPIOPinConfigure(GPIO_PQ3_EPI0S23); GPIOPinTypeEPI(GPIO_PORTQ_BASE, GPIO_PIN_3); // // Enable pin PM0 for EPI0 EPI0S15 // ROM_GPIOPinConfigure(GPIO_PM0_EPI0S15); GPIOPinTypeEPI(GPIO_PORTM_BASE, GPIO_PIN_0); // // Enable pin PL2 for EPI0 EPI0S18 // ROM_GPIOPinConfigure(GPIO_PL2_EPI0S18); GPIOPinTypeEPI(GPIO_PORTL_BASE, GPIO_PIN_2); // // Enable pin PQ1 for EPI0 EPI0S21 // ROM_GPIOPinConfigure(GPIO_PQ1_EPI0S21); GPIOPinTypeEPI(GPIO_PORTQ_BASE, GPIO_PIN_1); // // Enable pin PC7 for EPI0 EPI0S4 // ROM_GPIOPinConfigure(GPIO_PC7_EPI0S4); GPIOPinTypeEPI(GPIO_PORTC_BASE, GPIO_PIN_7); // // Enable pin PQ0 for EPI0 EPI0S20 // ROM_GPIOPinConfigure(GPIO_PQ0_EPI0S20); GPIOPinTypeEPI(GPIO_PORTQ_BASE, GPIO_PIN_0); // // Enable pin PM3 for EPI0 EPI0S12 // ROM_GPIOPinConfigure(GPIO_PM3_EPI0S12); GPIOPinTypeEPI(GPIO_PORTM_BASE, GPIO_PIN_3); // // Enable pin PL3 for EPI0 EPI0S19 // ROM_GPIOPinConfigure(GPIO_PL3_EPI0S19); GPIOPinTypeEPI(GPIO_PORTL_BASE, GPIO_PIN_3);
The initialization of the EPI device is:
// // Set the EPI divider. // EPIDividerSet(EPI0_BASE, 4); // // Select GENERAL mode. // EPIModeSet(EPI0_BASE, EPI_MODE_GENERAL); EPIConfigGPModeSet (EPI0_BASE, EPI_GPMODE_ASIZE_12 | EPI_GPMODE_DSIZE_16,0,0); //Sets the peripheral address space to 64 Kbytes, base address to 0xA0000000 EPIAddressMapSet (EPI0_BASE, EPI_ADDR_PER_SIZE_64KB | EPI_ADDR_PER_BASE_A); // Wait for the EPI initialization to complete. // while(HWREG(EPI0_BASE + EPI_O_STAT) & EPI_STAT_INITSEQ) {};
Then we write 5 16bits words to the FPGA using this code:
HWREGH(0xA0000000) = 0x1111; HWREGH(0xA0000000+2) = 0x2222; HWREGH(0xA0000000+4) = 0x3333; HWREGH(0xA0000000+6) = 0x4444; HWREGH(0xA0000000+8) = 0x5555;
The attached doc contains 2 snapshots of the FPGA debugger.
You can see that framing signal sometimes wraps more than one writing.
We not using FIFO nor DMA.
Each chip select should wrap only one read\write.
Can we specify the chip select width ?
Can we specify the interval between 2 chip select ?
In case of read, what is the trigger to TIVA to start reading ?
The FPGA is not using TIVA's clock.
Regards,
Z.V