With the EPI peripheral setup as follows:
// // Enable all the GPIO peripherals. // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); 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); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOS); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOT); // // Init. EPI0 Bus (General Purpose) (16 bits Data [0..15] + 12 bits Addr [16..27], WR[28], RD[29], FRAME[30], CLK[31]) // SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0); // Wait for GPIO change //while(SysCtlPeripheralReady(SYSCTL_PERIPH_EPI0)){}; GPIOPinConfigure(GPIO_PK0_EPI0S0); // PK0 18 / PH0 29 D0 GPIOPinConfigure(GPIO_PK1_EPI0S1); // PK1 19 / PH1 30 D1 GPIOPinConfigure(GPIO_PK2_EPI0S2); // PK2 20 / PH2 31 D2 GPIOPinConfigure(GPIO_PK3_EPI0S3); // PK3 21 / PH3 32 D3 GPIOPinConfigure(GPIO_PK7_EPI0S24); // PK7 59 A8 GPIOPinConfigure(GPIO_PK6_EPI0S25); // PK6 60 A9 GPIOPinConfigure(GPIO_PK5_EPI0S31); // PK5 61 CLK GPIOPinTypeEPI(GPIO_PORTK_BASE, EPI_PORTK_PINS); GPIOPinConfigure(GPIO_PC7_EPI0S4); // PC7 22 D4 GPIOPinConfigure(GPIO_PC6_EPI0S5); // PC6 23 D5 GPIOPinConfigure(GPIO_PC5_EPI0S6); // PC5 24 D6 GPIOPinConfigure(GPIO_PC4_EPI0S7); // PC4 25 D7 GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_PINS); GPIOPinConfigure(GPIO_PA6_EPI0S8); // PA8 40 D8 GPIOPinConfigure(GPIO_PA7_EPI0S9); // PA9 41 D9 GPIOPinTypeEPI(GPIO_PORTA_BASE, EPI_PORTA_PINS); GPIOPinConfigure(GPIO_PG1_EPI0S10); // PG1 50 D10 GPIOPinConfigure(GPIO_PG0_EPI0S11); // PG0 49 D11 GPIOPinTypeEPI(GPIO_PORTG_BASE, EPI_PORTG_PINS); GPIOPinConfigure(GPIO_PM3_EPI0S12); // PM3 75 D12 GPIOPinConfigure(GPIO_PM2_EPI0S13); // PM2 22 D13 GPIOPinConfigure(GPIO_PM1_EPI0S14); // PM1 22 D14 GPIOPinConfigure(GPIO_PM0_EPI0S15); // PM0 22 D15 GPIOPinTypeEPI(GPIO_PORTM_BASE, EPI_PORTM_PINS); GPIOPinConfigure(GPIO_PL0_EPI0S16); // PL0 81 A0 GPIOPinConfigure(GPIO_PL1_EPI0S17); // PL1 82 A1 GPIOPinConfigure(GPIO_PL2_EPI0S18); // PL2 83 A2 GPIOPinConfigure(GPIO_PL3_EPI0S19); // PL3 84 A3 GPIOPinConfigure(GPIO_PL4_EPI0S26); // PL4 84 A10 GPIOPinTypeEPI(GPIO_PORTL_BASE, EPI_PORTL_PINS); GPIOPinConfigure(GPIO_PQ0_EPI0S20); // PQ0 05 A4 GPIOPinConfigure(GPIO_PQ1_EPI0S21); // PQ1 06 A5 GPIOPinConfigure(GPIO_PQ2_EPI0S22); // PQ2 11 A6 GPIOPinConfigure(GPIO_PQ3_EPI0S23); // PQ3 27 A7 GPIOPinTypeEPI(GPIO_PORTL_BASE, EPI_PORTL_PINS); GPIOPinConfigure(GPIO_PB2_EPI0S27); // pin 91 A11 GPIOPinConfigure(GPIO_PB3_EPI0S28); // pin 92 /WE (/rd hb16) GPIOPinTypeEPI(GPIO_PORTB_BASE, EPI_PORTB_PINS); GPIOPinConfigure(GPIO_PP2_EPI0S29); // pin GPIO RD (HB16 /WR) //GPIOPinConfigure(GPIO_PP3_EPI0S30); // pin 22 D5 GPIOPinTypeEPI(GPIO_PORTP_BASE, EPI_PORTP_PINS); // General Purpose Init EPIDividerSet(EPI0_BASE, 0x00000000); // 0x00010001 1/2 (System) = 120MHz * 0.5 = 60MHz EPIModeSet(EPI0_BASE, EPI_MODE_HB16 ); // General Purpose EPIConfigHB16Set(EPI0_BASE, EPI_HB16_MODE_ADDEMUX | // sets up data and address as separate, D[15:0]. EPI_HB16_WRWAIT_1 | // write wait 2 EPI clocks EPI_HB16_RDWAIT_1 , // write wait 2 EPI clocks 0); EPIAddressMapSet(EPI0_BASE, EPI_ADDR_PER_SIZE_64KB | EPI_ADDR_PER_BASE_C // set base to 0xC0000000 );
I can see that the clock is output properly at 30.72Mhz. With the following test program:
int main(void) { volatile int32_t ui32Loop; // // Make sure the main oscillator is enabled. The system must have a 25MHz crystal attached to the OSC // pins. The SYSCTL_MOSC_HIGHFREQ parameter is used when the crystal // frequency is 10MHz or higher. SYSCTL_MOSC_SESRC for single ended osc iput (no crystal) // #if 1// CLK_EX SysCtlMOSCConfigSet(SYSCTL_MOSC_HIGHFREQ|SYSCTL_MOSC_SESRC | SYSCTL_MOSC_PWR_DIS); SysCtlClockOutConfig(SYSCTL_CLKOUT_MOSC | SYSCTL_CLKOUT_DIS , 1); //SysCtlClockOutConfig(SYSCTL_CLKOUT_MOSC, 1); //SysCtlClockFreqSet(SYSCTL_OSC_MAIN | SYSCTL_USE_OSC , 30720000); SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC), 25000000); //HWREG(SYSCTL_RSCLKCFG_R)=0x03300000; #elif 0 #else // internal with pll SysCtlClockOutConfig(SYSCTL_DIVSCLK_EN | SYSCTL_DIVSCLK_SRC_PIOSC, 1); SysCtlClockFreqSet(SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240, 30720000); #endif PinoutSet(); // // Enable the GPIO port that is used for the on-board LED. // SYSCTL_RCGCGPIO_R = SYSCTL_RCGCGPIO_R12; // // Do a dummy read to insert a few cycles after enabling the peripheral. // ui32Loop = SYSCTL_RCGCGPIO_R; // // Enable the GPIO pin for the LED (PN0). Set the direction as output, and // enable the GPIO pin for digital function. // GPIO_PORTN_DIR_R = 0x01; GPIO_PORTN_DEN_R = 0x01; // // Loop forever. // while(1) { volatile uint16_t *paddr=(uint16_t *)0xc0000010; volatile readval=0; // // Turn on the LED. // GPIO_PORTN_DATA_R |= 0x01; *paddr=5; readval=*paddr; // // Delay for a bit. // int delay=200000; //200000 for(ui32Loop = delay; ui32Loop > 0; ui32Loop--) { } // // Turn off the LED. // GPIO_PORTN_DATA_R &= ~(0x01); *paddr=0x0a; readval=*paddr; // // Delay for a bit. // for(ui32Loop = delay; ui32Loop > 0; ui32Loop--) { } } }
I can see the /RD and /WR lines toggle properly, but do not see d0 or a4 toggle. Where did I go wrong?