Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM9XE and SDRAM 32bit
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ua_gruzin
Привет всем.
Хочу сделать свою борду.
За основу взял атмеловскую схему.
Сделал разводку, плату....
А час задался вопросом.. будет ли работать, стоит ли впаивать дорогие микросхему в плату с ошибкой.
И так, начнем.
На схеме Атмела под AT91SAM9XE стоит 2 микросхемы по 16бит шины данных.
Кратко о них:
Configuration 4 Meg x 16 x 4 banks
Refresh Count 8K
Row Addressing 8K (A0–A12)
Bank Addressing 4 (BA0, BA1)
Column Addressing 512 (A0–A8)

Вместо двух я поставил одну такую:
Configuration 1 Meg x 32 x 4 banks
Refresh Count 4K
Row Addressing 4K (A0–A11)
Bank Addressing 4 (BA0, BA1)
Column Addressing 256 (A0–A7)

Разводка точно такая как и в оригинале - только без пина А14 (А12) ибо ширина Row Addressing только 12 бит, а в оригинале 13 бит.
Все бы ничего,.. но....
Залез в даташит, там вычитал для 32бит:
Таблица1
Нажмите для просмотра прикрепленного файла

Путем несложных манипуляций с пеинтом получим:
Таблица2
Нажмите для просмотра прикрепленного файла
Желтым отмечено пины на адрессной шине.

С оригинальной схемы получим:
Нажмите для просмотра прикрепленного файла

Т.е. все пины отвечают положению как и на таблице мапинга.

В моем случае для одного кристалла памяти, который описан выше, должно на мапинге быть так:
Таблица3
Нажмите для просмотра прикрепленного файла

Но в даташите изложена такая таблица для интерфейса на котором висит память:
Нажмите для просмотра прикрепленного файла

Вопрос:
Нужно ли менять распиновку на микроконтроллере чтобы получить такое, как изображено на Таблице3?
И что такое SDRAM Configuration Mapping?
ua_gruzin
Ребята, думал больше народу понимает схемотехнику по атмеловским армам....
Переформулирую вопрос: вторая таблица правильная?
Нажмите для просмотра прикрепленного файла
aaarrr
Цитата(ua_gruzin @ Mar 21 2011, 17:02) *
Переформулирую вопрос: вторая таблица правильная?

Нет: нельзя так лихо поступать с банками. Сигналам BA0/1 должны соответствовать A16/A17.
ua_gruzin
aaarrr, вы полностью правы.
Аналогичный ответ получил нм Атмел:

Has pins BA0 and BA1 fixed connection to A16 and A17 for all SDRAM ICs types?

Reply: The Table 22-4 is for all SDRAM, the A16/BA0 and A17/BA1 is fixed for bank selection.

Спаял все, щас пытаюсь запустить.
Но... не выходит
Вонт код инициализации SDRAM
Код
//------------------------------------------------------------------------------
/// Initialize and configure the external SDRAM.
//------------------------------------------------------------------------------
void BOARD_ConfigureSdram_x32(void)
{
    volatile unsigned int i;
    static const Pin pinsSdram = PINS_SDRAM;
    volatile unsigned int *pSdram = (unsigned int *) AT91C_EBI_SDRAM;

    // Enable corresponding PIOs
    PIO_Configure(&pinsSdram, 1);

    // Enable EBI chip select for the SDRAM
    WRITE(AT91C_BASE_MATRIX, MATRIX_EBI, AT91C_MATRIX_CS1A_SDRAMC);


    // CFG Control Register
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_CR, AT91C_SDRAMC_NC_8
                                        | AT91C_SDRAMC_NR_12
                                        | AT91C_SDRAMC_CAS_2
                                        | AT91C_SDRAMC_NB_4_BANKS
                                        | AT91C_SDRAMC_DBW_32_BITS
                                        | AT91C_SDRAMC_TWR_2
                                        | AT91C_SDRAMC_TRC_7
                                        | AT91C_SDRAMC_TRP_2
                                        | AT91C_SDRAMC_TRCD_2
                                        | AT91C_SDRAMC_TRAS_5
                                        | AT91C_SDRAMC_TXSR_8);

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

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NOP_CMD); // Perform NOP
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000000;

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_PRCGALL_CMD); // Set PRCHG AL
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000000; // Perform PRCHG

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

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 1st CBR
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000001; //Perform CBR

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 2 CBR
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000002; //Perform CBR

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 3 CBR
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000003; //Perform CBR

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 4 CBR
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000004; //Perform CBR

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 5 CBR
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000005; //Perform CBR

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 6 CBR
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000006; //Perform CBR

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);// Set 7 CBR
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000007; //Perform CBR

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);// Set 8 CBR
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000008; //Perform CBR

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_LMR_CMD);// Set LMR operation
    *(AT91C_SDRAM_BEGIN+0x20) = 0xcafedede; //Perform LMR burst=1, lat=2 // Burst Length = 1 (000), CAS Latency = 2 (010) -> 000100000 = 0x20

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_TR, (BOARD_MCK * 7) / 1000000); // Set Refresh Timer

    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NORMAL_CMD); // Set Normal mode
    *(AT91C_SDRAM_BEGIN+0x0) = 0x00000000; //Perform Normal mode
}


