Проблема состоит в том, что по уарту приходят данные и записываются в буфер, который я пытаюсь записать во флеш и, соответственно, считать из флеша.
Так вот записываю я одни данные, а считываются другие, вернее, происходит какая-то странная подмена одних байтов другими. К примеру(все в шестнадцатиричном виде):
| Записываю | Считываю |
| 0F | F0 |
| EA | 57 |
| FE | 7F |
и т.п.
Вот функции, которыми пользуюсь для записи, считывани во и из flash
Код
__ramfunc void EFC_Init(void)
{
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(100 << 16)) | AT91C_MC_FWS_1FWS;
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
}
Код
__ramfunc unsigned int EFC_WritePage(unsigned int adr, unsigned int *pbuf)
{
unsigned int *pflash;
unsigned int page;
unsigned int region;
unsigned int i;
pflash = (unsigned int *)adr;
page = (adr & 0x3FFFF) / EFC_PAGE_SIZE;
region = (page/EFC_PagesInTheLockRegion);
EFC_Init();
if (AT91C_BASE_MC->MC_FSR & (region << 16)) {
// lock set, clear it
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 << 16)) |
AT91C_MC_FWS_2FWS;
AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (region << 8 ) |
AT91C_MC_FCMD_UNLOCK;
}
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
for (i = 0; i < EFC_PAGE_SIZE_UINT; i++)
if (pbuf[i] != 0) {
*(pflash + i) = *(pbuf + i);
}
AT91C_BASE_MC->MC_FCR = (0x5A << 24) |
(page << 8 ) |
AT91C_MC_FCMD_START_PROG;
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
return 1;
}
Код
__ramfunc void TestEFC(unsigned int adr) {
AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_US1);
AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
EFC_WritePage(0x100000 | adr, (unsigned int*)tryInt);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
Код
__ramfunc ReadFromAddress(unsigned int address) {
AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_US1);
AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
EFC_ReadPage(address, buff_tx);
while(!(AT91F_US_TxReady(AT91C_BASE_US1)));
AT91F_US_Put(buff_tx, EFC_PAGE_SIZE);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
COM1->US_TPR = (unsigned char)&buff_tx[0];
COM1->US_TCR = 0;
}
Прогаю sam7s256 в iar.