Перейти к содержанию
    

операции IAP и АРМ2388

Привет всем!

Возникла проблема. Почему-то не программируется flash-память с помощью оперции IAP.

Использую стандартный код

#define IAP_LOCATION 0x7ffffff1

unsigned long iap_command[5];
unsigned long iap_result[3];
...........
iap_entry(iap_command, iap_result); // и др.команды

 

Чтение версии загрузчика с помощью дает нужный результат,т.е. операция срабатывает.

Например, хочу запрограммировать один 7-й сектор:

  iap_command[0] = 50;
  iap_command[1] = 7;
  iap_command[2] = 7;
  iap_entry(iap_command, iap_result);

  iap_command[0] = 51;
  iap_command[1] = 0x7000;
  iap_command[2] = (unsigned long)RAMbuffer;
  iap_command[3] = 4096;                                                                                                
  iap_command[4] = SYS_GetFsclk()/1000;
  iap_entry(iap_command, iap_result);

 

Перед выполнением этих операций считываю содержимое сектора 7 и выбрасываю через com-порт на терминал

После выполнения каждой операции на комп отправляется результат операции. Получаю код CMD_SUCCESS = 0,т.е. все хорошо, а

затем считываю вновь содержимое сектора 0x7000. Получаю те же самые нули, что и были до программирования,т.е. сектор не запрограммировался...

 

Не понимаю, что не так...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предварительно стереть не забываете? Разрешить запись не забываете? Запретить прерывания не забываете?

Стирание секторов:

typedef void (__thumb *iap_entry_typ)(u32 *, u32 *);
#define iap_entry ((iap_entry_typ)0x7FFFFFF1)
__thumb __interwork u32 ClearFlash(uint beginSector, uint endSector)
{
 u32 ibuf[5], obuf[3];
 ibuf[0] = 50;        
 ibuf[1] = beginSector;
 ibuf[2] = endSector;
 iap_entry(ibuf, obuf);  
 if (!obuf[0]) {
   ibuf[0] = 52;        
   ibuf[3] = CCLK / 1000;
   iap_entry(ibuf, obuf);
 }
 return obuf[0];
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Как я понял, стирать (командой 52) предварительно нет необходимости(но счас попробую), по крайней мере, написано в даташите, что

The affected sectors should be prepared first by calling "Prepare Sector for Write Operation" command. The

affected sectors are automatically protected again once the copy command is successfully executed.

Это цитата к команде "IAP Copy RAM to flash command". Т.е. как и показано в начальном посте,сначала выполняю команду 50, потом команду 51.

 

2. Прерывания запрещал тоже - эффекта не было.

 

3. "Разрешить запись" - это через CRP? Опять же,возможно, я неправильно понял, но написано,что CRP не влияет на IAP команды.

IAP commands are not affected by the code read protection

 

-------------------------------

Да,так и есть - после команды 52 запись сработала. Спасибо! Странно,что в даташите не написали,что для записи надо последовательно выполнить 4 команды: 50,52,50,51...

Изменено пользователем M0HAX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да,так и есть - после команды 52 запись сработала. Спасибо! Странно,что в даташите не написали,что для записи надо последовательно выполнить 4 команды: 50,52,50,51...

По-моему - это очевидно, что перед записью флешку надо предварительно стереть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...