We are using the TM4C1294KCPDT micro-controller with the EPI bus 32-bit (EPIOS0 - EPIOS31) to XC7S25-2CSGA225C FPGA. The FPGA asserts pin PP0 configured as an interrupt input (fpgaReadReady) when data is available to transfer to the micro-controller. Within the interrupt, we want to read the EPI bus data into the micro-controller. The micro-controller then asserts pin PM5 configured as an output to acknowledge data receipt (ucReadACK). It works fine when the EPI bus pins are configured as GPIO inputs, however our attempts to set this up using the TivaWare EPI library have failed thus far. Can you provide any examples that configure the EPI bus just to read the 32 EPI pin states when queried? Please review the attached code and let me know if you see any violations in the usage.
The following are the relevant sections used to configure and read the EPI bus. Note, not using interrupt while attempting to debug.
static void configEPIPeripheral( void )
{
// Configure FPGA read acknowledge output
MAP_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOM );
while( ! MAP_SysCtlPeripheralReady( SYSCTL_PERIPH_GPIOM ) );
MAP_GPIOPinTypeGPIOOutput( SYSCTL_PERIPH_GPIOM, OUTPUT_EPI0_READ_ACK_PM5 );
MAP_GPIOPinWrite( SYSCTL_PERIPH_GPIOM, OUTPUT_EPI0_READ_ACK_PM5, OUTPUT_EPI0_READ_ACK_PM5 );
// Configure FPGA read ready input
MAP_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOP );
while( ! MAP_SysCtlPeripheralReady( SYSCTL_PERIPH_GPIOP ) );
MAP_GPIOPinTypeGPIOInput( GPIO_PORTP_BASE, INPUT_EPI0_READ_RDY_INT_PP0 );
enablePeripheral( SYSCTL_PERIPH_EPI0 );
// Configure EPI pins
MAP_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOA );
while( ! MAP_SysCtlPeripheralReady( SYSCTL_PERIPH_GPIOA ) );
MAP_GPIOPinTypeEPI( GPIO_PORTA_BASE, EPI0_SIGNAL_9_PA7 | EPI0_SIGNAL_8_PA6 );
MAP_GPIOPinConfigure( EPI0_SIGNAL_9_PA7 | EPI0_SIGNAL_8_PA6 );
MAP_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );
while( ! MAP_SysCtlPeripheralReady( SYSCTL_PERIPH_GPIOB ) );
MAP_GPIOPinTypeEPI( GPIO_PORTB_BASE, EPI0_SIGNAL_28_PB3 | EPI0_SIGNAL_27_PB2 );
MAP_GPIOPinConfigure( EPI0_SIGNAL_28_PB3 | EPI0_SIGNAL_27_PB2 );
MAP_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOC );
while( ! MAP_SysCtlPeripheralReady( SYSCTL_PERIPH_GPIOC ) );
MAP_GPIOPinTypeEPI( GPIO_PORTC_BASE, EPI0_SIGNAL_4_PC7 | EPI0_SIGNAL_5_PC6 | EPI0_SIGNAL_6_PC5 | EPI0_SIGNAL_7_PC4 );
MAP_GPIOPinConfigure( EPI0_SIGNAL_4_PC7 | EPI0_SIGNAL_5_PC6 | EPI0_SIGNAL_6_PC5 | EPI0_SIGNAL_7_PC4 );
MAP_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOG );
while( ! MAP_SysCtlPeripheralReady( SYSCTL_PERIPH_GPIOG ) );
MAP_GPIOPinTypeEPI( SYSCTL_PERIPH_GPIOG, EPI0_SIGNAL_10_PG1 | EPI0_SIGNAL_11_PG0 );
MAP_GPIOPinConfigure( EPI0_SIGNAL_10_PG1 | EPI0_SIGNAL_11_PG0 );
MAP_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOK );
while( ! MAP_SysCtlPeripheralReady( SYSCTL_PERIPH_GPIOK ) );
MAP_GPIOPinTypeEPI( SYSCTL_PERIPH_GPIOH, EPI0_SIGNAL_24_PK7 | EPI0_SIGNAL_25_PK6 | EPI0_SIGNAL_31_PK5 );
MAP_GPIOPinConfigure( EPI0_SIGNAL_24_PK7 | EPI0_SIGNAL_25_PK6 | EPI0_SIGNAL_31_PK5 );
MAP_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOL );
while( ! MAP_SysCtlPeripheralReady( SYSCTL_PERIPH_GPIOL ) );
MAP_GPIOPinTypeEPI( SYSCTL_PERIPH_GPIOL, EPI0_SIGNAL_26_PL4 | EPI0_SIGNAL_19_PL3 | EPI0_SIGNAL_18_PL2 | EPI0_SIGNAL_17_PL1 | EPI0_SIGNAL_16_PL0 );
MAP_GPIOPinConfigure( EPI0_SIGNAL_26_PL4 | EPI0_SIGNAL_19_PL3 | EPI0_SIGNAL_18_PL2 | EPI0_SIGNAL_17_PL1 | EPI0_SIGNAL_16_PL0 );
MAP_GPIOPinTypeEPI( SYSCTL_PERIPH_GPIOM, EPI0_SIGNAL_12_PM3 | EPI0_SIGNAL_13_PM2 | EPI0_SIGNAL_14_PM1 | EPI0_SIGNAL_15_PM0 );
MAP_GPIOPinConfigure( EPI0_SIGNAL_12_PM3 | EPI0_SIGNAL_13_PM2 | EPI0_SIGNAL_14_PM1 | EPI0_SIGNAL_15_PM0 );
MAP_GPIOPinTypeEPI( SYSCTL_PERIPH_GPIOQ, EPI0_SIGNAL_30_PP3 | EPI0_SIGNAL_29_PP2 );
MAP_GPIOPinConfigure( EPI0_SIGNAL_30_PP3 | EPI0_SIGNAL_29_PP2 );
// Configure EPI operations
MAP_EPIModeSet( EPI0_BASE, EPI_MODE_GENERAL );
MAP_EPIDividerSet( EPI0_BASE, 1 );
MAP_EPIConfigGPModeSet( EPI0_BASE, EPI_GPMODE_ASIZE_NONE | EPI_GPMODE_DSIZE_32, 0, 0 );
MAP_EPIAddressMapSet( EPI0_BASE, EPI_ADDR_PER_BASE_A );
}
static void readEPI( void )
{
uint32_t inx,
epiData;
for( inx = 0 ; inx < 100 ; inx++ )
{
while( ! MAP_GPIOPinRead( GPIO_PORTP_BASE, INPUT_EPI0_READ_RDY_INT_PP0 ) );
MAP_GPIOPinWrite( GPIO_PORTM_BASE, OUTPUT_EPI0_READ_ACK_PM5, ~OUTPUT_EPI0_READ_ACK_PM5 );
epiData = 0;
epiData = HWREG( 0xA0000000 );
MAP_GPIOPinWrite( GPIO_PORTM_BASE, OUTPUT_EPI0_READ_ACK_PM5, OUTPUT_EPI0_READ_ACK_PM5 );
if( epiData != EPI_DATA_PATTERN[ inx % 2 ] )
logError( INVALID_EPI_PATTERN_ERROR );
}
}