por styg » 22 Abr 2009 23:01
po que estranho, nem vi a resposta de voces, e tava todo ansioso esperando alguem responder.. .
bom, agora dei uma mexida aqui e fiz novos testes.
na verdade a mesma coisa de antes, escreve e depois le.
só que fiz com ponteiro p/ 8, 16 e 32bits:
char_wr_ptr = (unsigned char *)SDRAM_BASE_ADDR;
for (i=0; i<5; i++)
{ *char_wr_ptr++ = 0x00; *char_wr_ptr++ = 0x11;
*char_wr_ptr++ = 0x22; *char_wr_ptr++ = 0x33; }
char_wr_ptr = (unsigned char *)SDRAM_BASE_ADDR;
for ( i= 0; i < 20; i++ )
{ char_wr_ptr++; }
short_wr_ptr = (unsigned short *)SDRAM_BASE_ADDR;
for (i=0; i<5; i++)
{ *short_wr_ptr++ = 0x0123; *short_wr_ptr++ = 0x4567;
*short_wr_ptr++ = 0x89AB; *short_wr_ptr++ = 0xCDEF; }
short_wr_ptr = (unsigned short *)SDRAM_BASE_ADDR;
for ( i= 0; i < 20; i++ )
{ short_wr_ptr++; }
wr_ptr = (unsigned int *)SDRAM_BASE_ADDR;
for (i=0; i<5; i++)
{ *wr_ptr++ = 0x02468ACE; *wr_ptr++ = 0x13579BDF;
*wr_ptr++ = 0x02468ACE; *wr_ptr++ = 0x13579BDF; }
wr_ptr = (unsigned int *)SDRAM_BASE_ADDR;
for ( i= 0; i < 20; i++ )
{ wr_ptr++; }
o que percebi é que esse pau soh da em 32 bits.
em 8 e 16 bits ele escreveu todos as 20 vezes corretamente!
resta saber o porque.
guest, fiz esse teu teste, e o resultado foi o seguinte, nessa rotina:
wr_ptr = (unsigned int *)SDRAM_BASE_ADDR;
for (i=0; i<20; i++)
{ *wr_ptr++ = i; }
resultados:
End: 0xA000 0000 Valor: 0x0000 0000
End: 0xA000 0004 Valor: 0x0000 0001
End: 0xA000 0008 Valor: 0x0000 0000 // deu pau
End: 0xA000 000C Valor: 0x1004 0000 // deu pau
End: 0xA000 0010 Valor: 0x0000 0004
End: 0xA000 0014 Valor: 0x0000 0005
End: 0xA000 0018 Valor: 0x0000 0000 // deu pau
End: 0xA000 001C Valor: 0x1004 0000 // deu pau
End: 0xA000 0020 Valor: 0x0000 0008
End: 0xA000 0024 Valor: 0x0000 0009
Sergio, cara, são tantos refreshs que nem sei qual tu quer saber hehehe.
mas os refreshs são os seguintes:
/* Auto refresh period 5cclk */
EMC_DYN_RFC = 4;
/* Set refresh period 1120cclks */
EMC_DYN_RFSH = 0x46;
Lucas