Господа специалисты!!! Подскажите как выполнить стирание и запись данных во "Флеш" ATMEGA8535 при помощи команды SPM? Мне необходима память для хранения и дальнейших изменений данных. Я выполнил все необходимые инструкции (установка в Z-регистр адрес страницы>>установка в SPMCR 0x03>>активизация инсрукции SPM), но в режиме работы микроконтроллера стирание страницы не выполняется, а в "DEBUG" все чётко и запись тоже.
Может быть где-то нужно установить биты в "FUSE" согласно частоте процессора?
С МК C8051F12x я разобрался, а тут!!!!!
Заранее благодарен!
IgorKossak
Dec 16 2004, 13:35
Приведите фрагмент кода (желательно не слишком большой) для анализа.
Привожу фрагмент кода для стирания страницы FLASH-памяти:
;загружаю адрес страницы
LDI R31,0X04
LDI R30,0X00
;запрещаю прерывания и сохраняю SREG
CLI
IN R17,$3F
;загружаю в SPMCR '0000 0101'
LDI R16,0X03
OUT $37,R16
;выполняю активизацию режима стирания
SPM
;востанавливаю SREG и прерывания
OUT $3F,R17
SEI
Вот такой простой код. Запись почти ничем не отличается, единственно, сначало необходимо загрузить в буфер NRWW данные, а потом выполнить операцию аналогично операции стирания.
При выполнении иммитации работы программы в "DEBUG" все работает отлично, а реально игнорируется. Частота кварца 7,3728 МГц.
Спасибо за поддержку!!!
С нетерпением жду Вашего предложения!
Извиняюсь! Вместо "0000 0101" делаю поправку "0000 0011"
framer
Dec 16 2004, 18:01
Может быть установлены биты FUSE, для проверки можно разрешить запись для всех областей памати. Может быть еще проблема в размещении кода который делает SPM (код должен быть в области bootloader), для этого тоже надо утановить соответствующие биты FUSE. Не знаю как с ATMEGA8535 но должно быть также как и в ATMEGA128. Может пригодиться
http://www.mycgiserver.com/~edgp/arm/mm128_bootloader.zip поправил bootloader AVRBUTERFLY для работы с ATMEGA128. Сделано это в WINAVR но там есть асемблерный листинг процедур равоты с FLASH.
Спасибо за ответ, скачал, буду разбираться. Я подозреваю, что при выполнении кода программы микроконтроллером, время прожигания FLASH-памяти очень мало (ведь код программы в Debug выполняется четко). Может быть необходимо калибровать внутренний генератор, который в принципе и служит также для работы с FLASH и EEPROM, а на счет FUSE, то я их не трогаю, так как по умолчанию (я так понял) они не блокируют доступ.
Если есть какие нибудь коментарии или поправки к моим мыслям и рассуждениям, по возможности поправьте меня.
framer
Dec 17 2004, 07:14
kaliblovat' nie nado. vremia gotovnosti pered kajdoj operacyjej prowieriajet'sa na bitah
> _WAIT_FOR_SPM();
> 1f6b2: 80 91 68 00 lds r24, 0x0068
> 1f6b6: 80 fd sbrc r24, 0
> 1f6b8: fc cf rjmp .-8 ; 0x1f6b2
> while(!eeprom_is_ready());
> 1f6ba: e1 99 sbic 0x1c, 1 ; 28
> 1f6bc: fe cf rjmp .-4 ; 0x1f6ba
na sciot FUSE to po umolchaniju nie ustanowlen bootloader.
Пока ничего не получается.
Я программирую через "Pony-Prog2000 Version 2.06c Beta Jul 27 2003"/
Установил и записал в "FUSE" бит "BOOTRST", а эффект тот же.
Помогите!!!
serg_am
Dec 17 2004, 11:07
Скорее всего дело действительно в задержках, там это критично...
Почему бы тебе не использовать стандартную процедуру от атмела (она есть в даташите на кристалл), я в свое время так и делал, заработала практически сразу...
framer
Dec 17 2004, 11:18
luchshe vsego vziat' datasheet ot Atmel doc2502. procedura raboty s FLASH na stranice 231. obrati vnimanie na razdel Boot-Loader Support - Read-While-Write Self programing. Nie dostatochno ustanowit' bit BOOTRST. pri ustanowkie bita procesor startujet iz oblasti bootloadera. adres zavisit ot velechiny bootloader. v programie nago ukazat' pod kakim adresom budet bootloader -
".org ADRESBOOTLOADER"
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.