Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91RM9200 + IS42S16400B нужна помощь
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Bitman
Не удается запустить SDRAM IS42S16400B на платке с AT91RM9200. Возможно что-то напутал с таймингами ...

Если есть у кого работающий код инициализации этих SDRAM, поделитесь пожалуйста!

Или, возможно, найдете ошибку в моём?

Код
#define SLOWCLOCK                32768        //* In Hz
#define MAIN_OSC_CLK                        16000000    //* In Hz
#define CPU_HZ                                  (MAIN_OSC_CLK * 45 / 4) // Processor clock (180,000000 MHz for PCK).
#define MASTER_CLOCK                            (CPU_HZ / 3) // Master clock 60.000 MHz

#define  BSP_CLK_DBGU_BAUD_RATE                       115200

#define    PLLAR                           0x202CBF04    // 180,000000 MHz for PCK
#define    PLLBR                           0x10173E04    // 48,000000 MHz (divider by 2 for USB)
#define    MCKR                            0x00000202    // PCK/3 = MCK Master Clock = 60,000000 MHz with PLLA selected


#define C1_IDC        (1<<2)    // icache and/or dcache off/on
#define DRAM_SIZE       0x1000000

#define BASE_EBI_CS1_ADDRESS    0x20000000    //* base address to access memory on CS1

void AT91F_InitSDRAM()
{
        int     i;
    volatile int     *pSDRAM = (int *)BASE_EBI_CS1_ADDRESS;
        
        //unsigned int sdram_cfg;

    //* Configure PIOC as peripheral (D16/D31)
    AT91F_SDRC_CfgPIO();
    
    // Setup MEMC to support CS0=FLASH, CS1=SDRAM
    AT91C_BASE_EBI->EBI_CSA |= AT91C_EBI_CS1A_SDRAMC;
    AT91C_BASE_EBI->EBI_CFGR = (AT91C_EBI_DBPUC & 0x00) | (AT91C_EBI_EBSEN & 0x00);

    //* Init SDRAM
        
        #define AT91C_SDRC_TWR_1        ((unsigned int) 0x1 <<  7) //  10ns (SDRC) Number of Write Recovery Time Cycles
        #define AT91C_SDRC_TRC_6        ((unsigned int) 0x6 << 11) // -70ns (SDRC) Number of RAS Cycle Time Cycles
        #define AT91C_SDRC_TRP_2        ((unsigned int) 0x2 << 15) // -20ns (SDRC) Number of RAS Precharge Time Cycles
        #define AT91C_SDRC_TRCD_2       ((unsigned int) 0x2 << 19) // -20ns (SDRC) Number of RAS to CAS Delay Cycles
        #define AT91C_SDRC_TRAS_4       ((unsigned int) 0x4 << 23) // -50ns (SDRC) Number of RAS Active Time Cycles
        #define AT91C_SDRC_TXSR_1       ((unsigned int) 0x1 << 27) // (SDRC) Number of Command Recovery Time Cycles

        
        #define SDRC_CR_VAL         \
    (             \
     AT91C_SDRC_NR_12    |\
     AT91C_SDRC_NB_4_BANKS    |\
     AT91C_SDRC_CAS_2    |\
     AT91C_SDRC_TWR_1    |\
     AT91C_SDRC_TRC_6    |\
     AT91C_SDRC_TRP_2    |\
     AT91C_SDRC_TRCD_2    |\
     AT91C_SDRC_TRAS_4    |\
     AT91C_SDRC_TXSR_1     \
    )


    //* 1. A minimum pause of 200us is provided to precede any signal toggle
        //sdram_cfg = AT91C_SDRC_NC_9 | SDRC_CR_VAL;
    //AT91C_BASE_SDRC->SDRC_CR = sdram_cfg;
    AT91C_BASE_SDRC->SDRC_CR = AT91C_SDRC_NC_8 | SDRC_CR_VAL;

    //* 2. A Precharge All command is issued to the SDRAM
    AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_MODE_PRCGALL_CMD;
    *pSDRAM = 0;

    //* 3. Eight Auto-refresh are provided
    AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_MODE_RFSH_CMD;
    for(i=0;i<8;i++)
        *pSDRAM = 0;

    //* 4. A mode register cycle is issued to program the SDRAM parameters
    AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_MODE_LMR_CMD;
    *(pSDRAM+0x80) = 0;

    //* 5. Write refresh rate into SDRAMC refresh timer COUNT register
        AT91C_BASE_SDRC->SDRC_TR = (AT91C_SDRC_COUNT & (64 * (MASTER_CLOCK / 1000) / 4096));
        *pSDRAM = 0;

        // Extra: Self refresh on
        AT91C_BASE_SDRC->SDRC_SRR = AT91C_SDRC_SRCB;
        *pSDRAM = 0;
        
    //* 6. A Normal Mode Command is provided, 3 clocks after tMRD is set
    AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_MODE_NORMAL_CMD;
    *pSDRAM = 0;
}
dch
Она у Вас правильно подключена?
Так вроде ничего 12 рядов на 8 столбцов
A2-A0,A11-A9,SDA10-A10,A13-A11,A16-BA0,A17-BA1
Wagan
Может проблема раньше, просто PLL не завелась?
dch
Цитата(Wagan @ Sep 13 2008, 18:58) *
Может проблема раньше, просто PLL не завелась?

А программка чтонибудь выдает. После инициализации SDRAM - она может чтото выдать в консоль, посмотрите по тексту - если это после моих правок, а по виду после моих, то должна быть выдача.
Bitman
Цитата(dch @ Sep 12 2008, 17:35) *
Она у Вас правильно подключена?
Так вроде ничего 12 рядов на 8 столбцов
A2-A0,A11-A9,SDA10-A10,A13-A11,A16-BA0,A17-BA1


Да, перепроверил ещё раз. Единственное, что не так, это A14 (150 нога MCU) выведен на NC контакт (36 нога RAM), там у других микросхем A12, а в этой NC.


Сам процессор заводится, по JTAG во внутреннюю память програмку загружает, DBGU настраивается и выдает тестовые сообщения на нужной скорости.

Код
AT91F_US_Configure (
        (AT91PS_USART) AT91C_BASE_DBGU,             // DBGU base address
        MASTER_CLOCK,                                                  // 60 MHz
        AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_NONE ,// mode Register to be programmed
        BSP_CLK_DBGU_BAUD_RATE ,       // 115200                                            // baudrate to be programmed
        0);


Работает на 115200 штатно, значит PLL заводится на штатных 60 Мгц.

Видимо, не избежать мне осциллоскопического исследования smile.gif
dch
Цитата(Bitman @ Sep 15 2008, 09:37) *
Работает на 115200 штатно, значит PLL заводится на штатных 60 Мгц.

дальше, вроде по тексту шел тест SDRAM он что выдает, может там непропай или замыкание
Bitman
Цитата(dch @ Sep 18 2008, 02:38) *
дальше, вроде по тексту шел тест SDRAM он что выдает, может там непропай или замыкание


Действительно, оказался банальный непропай одного бита smile.gif

Спасибо большое!
dch
:-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.