I am trying to store byte arrays in SDRAM, but byte write accesses swap
byte order.
If anybody knows what to do in order to eliminate this byte swapping, I
will appreciate help.
This is a simple code that should work well but is working wrong:
//array is stored in SDRAM
uint8_t array[4];
array[0] = 0xAA;
array[1] = 0xBB;
array[2] = 0xCC;
array[3] = 0xDD;
for(i=0;i<4;i++)
{
print_hex(array[i]);
}
...and the output will be: BB AA DD CC
instead of expected: AA BB CC DD
As you see, bytes are swapped within each half-word read back from
SDRAM.
The same happens when I use PDC writes (for example byte-after-byte
transfers from UART) - bytes in halfwords are swapped too.
When I write half-words or words to SDRAM, I read back bytes in expected
order
uint32_t aVariable = 0xDDCCBBAA;
uint8_t *ptr = (uint8_t*)&aVariable;
for(i=0;i<4;i++)
{
print_hex(ptr[i]);
}
...the output will be as expected AA BB CC DD
Byte swapping effect doesn't appear when array was placed in internal
SRAM.
16-bit half-word and 32-bit word accesses (writes and reads) to SDRAM
are totally OK and symmetrical.
I run program form SDRAM, so probably SDRAM config is OK.
Byte swapping appears even when I slowed down the MCK clock from ~100MHz
to ~50MHz
This is my hardware configuration:
MCU: AT91SAM9260
SDRAM chip: Samsung K4S280432 (8Mx16)
Board: 2-layer, my design, all VDDs decoupled with 100n, lines are as
short as possible (SDRAM under the MCU)
SDRAM config: 1 chip, 16-bit data bus, connections exactly as in
AT91SAM9260 datasheet (1-chip 16-bit option)
MCU --- SDRAM
D15-D0 D15-D0
A0 DQML
A2-11 A0-A9
SDA10 A10
BA0 BA0
BA1 BA1
SDCKE SDCKE
SDCK SDCK
NBS1 DQMH
RAS RAS
CAS CAS
SDWE WE
SDCS_NCS1 CS
My SDRAM CR init is:
AT91C_BASE_SDRAMC->SDRAMC_CR =
AT91C_SDRAMC_NC_9
| AT91C_SDRAMC_NR_12
| AT91C_SDRAMC_CAS_2
| AT91C_SDRAMC_NB_4_BANKS
| AT91C_SDRAMC_DBW_16_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;
rest of the config is the same as in SDRAM appnote
Regards,
Robert
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.