QUOTE (Desperanto @ Feb 17 2011, 08:38)

Такой способ записи выбран из-за довольно большой прошивки и FLASH и маленькой ОЗУ.
Связь двухстороняя? Посылающая сторона может послать один блок (содержимое одного сектора) и замолчать в ожидании подтверждения от устройства?
QUOTE (Desperanto @ Feb 17 2011, 08:38)

А если еще сможете помочь реализовать верификацию прошивки после заливки, то буду очень признателен!

Я вам распишу как сделано у меня, возможно такой вариант вам подойдет:
1) При старте загрузчик получает управление.
2) Он проверяет - не было ли это передачей управления из приложения
3) Если это был вызов из приложения - переход на шаг 9
4) В противном случае он проверяет ногу принудительного запуска загрузки, если нога активирована - переход к шагу 7
5) Загрузчик считает контрольную сумму приложения.
6) Если сумма совпала - значит приложение на месте, прописано полностью и без ошибок. Загрузчик копирует вектора прерываний приложения в ОЗУ и передает управление на вектор сброса в этой таблице.
Если сумма не совпала, значит приложения нет.
7) Загрузчик ожидает по интерфейсу команды начала заливки.
8) Загрузчик получает эту команду.
9) Загрузчик отвечает "Я стартовал, к загрузке готов".
10) Запускается собака.
11) Загрузчик ожидает пакет с содержимым очередной страницы
12) Получив пакет он записывает страницу
13) Записав страницу он сбрасывает собаку и посылает ответ "пакет обработан, готов"
14) переход на шаг 11
Если это был последниу пакет - в процессе ожидания на шаге 11 сработает собака, проц попадает в состояние 1.
После этого начнется выполнение с самого начала, загрузчик проверит контрольную сумму приложения и если обновление удалось - запустит приложение.
Приложение штатно общается с внешним миром по какому-то протоколу, одна из команд которого - начать обновление. Получив эту команду приложение запрещает прерывания и передает управление на вектор сброса процессора. Запускается загрузчик и уже он посылает подтверждение на эту команду. Эта же команда - единственная, которую поддерживает сам загрузчик (на самом деле у меня загрузчик поддерживает еще одну команду - сообщить о версии софта. Он отвечает версию 0, что означает "голый загрузчик, приложения нет". Приложение же в ответ на эту команду сообщает свою версию).
для проверки на шаге 2 использую бит направления какой-либо из ног, при штатной работе используемой на вывод. После сброса все ноги настроены на ввод, приложение настраивает ее на вывод. Значит если нога настроена на вывод - надо переходить на шаг 9.
Да, и при этом в ОЗУ нет ни одной функции.