|
Проблемы с записью/считыванием во/из Flash, Коряво пишутся или считываются данные |
|
|
|
Nov 1 2006, 15:14
|
Участник

Группа: Новичок
Сообщений: 19
Регистрация: 12-07-06
Пользователь №: 18 762

|
Проблема состоит в том, что по уарту приходят данные и записываются в буфер, который я пытаюсь записать во флеш и, соответственно, считать из флеша. Так вот записываю я одни данные, а считываются другие, вернее, происходит какая-то странная подмена одних байтов другими. К примеру(все в шестнадцатиричном виде): | Записываю | Считываю | | 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.
|
|
|
|
|
 |
Ответов
|
Nov 1 2006, 15:43
|

Мастер
   
Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474

|
Цитата(Redaer @ Nov 1 2006, 18:14)  ... Бит-реверсия получается, однако... А вы уверены что это ошибка во флеш, а не в УАРТе? Иначе говоря, УАРТ проверен, в нем есть уверенность?
--------------------
شامل
|
|
|
|
|
Nov 1 2006, 20:09
|
Участник

Группа: Новичок
Сообщений: 19
Регистрация: 12-07-06
Пользователь №: 18 762

|
Ха! Действительно, как не заметил... Если посылаю с компа на комп по КОМ-порту, то все корректно приходит, без реверсии... То же самое наблюдается и в ИАРе, когда пошагово выполняю, т.е. в RX-массиве оказываются верные 4-хбайтовые числа... Получается, что меняются старшие и младшие биты местами... Вернее считывание числа из массива происходит наоборот... А как-нть этого можно избежать? Edmundo, cпасибо за подсказку, буд дальше мучать
Сообщение отредактировал Redaer - Nov 1 2006, 20:11
|
|
|
|
|
Nov 1 2006, 20:27
|

Мастер
   
Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474

|
Цитата(Redaer @ Nov 1 2006, 23:09)  Получается, что меняются старшие и младшие биты местами... Вернее считывание числа из массива происходит наоборот... А как-нть этого можно избежать? Edmundo, cпасибо за подсказку, буд дальше мучать  Интуитивно мне кажется, что при работе с флеш бит-реверсии получиться не может (справедливости ради скажу, что в SAM'ах флешку не щупал). А вот при работе с последовательными интерфейсами -- запросто  , сами понимаете.
--------------------
شامل
|
|
|
|
Сообщений в этой теме
Redaer Проблемы с записью/считыванием во/из Flash Nov 1 2006, 15:14   Redaer Цитата(Edmundo @ Nov 1 2006, 23:27) Цитат... Nov 2 2006, 14:00    Edmundo Цитата(Redaer @ Nov 2 2006, 17:00) если п... Nov 2 2006, 14:10 Redaer Может быть...
В общем, просто реверс в проге, кото... Nov 2 2006, 18:43 Edmundo Цитата(Redaer @ Nov 2 2006, 21:43) Может ... Nov 2 2006, 21:07  Alex03 Цитата(Edmundo @ Nov 3 2006, 02:07) Я в с... Nov 3 2006, 03:56   Edmundo Цитата(Alex03 @ Nov 3 2006, 06:56) А что ... Nov 3 2006, 05:08 Redaer Я реверсию битов сделал
Вот ещё вопрос, когда, во... Nov 3 2006, 07:19 Edmundo Цитата(Redaer @ Nov 3 2006, 10:19) Вот ещ... Nov 4 2006, 15:58 vmp Посмотри внимательно, ты случайно не ставишь бит M... Nov 3 2006, 07:28 Redaer 2vmp, MSBF в нуле...
2Edmundo, как я понял, ре... Nov 14 2006, 12:48 SpiritDance Похоже проблема с настройками таймингов флеш
КодA... Nov 14 2006, 14:58 Redaer SpiritDance, да че-то все равно не хотит... Nov 15 2006, 14:32 Redaer Чтобы не открывать новую тему...
считываю содерж... Nov 21 2006, 17:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|