| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
SDRAM проблеммы AT91SAM9XE
02.04.2011, 21:10
|
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
SDRAM проблеммы AT91SAM9XE
Привет всем.
Столкнулся с проблеммой.
Запаял кристал один SDRAM х32 вемсто двух по х16.
Запустил софт.... получил проблем.
Записывает и читатет первых (старшых) 16 ти, младшие возвращает как эдиницы.
|
Код:
|
unsigned long *ptSDRAM;
unsigned long memStart = 0x20000000; /* SDRAM starts here */
unsigned long memSize = (1*1024*1024); /* 16x4=64-MByte SDRAM */
unsigned long ndx;
unsigned char flag = 0;
volatile unsigned int calc=0;
// single write/read
for (ndx=0; ndx‹6; ndx++)
{
ptSDRAM=(unsigned long*)memStart;
ptSDRAM=ptSDRAM+20;
value = 0x1BCD6789+(ndx‹‹28);
*ptSDRAM=value;
printf("Current SDRAM address: %x \n\r", ptSDRAM);
printf("Data to write: %x \n\r", value);
value = *ptSDRAM;
printf("Data to read : %x \n\r", value);
}
// write/read to end of SDRAM memory
ptSDRAM=(unsigned long*)memStart;
ptSDRAM=ptSDRAM+4194300; //4 address position to the end
value = 0xF2345678;
*ptSDRAM=value;
printf("Current end SDRAM address: %x \n\r", ptSDRAM);
printf("Data to END write: %x \n\r", value);
value = *ptSDRAM;
printf("Data to END read : %x \n\r", value); |
Вот инициализация памяти:
|
Код:
|
volatile unsigned int i;
static const Pin pinsSdram = PINS_SDRAM;
volatile unsigned int *pSdram = (unsigned int *) AT91C_EBI_SDRAM;
unsigned short sdrc_dbw = 0;
sdrc_dbw = AT91C_SDRAMC_DBW_32_BITS;
// 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
| sdrc_dbw
| 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
pSdram[0] = 0x00000000;
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_PRCGALL_CMD); // Set PRCHG AL
pSdram[0] = 0x00000000; // Perform PRCHG
for (i = 0; i ‹ 10000; i++);
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 1st CBR
pSdram[1] = 0x00000001; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 2 CBR
pSdram[2] = 0x00000002; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 3 CBR
pSdram[3] = 0x00000003; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 4 CBR
pSdram[4] = 0x00000004; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 5 CBR
pSdram[5] = 0x00000005; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 6 CBR
pSdram[6] = 0x00000006; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 7 CBR
pSdram[7] = 0x00000007; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 8 CBR
pSdram[8] = 0x00000008; // Perform CBR
WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_LMR_CMD); // Set LMR operation
pSdram[9] = 0xcafedede; // Perform LMR burst=1, lat=2
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
pSdram[0] = 0x00000000; // Perform Normal mode |
Вот что возвращает в дабагерпорту:
|
Код:
|
Current SDRAM address: 20000050
Data to write: 1bcd6789
Data to read : 2d63ffff
Current SDRAM address: 20000050
Data to write: 2bcd6789
Data to read : 2bcdffff
Current SDRAM address: 20000050
Data to write: 3bcd6789
Data to read : 3bcdffff
Current SDRAM address: 20000050
Data to write: 4bcd6789
Data to read : 4bcdffff
Current SDRAM address: 20000050
Data to write: 5bcd6789
Data to read : 5bcdffff
Current SDRAM address: 20000050
Data to write: 6bcd6789
Data to read : 6bcdffff
Current end SDRAM address: 20fffff0
Data to END write: f2345678
Data to END read : f234ffff |
В чем могут быть косяки?,... распиновка вроде верная, ... пропаяно все...
|
|
|
|
02.04.2011, 23:03
|
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Re: SDRAM проблеммы AT91SAM9XE
Да, и еще одно не понял....
|
Код:
|
count++;
//-------------------------
ptSDRAM=(unsigned long*)memStart;
ptSDRAM=ptSDRAM+2;
*ptSDRAM=(count‹‹16);
printf("Count: %x \n\r", count‹‹16);
//-------------------------
for (calc=0; calc‹1000; calc++) {calc++; calc--;}
//-------------------------
ptSDRAM=(unsigned long*)memStart;
printf("First: %x \n\r", *ptSDRAM);
//------------------------- |
Возвражает такое...
Count: 2a0000
First: 2affff
Count: 2b0000
First: 2bffff
Count: 2c0000
First: 2cffff
Почему так?
Я сдвигаю указатель на 2 (ptSDRAM=ptSDRAM+2), пишу значение, читаю с прежнего адресса ptSDRAM, получаю то, что записал в другую ячейку....
|
|
|
|
02.04.2011, 23:41
|
|
|
Вид на жительство
Регистрация: 11.12.2006
Сообщений: 317
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 11 сообщении(ях)
|
Re: SDRAM проблеммы AT91SAM9XE
Я тупой, или что-то не понимаю
|
Код:
|
unsigned int *ptSDRAM;
unsigned int memStart = 0x20000000; /* SDRAM starts here */
ptSDRAM=(unsigned int*)memStart;
ptSDRAM=ptSDRAM+0x00000004;
printf("ptSDRAM +4: %x \n\r", ptSDRAM); |
а на выходе, вместо
ptSDRAM +4: 20000004
получаю:
ptSDRAM +4: 20000010
где туплю, помогите
|
|
|
|
04.04.2011, 20:02
|
|
|
Вид на жительство
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
|
Re: SDRAM проблеммы AT91SAM9XE
32x разводится несколько иначе, и возможно управление маской неверное.
Сообщение от ua_gruzin
|
а на выходе, вместо
ptSDRAM +4: 20000004
получаю:
ptSDRAM +4: 20000010
|
при увеличении указателя адрес увеличивается на размерность указателя, итого 4*4 = 16 = 0x10
Последний раз редактировалось Alecsej; 04.04.2011 в 20:31.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:24.
|
|