Цель работы - удалить заданный (скажем 0x9000) сектор в 64Кб flash памяти, которая подвязана как внешняя к MCS 51. Процессор ND3260, память - Pm39LV512. По сути это небольшая модификачия прошивки кард-ридера. Прочитав мануал по памяти был сделан код:
ERASE_SECTOR:
mov DPTR, #0x5555
mov A, #0xAA
movx @DPTR, A
mov DPTR, #0x2AAA
mov A, #0x55
movx @DPTR, A
mov DPTR, #0x5555
mov A, #0x80
movx @DPTR, A
mov DPTR, #0x5555
mov A, #0xAA
movx @DPTR, A
mov DPTR, #0x2AAA
mov A, #0x55
movx @DPTR, A
mov DPTR,#0x9000
mov A, #0x30
movx @DPTR, A
ret
он просто проводит инициализацию режима удаления блока и затирает блок 0x9000-0xA000.
Дело в том, что в начале работы прошивки я по определенному условию, либо передаю управление на стандартную прошивку, либо применяю свою из flash. В обычном режиме (лампочками помигать и тп ) все работает как надо.
Если же вызвать мою функцию ERASE_SECTOR то очистка проходит верно (я смотрю дамп flash в hex редакторе),но почему-то после выполнения
movx @DPTR, A
автоматически запускается стандартная прошивка и Windows определяет кард-ридер Т.е. дальше я ничего уже сделать не могу.
Т.е. как я понял, во время стирания проц пытается обратиться к внешней флеш, а она занята, следовательно контроллер рестартиться. Т.е. надо каким-то образом заморозить контроллер пока не выполнится стирание блока из флеш.
Вся проблема в том, что прошивка находится в той же флешке, в которой я стираю блок.
Разъясните пожалуйста. :)