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.

TM4C1294NCPDT: External SDRAM

Part Number: TM4C1294NCPDT

Hello,

I use a custom board which has attached an external SDRAM (MT48LC32M16A2P).

I tried to perform a simple access but I did not succeed. 

*(volatile uint32_t*)0x60000000 = 0xA1A2A3A4;

result = *(volatile uint32_t*)0x60000000;

The result always contains 0xFFE0FFE0. Please find below the initialization steps.

    uint32_t ui32Val;

    SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);

    ui32Val = HWREG(GPIO_PORTC_BASE + GPIO_O_PCTL);
    ui32Val &= 0x0000FFFF;
    ui32Val |= 0xFFFF0000;
    HWREG(GPIO_PORTC_BASE + GPIO_O_PCTL) = ui32Val;

    //
    // EPI0S8 ~ EPI0S9: A6 ~ 7
    //
    ui32Val = HWREG(GPIO_PORTA_BASE + GPIO_O_PCTL);
    ui32Val &= 0x00FFFFFF;
    ui32Val |= 0xFF000000;
    HWREG(GPIO_PORTA_BASE + GPIO_O_PCTL) = ui32Val;

    //
    // EPI0S10 ~ EPI0S11: G0 ~ 1
    //
    ui32Val = HWREG(GPIO_PORTG_BASE + GPIO_O_PCTL);
    ui32Val &= 0xFFFFFF00;
    ui32Val |= 0x000000FF;
    HWREG(GPIO_PORTG_BASE + GPIO_O_PCTL) = ui32Val;

    //
    // EPI0S12 ~ EPI0S15: M0 ~ 3
    //
    ui32Val = HWREG(GPIO_PORTM_BASE + GPIO_O_PCTL);
    ui32Val &= 0xFFFF0000;
    ui32Val |= 0x0000FFFF;
    HWREG(GPIO_PORTM_BASE + GPIO_O_PCTL) = ui32Val;

    //
    // EPI0S16 ~ EPI0S19: L0 ~ 3
    //
    ui32Val = HWREG(GPIO_PORTL_BASE + GPIO_O_PCTL);
    ui32Val &= 0xFFFF0000;
    ui32Val |= 0x0000FFFF;
    HWREG(GPIO_PORTL_BASE + GPIO_O_PCTL) = ui32Val;

    //
    // EPI0S28 : B3
    //
    ui32Val = HWREG(GPIO_PORTB_BASE + GPIO_O_PCTL);
    ui32Val &= 0xFFFF0FFF;
    ui32Val |= 0x0000F000;
    HWREG(GPIO_PORTB_BASE + GPIO_O_PCTL) = ui32Val;

    //
    // EPI0S29 ~ EPI0S30: N2 ~ 3
    //
    ui32Val = HWREG(GPIO_PORTN_BASE + GPIO_O_PCTL);
    ui32Val &= 0xFFFF00FF;
    ui32Val |= 0x0000FF00;
    HWREG(GPIO_PORTN_BASE + GPIO_O_PCTL) = ui32Val;

    //
    // EPI0S00 ~ EPI0S03, EPI0S31 : K0 ~ 3, K5
    //
    ui32Val = HWREG(GPIO_PORTK_BASE + GPIO_O_PCTL);
    ui32Val &= 0xFF0F0000;
    ui32Val |= 0x00F0FFFF;
    HWREG(GPIO_PORTK_BASE + GPIO_O_PCTL) = ui32Val;

    GPIOPinTypeEPI(GPIO_PORTA_BASE, EPI_PORTA_PINS);
    GPIOPinTypeEPI(GPIO_PORTB_BASE, EPI_PORTB_PINS);
    GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_PINS);
    GPIOPinTypeEPI(GPIO_PORTG_BASE, EPI_PORTG_PINS);
    GPIOPinTypeEPI(GPIO_PORTK_BASE, EPI_PORTK_PINS);
    GPIOPinTypeEPI(GPIO_PORTL_BASE, EPI_PORTL_PINS);
    GPIOPinTypeEPI(GPIO_PORTM_BASE, EPI_PORTM_PINS);
    GPIOPinTypeEPI(GPIO_PORTN_BASE, EPI_PORTN_PINS);

    EPIDividerSet(EPI0_BASE, 1);

    EPIModeSet(EPI0_BASE, EPI_MODE_SDRAM);


    EPIConfigSDRAMSet(EPI0_BASE, (EPI_SDRAM_CORE_FREQ_50_100 | EPI_SDRAM_FULL_POWER |
            EPI_SDRAM_SIZE_512MBIT), 1024);

    EPIAddressMapSet(EPI0_BASE, EPI_ADDR_RAM_SIZE_256MB | EPI_ADDR_RAM_BASE_6);

    while(HWREG(EPI0_BASE + EPI_O_STAT) &  EPI_STAT_INITSEQ)
    {
    }

  • I do not have your custom board so I am not able to debug for you. You might want to look at the interface with a logic analyzer. Also, have you seen the example in:
    C:\ti\TivaWare_C_Series-2.1.4.178\examples\peripherals\epi
  • Hello Bob,

    The sequence I posted above is taken from examples\peripherals\epi. The hardware connections are done using www.ti.com/.../tidres5.pdf.
  • Hello,

    So, changing the way the PORT multiplexer is configured worked.

        GPIOPinConfigure(GPIO_PA6_EPI0S8);
        GPIOPinConfigure(GPIO_PA7_EPI0S9);
    
        GPIOPinConfigure(GPIO_PB3_EPI0S28);
    
        GPIOPinConfigure(GPIO_PC4_EPI0S7);
        GPIOPinConfigure(GPIO_PC5_EPI0S6);
        GPIOPinConfigure(GPIO_PC6_EPI0S5);
        GPIOPinConfigure(GPIO_PC7_EPI0S4);
    
        GPIOPinConfigure(GPIO_PG0_EPI0S11);
        GPIOPinConfigure(GPIO_PG1_EPI0S10);
    
        GPIOPinConfigure(GPIO_PH0_EPI0S0);
        GPIOPinConfigure(GPIO_PH1_EPI0S1);
        GPIOPinConfigure(GPIO_PH2_EPI0S2);
        GPIOPinConfigure(GPIO_PH3_EPI0S3);
        GPIOPinConfigure(GPIO_PK5_EPI0S31);
    
        GPIOPinConfigure(GPIO_PL0_EPI0S16);
        GPIOPinConfigure(GPIO_PL1_EPI0S17);
        GPIOPinConfigure(GPIO_PL2_EPI0S18);
        GPIOPinConfigure(GPIO_PL3_EPI0S19);
    
        GPIOPinConfigure(GPIO_PM0_EPI0S15);
        GPIOPinConfigure(GPIO_PM1_EPI0S14);
        GPIOPinConfigure(GPIO_PM2_EPI0S13);
        GPIOPinConfigure(GPIO_PM3_EPI0S12);
    
        GPIOPinConfigure(GPIO_PN2_EPI0S29);
        GPIOPinConfigure(GPIO_PN3_EPI0S30);

  • Great, glad to hear. Now days we always recommend using the TivaWare functions over direct register writes.