M0HAX 0 28 марта, 2012 Опубликовано 28 марта, 2012 · Жалоба Привет всем! Возникла проблема. Почему-то не программируется 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. Получаю те же самые нули, что и были до программирования,т.е. сектор не запрограммировался... Не понимаю, что не так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 28 марта, 2012 Опубликовано 28 марта, 2012 · Жалоба Предварительно стереть не забываете? Разрешить запись не забываете? Запретить прерывания не забываете? Стирание секторов: 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]; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M0HAX 0 28 марта, 2012 Опубликовано 28 марта, 2012 (изменено) · Жалоба 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... Изменено 28 марта, 2012 пользователем M0HAX Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 29 марта, 2012 Опубликовано 29 марта, 2012 · Жалоба Да,так и есть - после команды 52 запись сработала. Спасибо! Странно,что в даташите не написали,что для записи надо последовательно выполнить 4 команды: 50,52,50,51... По-моему - это очевидно, что перед записью флешку надо предварительно стереть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться