Добрый день!!! Уже несколько дней не могу понять в чем дело. Изготовили плату под AT91SAM9MG45 и DDR2 k4t51163qg-hce6. Я сначала написал простой тест этой памяти. Заполнял память аля *ptSDRAM++ = i++; потом считывал. этот тест память прошла и я решил что все норм. собрал ядро. но оно не стартануло. начал копать. оказалось ошибка записи/чтения DDR2.
Сейчас для проверки DDR2 использую код из примеров для Mini-Max/ARM9(bipom.com).
void TestValue_SDRAM(unsigned long value,unsigned long test)
{
unsigned long *ptSDRAM;
unsigned long ndx;
unsigned char flag=0;
unsigned long memStart = 0x70000000; /* SDRAM starts here */
unsigned long memSize = (162424); /* 16x4=64-MByte SDRAM */
char testStr[3];
//
testStr[0]=test+'0';
testStr[1]=' ';
testStr[2]=0;
dbg_print("\n\rTEST");
dbg_print(testStr);
//
ptSDRAM=(unsigned long*)memStart;
for(ndx=memStart;ndx<memStart+memSize;ndx++)
{
// Special tests 5,6
if(test == 5) value = ndx;
if(test == 6) value = ((ndx & 0xFFFF)<<16)|(ndx & 0xFFFF);
if(test == 7) value = ((ndx & 0xFFFF)<<16);
if(test == 8) value = (ndx & 0xFFFF);
//
*ptSDRAM++=value;
}
//
ptSDRAM=(unsigned long*)memStart;
for (ndx=memStart;ndx<memStart+memSize;ndx++)
{
// Special tests 5,6
if(test == 5) value = ndx;
if(test == 6) value = ((ndx & 0xFFFF)<<16)|(ndx & 0xFFFF);
if(test == 7) value = ((ndx & 0xFFFF)<<16);
if(test == 8) value = (ndx & 0xFFFF);
//
if((*ptSDRAM++)!=value) flag= 1;
}
//
if( flag) dbg_print("FAILED");
else dbg_print("PASSED");
}
//
int main(void)
{
/* Hardware Initialization */
hw_init();
/* Download some code to process DF recovery feature */
load_df(AT91C_SPI_PCS_DATAFLASH, IMG_ADDRESS, IMG_SIZE, JUMP_ADDR);
/* Loop forever */
while(1)
{
dbg_print("\n\rStart Mini-Max/ARM9 SAM9260 SDRAM test (10 clocks)...");
TestValue_SDRAM(0x00000000,1);
TestValue_SDRAM(0xFFFFFFFF,2);
TestValue_SDRAM(0xAAAAAAAA,3);
TestValue_SDRAM(0x55555555,4);
TestValue_SDRAM(0x00000000,5);
TestValue_SDRAM(0x00000000,6);
TestValue_SDRAM(0x00000000,7);
TestValue_SDRAM(0x00000000,8);
dbg_print("\n\rStop SDRAM test");
}
}
Поменяв только memStart. Все это стартует из bootstrap, настройки ddr2 (k4t51163qg-hce6):
static SDdramConfig ddram_config = {
.ddramc_mdr = (AT91C_DDRC2_DBW_16_BITS | AT91C_DDRC2_MD_DDR2_SDRAM),
.ddramc_cr = (AT91C_DDRC2_NC_DDR10_SDR9 | // 10 column bits (1K)
AT91C_DDRC2_NR_13 | // 13 row bits (4K)
AT91C_DDRC2_CAS_3 | // CAS Latency 3
AT91C_DDRC2_DLL_RESET_DISABLED), // DLL not reset
.ddramc_rtr = 0x24B,
.ddramc_t0pr = (AT91C_DDRC2_TRAS_6 | // 6 * 7.5 = 45 ns
AT91C_DDRC2_TRCD_2 | // 2 * 7.5 = 15 ns
AT91C_DDRC2_TWR_2 | // 2 * 7.5 = 15 ns
AT91C_DDRC2_TRC_8 | // 8 * 7.5 = 60 ns
AT91C_DDRC2_TRP_2 | // 2 * 7.5 = 15 ns
AT91C_DDRC2_TRRD_2 | // 2 * 7.5 = 15 ns
AT91C_DDRC2_TWTR_0 | // 1 clock cycle
AT91C_DDRC2_TMRD_2), // 2 clock cycles
.ddramc_t1pr = (AT91C_DDRC2_TXP_2 | // 2 * 7.5 = 15 ns
200 << 16 | // 200 clock cycles, TXSRD: Exit self refresh delay to Read command
16 << 8 | // 16 * 7.5 = 120 ns TXSNR: Exit self refresh delay to non read command
AT91C_DDRC2_TRFC_14 << 0), // 14 * 7.5 = 105 ns (must be 140 ns for 1Gb DDR)
.ddramc_t2pr = (AT91C_DDRC2_TRTP_1 | // 1 * 7.5 = 7.5 ns
AT91C_DDRC2_TRPA_0 | // 0 * 7.5 = 0 ns
AT91C_DDRC2_TXARDS_7 | // 7 clock cycles
AT91C_DDRC2_TXARD_2), // 2 clock cycles
};
Master Clock = 100MHz
Самое главное, что проходит все тесты кроме 7-го. Количество ошибок все время разное(~4000). Суть ошибок в том что какими то чудом в младших 2-х байтах появляется мусор или значение старших 2-х байт. Причина не ясна. Может кто-то встречал подобное. Буду рад любому совету, любому намеку. |