Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:2
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » ARM
Ошибки чтения/записи DDR2 на AT91SAM9MG45
dx
Добавлено 13.07.2011 13:35
0
Сообщение: 1
dx
3.5

Пункты: 7618
Регистрация: 26.10.2010
Пол: Мужчина
Из: Ukraine, Kiev city
Добрый день!!! Уже несколько дней не могу понять в чем дело. Изготовили плату под 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-х байт. Причина не ясна. Может кто-то встречал подобное. Буду рад любому совету, любому намеку.
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 13.07.2011 14:08 Сообщение: 2
Pavel Ivanchenko
Admin
4.39

Пункты: 91424
Регистрация: 24.03.2009
Пол: Мужчина
Вряд ли тут что то можно поделать - переразводка платы.
ИМХО самое главное - обеспечить хороший путь для возвратных токов (т.е. "ровная" земля между процессором и памятью).
Ради эксперимента, можете попробовать фазу тактового подвигать (на конце линии с маленькими емкостями поиграться).
Спуститься к концу Подняться к началу
Персональная информация
dx
Добавлено 13.07.2011 17:30 Сообщение: 3
dx
3.5

Пункты: 7618
Регистрация: 26.10.2010
Пол: Мужчина
Из: Ukraine, Kiev city
ну а когда занизить Master Clock. скажем до 50MHz??
Спуститься к концу Подняться к началу
Персональная информация
dx
Добавлено 14.07.2011 15:17 Сообщение: 4
dx
3.5

Пункты: 7618
Регистрация: 26.10.2010
Пол: Мужчина
Из: Ukraine, Kiev city
тут еще одна особенность выплыла. наш инженер сказал что земля там хорошая. один слой в плате это полностью земля. сегодня попробовал писать в память по 16 бит. ошибок не было. может есть какие-то идеи ???
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » ARM