Код частично взят с примера, но в оригинале тоже не работал, потому был переделан в контексте:
1. Изменен формат с ptSDRAM[0]... на *(AT91C_SDRAM_BEGIN+0x20).
2. Изменен адресс для LMR (SDRAM Mode Register): в оригинале было 0х24 (0x24=000100100 // CAS Latency = 2 (010) Burst Length = Reserved (100), изменен на 0х20 (0x20=000100000 // CAS Latency = 2 (010) Burst Length = 1 (000), чтобы отвечало записи комента "//Perform LMR burst=1, lat=2" в примере.
3. Вот тут и возникает первый вопрос: почему по приперу записано "//Perform LMR burst=1, lat=2", и указан адресс 0х24 (запись там ведется в ptSDRAM[9], что судя с размера указателя будет 0х24 (9*4=0х24) ), тогда как он должен быть равен 0х20 для таких параметров Mode Register.
4. Было поправлено количество строк и колонок в SDRAMC_CR.

Ниже привожу код, которым тестил запись впамять:
Код
void SDRAM_test_write (unsigned long int value, unsigned char type, unsigned int count)
{
    unsigned long int *ptSDRAM;
    unsigned long int memStart = 0x20000000; /* SDRAM starts here*/
    unsigned long int memSize = (1*1024*1024); /* 16x4=64-MByte SDRAM */
    unsigned long int ndx;
    unsigned char flag = 0;
    volatile unsigned int calc=0;

    printf("Write to SDRAM... \n\r");
    ptSDRAM=memStart;
    ptSDRAM=memStart+50;
    ptSDRAM[0]=0x11111111;
    ptSDRAM[1]=0x22222222;
    ptSDRAM[2]=0x33333333;
    ptSDRAM[3]=0x44444444;
    ptSDRAM[4]=0x55555555;
    ptSDRAM[0]=0x66666666;
    //----------------
    printf("Write SDRAM [0..6]: %x, %x, %x, %x, %x, %x \n\r", ptSDRAM[0],ptSDRAM[1],ptSDRAM[2],ptSDRAM[3],ptSDRAM[4],ptSDRAM[0]);
}
//------------------------------------------------------------------------------
void SDRAM_test_read (unsigned long int value, unsigned char type, unsigned int count)
{
    unsigned long int *ptSDRAM;
    unsigned long int memStart = 0x20000000; /* SDRAM starts here*/
    unsigned long int memSize = (1*1024*1024); /* 16x4=64-MByteSDRAM */
    unsigned long int ndx;
    unsigned char flag = 0;
    volatile unsigned int calc=0;

    printf("Read from SDRAM... \n\r");
    ptSDRAM=memStart;
    ptSDRAM=memStart+50;
    printf("Read SDRAM [0..6]: %x, %x, %x, %x, %x, %x \n\r",    ptSDRAM[0],ptSDRAM[1],ptSDRAM[2],ptSDRAM[3],ptSDRAM[4],ptSDRAM[0]);
}


При запуске выводит что-то пипа:
Write to SDRAM...
Write SDRAM [0..6]: 66666666,66666666,66666666,44444444,66666666,66666666
Read from SDRAM...
Read SDRAM [0..6]: ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff

Помогите в решении проблеммы.
Может неверно инициализирую, память из того же симейтва что и в оригинале, только разрядность в нее 32 бита одной микрухой, вместо двух по 16ть, и размер другой (1Мх32х4) - информация в начале топика.
Или неверно работаю с СДРАМ,... когда тестирую.

Да и......
Ниже выкладываю схему, может кто-то найдет ошибки.

Зарание спасибо.


Нажмите для просмотра прикрепленного файла

Ребята, нашел где протупил.....
А обидно, вах как обидно....
На счет схемы....

Посмотрите на пины 105 и 104 DD10A, все рпавильно со стороны микрухи, только что к ним подключено....

Наплутал...
Придется резать и делать сопли на плате,.. ну ничего, поправлю.
Думаю в этом и были грабли..., поправлю.

Пока вопрос снят.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.