Bitman 0 12 сентября, 2008 Опубликовано 12 сентября, 2008 · Жалоба Не удается запустить 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 0 12 сентября, 2008 Опубликовано 12 сентября, 2008 · Жалоба Она у Вас правильно подключена? Так вроде ничего 12 рядов на 8 столбцов A2-A0,A11-A9,SDA10-A10,A13-A11,A16-BA0,A17-BA1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wagan 0 13 сентября, 2008 Опубликовано 13 сентября, 2008 · Жалоба Может проблема раньше, просто PLL не завелась? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dch 0 14 сентября, 2008 Опубликовано 14 сентября, 2008 · Жалоба Может проблема раньше, просто PLL не завелась? А программка чтонибудь выдает. После инициализации SDRAM - она может чтото выдать в консоль, посмотрите по тексту - если это после моих правок, а по виду после моих, то должна быть выдача. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bitman 0 15 сентября, 2008 Опубликовано 15 сентября, 2008 · Жалоба Она у Вас правильно подключена? Так вроде ничего 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 Мгц. Видимо, не избежать мне осциллоскопического исследования :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dch 0 17 сентября, 2008 Опубликовано 17 сентября, 2008 · Жалоба Работает на 115200 штатно, значит PLL заводится на штатных 60 Мгц. дальше, вроде по тексту шел тест SDRAM он что выдает, может там непропай или замыкание Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bitman 0 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба дальше, вроде по тексту шел тест SDRAM он что выдает, может там непропай или замыкание Действительно, оказался банальный непропай одного бита :) Спасибо большое! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dch 0 22 сентября, 2008 Опубликовано 22 сентября, 2008 · Жалоба :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться