SEMC config for Winbond SDRAM W9825G6JB-6I

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

SEMC config for Winbond SDRAM W9825G6JB-6I

2,672 Views
GuillaumeAudirac
NXP Employee
NXP Employee

I'm trying to configure the SDRAM for an i.MXRT1052 board embedding the Winbond SDRAM W9825G6JB-6I (16MB).

From the datasheet (attached), I've aligned as much as I could the settings, using the semc SDK example. But clearly, SDRAM configuration is a new subject for me, so I'm not fully confident.

    /* Configure SDRAM. */
    sdramconfig.csxPinMux = kSEMC_MUXCSX0;
    sdramconfig.address = 0x80000000;
    sdramconfig.memsize_kbytes = 16 * 1024;  /* 16MB = 16*1024*1KBytes */
    sdramconfig.portSize = kSEMC_PortSize16Bit;
    sdramconfig.burstLen = kSEMC_Sdram_BurstLen8;
    sdramconfig.columnAddrBitNum = kSEMC_SdramColunm_9bit;
    sdramconfig.casLatency = kSEMC_LatencyThree;
    sdramconfig.tPrecharge2Act_Ns = 18;  /* Trp 18ns */
    sdramconfig.tAct2ReadWrite_Ns = 18;  /* Trcd 18ns */
    sdramconfig.tRefreshRecovery_Ns = 72;  /* Use the maximum of the (Trfc , Txsr). */
    sdramconfig.tWriteRecovery_Ns = (1000000000 / clockFrq * 2);  /* 2*Tck */
    sdramconfig.tCkeOff_Ns = 42;  /* The minimum cycle of SDRAM CLK off state. CKE is off in self refresh at a minimum period tRAS.*/
    sdramconfig.tAct2Prechage_Ns = 42; /* Tras 42ns */
    sdramconfig.tSelfRefRecovery_Ns = 67;
    sdramconfig.tRefresh2Refresh_Ns = 60;  /* Trc = 60ns */
    sdramconfig.tAct2Act_Ns = 60;  /* Trc = 60ns */
    sdramconfig.tPrescalePeriod_Ns = 160 * (1000000000 / clockFrq);
    sdramconfig.tIdleTimeout_Ns = 64 * 1000000; /* Tref = 64ms */
    sdramconfig.refreshPeriod_nsPerRow = 64 * 1000000 / 8192;  /* 64ms(Tref)/8192 cycles */
    sdramconfig.refreshUrgThreshold = sdramconfig.refreshPeriod_nsPerRow;
    sdramconfig.refreshBurstLen = 1;

The SDRAM can be properly initialized, but the first test in the example always fails:

    /* 32Bit data read and write. */
    SEMC_SDRAMReadWrite32Bit(); // <-- fails
    /* 16Bit data read and write. */
    SEMC_SDRAMReadWrite16Bit(); // <-- succeeds
    /* 8Bit data read and write. */
    SEMC_SDRAMReadWrite8Bit(); // <-- succeeds

Trying this for comparing:

    /* 16Bit data read and write. */
    SEMC_SDRAMReadWrite16Bit(); // <-- fails
    /* 16Bit data read and write. */
    SEMC_SDRAMReadWrite16Bit(); // <-- succeeds
    /* 16Bit data read and write. */
    SEMC_SDRAMReadWrite16Bit(); // <-- succeeds

It seems like the SDRAM is not properly written with the pattern, but only in the first test.

Any idea? Thanks.

Guillaume Audirac
Tags (2)
0 Kudos
Reply
4 Replies

2,136 Views
GuillaumeAudirac
NXP Employee
NXP Employee

Issue finally identified (timing issue).

The SEMC_DQS pin of the i.MXRT is used to adjust timing and must be left open.

Even if the pin_mux is configured in input, the SEMC_DQS pin must be left open on-board, with a parasitic capacitance as low as possible.

On our board, it was connected to an analog switch. Once the trace has been cut, the timing issue has been solved.

Guillaume Audirac

1,545 Views
thanhnambka
Contributor III

Thanks you!

0 Kudos
Reply

2,136 Views
art
NXP Employee
NXP Employee

Glad to hear that the issue is solved.

0 Kudos
Reply

2,136 Views
art
NXP Employee
NXP Employee

Have you properly configured the MODE register(s) of the SDRAM chip itself? Please check.

0 Kudos
Reply