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, все рпавильно со стороны микрухи, только что к ним подключено....
Наплутал...
Придется резать и делать сопли на плате,.. ну ничего, поправлю.
Думаю в этом и были грабли..., поправлю.
Пока вопрос снят.