This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Write 16 bits in EPI GPIO Mode, no address bits -> no clock output

Other Parts Discussed in Thread: EK-TM4C1294XL

Hi,

I am trying to interface with a FPGA over EPI with Tiva C Series Connected LaunchPad EK-TM4C1294XL. This is my configuration:

struct GPIOPin_t {
	uint32_t gpioBase;
	uint8_t pin;
	uint32_t altPin;
};
uint8_t bits = 16;
uint32_t frequency = 500000;

// Enable EPI
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);
while (!(ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_EPI0)));

// Enable all GPIOs for EPI
for (uint8_t i = 0; i < 10; i++) {
	ROM_SysCtlPeripheralEnable(GPIOPeriph[i]);
	while (!(ROM_SysCtlPeripheralReady(GPIOPeriph[i])));
}

// Configure GPIO for use with EPI
for (uint8_t i = 0; i < bits; i++) {
	MAP_GPIOPinConfigure(GPIOPin[i].altPin);
	GPIOPinTypeEPI(GPIOPin[i].gpioBase, GPIOPin[i].pin);
}

// Set Divider from frequency (in this case 500 kHz)
if (frequency) {
	uint32_t divider = (F_CPU / (frequency * 2) - 1) * 2;

	// Enable Clock pin
	MAP_GPIOPinConfigure(GPIOPin[31].altPin);
	GPIOPinTypeEPI(GPIOPin[31].gpioBase, GPIOPin[31].pin);

	//GPIODirModeSet(GPIOPin[31].gpioBase, GPIOPin[31].pin, GPIO_DIR_MODE_OUT);

	// Enable Frame pin
	MAP_GPIOPinConfigure(GPIOPin[30].altPin);
	GPIOPinTypeEPI(GPIOPin[30].gpioBase, GPIOPin[30].pin);
	EPIDividerSet(EPI0_BASE, divider);
}

// Enable EPI
EPIModeSet(EPI0_BASE, EPI_MODE_GENERAL);

// Set EPI Mode
EPIConfigGPModeSet(EPI0_BASE, EPI_GPMODE_CLKPIN | EPI_GPMODE_FRAME50 | EPI_GPMODE_ASIZE_NONE | EPI_GPMODE_DSIZE_32, 10, 0);

//Address map to 0xA000.0000
EPIAddressMapSet(EPI0_BASE, EPI_ADDR_PER_BASE_A | EPI_ADDR_PER_BASE_NONE);

// Calculate bit mask
if (bits >= 32) {
	bits = 32;
	bitMask = 0xffffffff;
} else {
	bitMask = (1 << bits) - 1;
}

// Write some data to EPI
uint16_t i = 0;
while(true) {
	HWREGH(EPI_PORT) = i & bitMask;
	_delay_ms(1);
}


Here are the arrays used above.

uint32_t EPI::GPIOPeriph[] = {
		SYSCTL_PERIPH_GPIOA,
		SYSCTL_PERIPH_GPIOB,
		SYSCTL_PERIPH_GPIOC,
		SYSCTL_PERIPH_GPIOG,
		SYSCTL_PERIPH_GPIOH,
		SYSCTL_PERIPH_GPIOK,
		SYSCTL_PERIPH_GPIOL,
		SYSCTL_PERIPH_GPIOM,
		SYSCTL_PERIPH_GPION,
		SYSCTL_PERIPH_GPIOQ
};

