AnsweredAssumed Answered

stm32f7 and SDRam

Question asked by franzi.edo on Nov 23, 2015
Latest reply on Oct 27, 2017 by James Panko
Dear all,
I am trying to interface an SDRAM (IS42S16400J-7) on a stm32f746.
Something is wrong at the lever of the refresh (I can read/write but the memory does not retain the data). Here is my initialisation (fcpu = 216-MHz).
Any suggestions?
Regards
  Edo


/*!
 * \brief _FMC_Configuration
 *
 * - FMC controller configuration
 *
 */
static  void    _FMC_Configuration(void) {
    volatile    uint32_t    i;


    RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN; 


// SDRAM is a IS42S16400J-7 speed grade, connected to bank 0 (0xC0000000)


    FMC_Bank5_6->SDCR[0] =  (1<<12)                     // Burst
                         |  (2<<10)                     // SDRAM runs @ 108-MHz
                         |  (0<<9)                      // Write allowed
                         |  (3<<7)                      // CAS latency 3 cycles
                         |  (1<<6)                      // 4 internal banks
                         |  (1<<4)                      // 16-bit data bus
                         |  (1<<2)                      // 12-bit row address
                         |  (0<<0);                     // 8-bit column address
    
// One SDRAM clock cycle is 1/108-MHz = 9.25-ns


    FMC_Bank5_6->SDTR[0] = ((2-1)<<24)                  // 2 cycle TRCD (18.5-ns > 15-ns)
                         | ((2-1)<<20)                  // 2 cycle TRP (18.5-ns > 15-ns)
                         | ((2-1)<<16)                  // 2 cycle TWR
                         | ((7-1)<<12)                  // 7 cycle TRC (64.7-ns > 63-ns)
                         | ((5-1)<<8)                   // 5 cycle TRAS (46.2-ns > 42-ns)
                         | ((8-1)<<4)                   // 8 cycle TXSR (74-ns > 70-ns)
                         | ((2-1)<<0);                  // 2 cycle TMRD


    FMC_Bank5_6->SDCMR = (0<<9)                         // Mode register
                       | (0<<5)                         // 1 autorefrech cycle
                       | (1<<4)                         // Command on bank 1
                       | (0<<3)                         // No command on bank 2
                       | (1<<0);                        // MODE = 001 clock configuration enable
    while (FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);          // Waiting for the ready


// ST and SDRAM datasheet agree a delay > 100-us


    for (i = 0; i < 10000000; i++);


    FMC_Bank5_6->SDCMR = (0<<9)                         // Mode register
                       | (0<<5)                         // 1 autorefrech cycle
                       | (1<<4)                         // Command on bank 1
                       | (0<<3)                         // No command on bank 2
                       | (2<<0);                        // MODE = 010 PALL command
    while (FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);          // Waiting for the ready


    FMC_Bank5_6->SDCMR = (0<<9)                         // Mode register
                       | ((8-1)<<5)                     // NRFS = 8 SDRAM datasheet says "at least two AUTO REFRESH cycles"
                       | (1<<4)                         // Command on bank 1
                       | (0<<3)                         // No command on bank 2
                       | (3<<0);                        // MODE = 011 auto refresh
    while (FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);          // Waiting for the ready


    FMC_Bank5_6->SDCMR = (560<<9)                       // MRD = 560: CAS latency = 2 burst len = 1
                       | (0<<5)                         // 1 autorefrech cycle
                       | (1<<4)                         // Command on bank 1
                       | (0<<3)                         // No command on bank 2
                       | (4<<0);                        // MODE = 100 load mode register
    while (FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);          // Waiting for the ready


// 64-ms/4096 = 15.625-us
// 15.625-us * 108-MHz = 1688-20 = 1668


    FMC_Bank5_6->SDRTR = (1668<<1);                     // Refresh timer count
    while (FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);          // Waiting for the ready


}

Outcomes