Hang on a second, I think I'm confusing myself again.
I've re-written the test code, checking byte read/writes, word read/writes and dword read/writes. One thing I don't seem to be able to do is to byte-write/read to odd addresses - even addresses only seem to work. However, with 16 and 32-bit writes/reads there doesn't seem to be a problem.
My code is now thus:
uint32_t i = 0;
uint8_t wr8 = 0x88;
uint16_t wr16 = 0x99AA;
uint32_t wr32 = 0xBBCCDDEE;
uint8_t rd8 = 0x00;
uint16_t rd16 = 0x0000;
uint32_t rd32 = 0x000000000;
// Test some 8-bit write and reads
for (i = 0x00; i < 0x0F; i++) {
// Write a byte
*(volatile uint8_t *)(&SRAM_START_ADDRESS + i) = wr8;
// Read a byte
rd8 = 0;
rd8 = (*(volatile uint8_t *)(&SRAM_START_ADDRESS + i));
printf("Addr: 0x%08X, Write: 0x%02X, Read: 0x%02X\r\n", &SRAM_START_ADDRESS + i, wr8, rd8);
}
// Test some 16-bit write and reads
for (i = 0x10; i < 0x1F; i+=2) {
// Write a word
*(volatile uint16_t *)(&SRAM_START_ADDRESS + i) = wr16;
// Read a word
rd16 = 0;
rd16 = (*(volatile uint16_t *)(&SRAM_START_ADDRESS + i));
printf("Addr: 0x%08X, Write: 0x%04X, Read: 0x%04X\r\n", &SRAM_START_ADDRESS + i, wr16, rd16);
}
// Test some 32-bit write and reads
for (i = 0x20; i < 0x2F; i+=4) {
// Write a dword
*(volatile uint32_t *)(&SRAM_START_ADDRESS + i) = wr32;
// Read a dword
rd32 = 0;
rd32 = (*(volatile uint32_t *)(&SRAM_START_ADDRESS + i));
printf("Addr: 0x%08X, Write: 0x%08X, Read: 0x%08X\r\n", &SRAM_START_ADDRESS + i, wr32, rd32);
}
My output from IAR Terminal is:
Addr: 0x60000000, Write: 0x88, Read: 0x88
Addr: 0x60000001, Write: 0x88, Read: 0x88
Addr: 0x60000002, Write: 0x88, Read: 0x88
Addr: 0x60000003, Write: 0x88, Read: 0x88
Addr: 0x60000004, Write: 0x88, Read: 0x88
Addr: 0x60000005, Write: 0x88, Read: 0x88
Addr: 0x60000006, Write: 0x88, Read: 0x88
Addr: 0x60000007, Write: 0x88, Read: 0x88
Addr: 0x60000008, Write: 0x88, Read: 0x88
Addr: 0x60000009, Write: 0x88, Read: 0x88
Addr: 0x6000000A, Write: 0x88, Read: 0x88
Addr: 0x6000000B, Write: 0x88, Read: 0x88
Addr: 0x6000000C, Write: 0x88, Read: 0x88
Addr: 0x6000000D, Write: 0x88, Read: 0x88
Addr: 0x6000000E, Write: 0x88, Read: 0x88
Addr: 0x60000010, Write: 0x99AA, Read: 0x99AA
Addr: 0x60000012, Write: 0x99AA, Read: 0x99AA
Addr: 0x60000014, Write: 0x99AA, Read: 0x99AA
Addr: 0x60000016, Write: 0x99AA, Read: 0x99AA
Addr: 0x60000018, Write: 0x99AA, Read: 0x99AA
Addr: 0x6000001A, Write: 0x99AA, Read: 0x99AA
Addr: 0x6000001C, Write: 0x99AA, Read: 0x99AA
Addr: 0x6000001E, Write: 0x99AA, Read: 0x99AA
Addr: 0x60000020, Write: 0xBBCCDDEE, Read: 0xBBCCDDEE
Addr: 0x60000024, Write: 0xBBCCDDEE, Read: 0xBBCCDDEE
Addr: 0x60000028, Write: 0xBBCCDDEE, Read: 0xBBCCDDEE
Addr: 0x6000002C, Write: 0xBBCCDDEE, Read: 0xBBCCDDEE