EPI::GPIOPin_t EPI::GPIOPin[] = {
		{ GPIO_PORTH_BASE, GPIO_PIN_0, GPIO_PH0_EPI0S0 },  /*  0 */
		{ GPIO_PORTH_BASE, GPIO_PIN_1, GPIO_PH1_EPI0S1 },  /*  1 */
		{ GPIO_PORTH_BASE, GPIO_PIN_2, GPIO_PH2_EPI0S2 },  /*  2 */
		{ GPIO_PORTH_BASE, GPIO_PIN_3, GPIO_PH3_EPI0S3 },  /*  3 */
		{ GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PC7_EPI0S4 },  /*  4 */
		{ GPIO_PORTC_BASE, GPIO_PIN_6, GPIO_PC6_EPI0S5 },  /*  5 */
		{ GPIO_PORTC_BASE, GPIO_PIN_5, GPIO_PC5_EPI0S6 },  /*  6 */
		{ GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_PC4_EPI0S7 },  /*  7 */
		{ GPIO_PORTA_BASE, GPIO_PIN_6, GPIO_PA6_EPI0S8 },  /*  8 */
		{ GPIO_PORTA_BASE, GPIO_PIN_7, GPIO_PA7_EPI0S9 },  /*  9 */
		{ GPIO_PORTG_BASE, GPIO_PIN_1, GPIO_PG1_EPI0S10 }, /* 10 */
		{ GPIO_PORTG_BASE, GPIO_PIN_0, GPIO_PG0_EPI0S11 }, /* 11 */
		{ GPIO_PORTM_BASE, GPIO_PIN_3, GPIO_PM3_EPI0S12 }, /* 12 */
		{ GPIO_PORTM_BASE, GPIO_PIN_2, GPIO_PM2_EPI0S13 }, /* 13 */
		{ GPIO_PORTM_BASE, GPIO_PIN_1, GPIO_PM1_EPI0S14 }, /* 14 */
		{ GPIO_PORTM_BASE, GPIO_PIN_0, GPIO_PM0_EPI0S15 }, /* 15 */
		{ GPIO_PORTL_BASE, GPIO_PIN_0, GPIO_PL0_EPI0S16 }, /* 16 */
		{ GPIO_PORTL_BASE, GPIO_PIN_1, GPIO_PL1_EPI0S17 }, /* 17 */
		{ GPIO_PORTL_BASE, GPIO_PIN_2, GPIO_PL2_EPI0S18 }, /* 18 */
		{ GPIO_PORTL_BASE, GPIO_PIN_3, GPIO_PL3_EPI0S19 }, /* 19 */
		{ GPIO_PORTQ_BASE, GPIO_PIN_0, GPIO_PQ0_EPI0S20 }, /* 20 */
		{ GPIO_PORTQ_BASE, GPIO_PIN_1, GPIO_PQ1_EPI0S21 }, /* 21 */
		{ GPIO_PORTQ_BASE, GPIO_PIN_2, GPIO_PQ2_EPI0S22 }, /* 22 */
		{ GPIO_PORTQ_BASE, GPIO_PIN_3, GPIO_PQ3_EPI0S23 }, /* 23 */
		{ GPIO_PORTK_BASE, GPIO_PIN_7, GPIO_PK7_EPI0S24 }, /* 24 */
		{ GPIO_PORTK_BASE, GPIO_PIN_6, GPIO_PK6_EPI0S25 }, /* 25 */
		{ GPIO_PORTL_BASE, GPIO_PIN_4, GPIO_PL4_EPI0S26 }, /* 26 */
		{ GPIO_PORTB_BASE, GPIO_PIN_2, GPIO_PB2_EPI0S27 }, /* 27 */
		{ GPIO_PORTB_BASE, GPIO_PIN_3, GPIO_PB3_EPI0S28 }, /* 28 */
		{ GPIO_PORTN_BASE, GPIO_PIN_2, GPIO_PN2_EPI0S29 }, /* 29 */
		{ GPIO_PORTN_BASE, GPIO_PIN_3, GPIO_PN3_EPI0S30 }, /* 30 */
		{ GPIO_PORTK_BASE, GPIO_PIN_5, GPIO_PK5_EPI0S31 }, /* 31 */
		{ GPIO_PORTK_BASE, GPIO_PIN_4, GPIO_PK4_EPI0S32 }, /* 32 */
		{ GPIO_PORTL_BASE, GPIO_PIN_5, GPIO_PL5_EPI0S33 }, /* 33 */
		{ GPIO_PORTN_BASE, GPIO_PIN_4, GPIO_PN4_EPI0S34 }  /* 34 */
};

I can see the data on the first 16 pins but clock and frame is always logic high. How can I achieve that clock and frame work as desired.