Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega88 - нет записи во флеш
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Starcomputer
На мега8 все работало, на мега88 не пишется флеш.
Исходный код:

CODE
#define PG_ERS 0b00000011 //SPMEN-1, PGERS-1
#define PG_WRT 0b00000101 //SPMEN-1, PGWRT-1
#asm(".EQU SPMCR = 0x57")
#asm(".EQU RWW_SRE = 0x11")
void WAIT_SPMEN(void)
{
#asm
PUSH R20
LBL1:
LDS R20,SPMCR //считываем SPMCR в R20
SBRC R20,0 //проверка сброса флага SPMEN
RJMP LBL1 //ждем пока очистится
POP R20
#endasm
}

void enableRWW(void)
{
WAIT_SPMEN();
#asm
PUSH R20
LDI R20,RWW_SRE //загрузить в R20 0x11
STS SPMCR,R20 //загрузить R20 в SPMCR
SPM
POP R20
#endasm
}

unsigned int read_program_memory (unsigned int adr ,unsigned char cmd)
{
#asm
PUSH R30
PUSH R31
PUSH R18
PUSH R26
PUSH R27
LDD R30,y+1 //ZL = LSB
LDD R31,y+2 //ZH = MSB
LD R18, y // загружаем комманду
SBRC R18, 0 //;read lockbits? (second argument = 0x09)
STS SPMCR, R18 //;STS SPMCR, R18 ;if so, place second argument in SPMEN register
LPM R26, Z+
LPM R27, Z
MOVW R30,R26
POP R27
POP R26
POP R18
POP R31
POP R30
#endasm
}

void write_page (unsigned int adr, unsigned char function)
{
WAIT_SPMEN();
#asm
PUSH R30
PUSH R31
PUSH R26
LDD R30,y+1 //ZL = LSB
LDD R31,y+2 //ZX = MSB
LDD R26,y+0 //загружаем функицю
STS SPMCR, R26
SPM
POP R26
POP R31
POP R30
#endasm
}

void fill_temp_buffer (unsigned int data, unsigned int adr)
{
WAIT_SPMEN();
#asm
PUSH R30
PUSH R31
PUSH R0
PUSH R1
PUSH R19
LDD R30,y+0 //ZL = LSB
LDD R31,y+1 //ZH = MSB
LDD R0,y+2 //
LDD R1,y+3 //
LDI R19, 0x01 //взводим SPMEN
STS SPMCR, R19 //SPMCR, R19
SPM //Store program memory
POP R19
POP R1
POP R0
POP R31
POP R30
#endasm
}
void main(void){
write_page(0, PG_ERS);
enableRWW();
fill_temp_buffer(0x1234, 0);
fill_temp_buffer(0x5678, 2);
write_page(0, PG_WRT);
while (1) {}
}

В результате во флеш так и остается FFFF FFFF
Фьюзы выставлены правильно, BLB тоже.
В чем может быть глюк ?
Первоисточник кода во вложении (известный всем MegaLoad).
Пушами и попами это я уже от безисходности обложил sad.gif
arttab
Вы соблюли все что нужно?
гляньте в datasheets. по ним делал си - работает

я на задержках тупанул, а как ввел задержку, так и заработало
Starcomputer
А где нужны задержки и какие ?

Цитата(arttab @ Apr 1 2013, 04:10) *
Вы соблюли все что нужно?
гляньте в datasheets. по ним делал си - работает

я на задержках тупанул, а как ввел задержку, так и заработало

Может поделитесь кусочком кода, а именно функцией записи во флеш ? sm.gif
_Артём_
Цитата(Starcomputer @ Apr 1 2013, 19:13) *
А где нужны задержки и какие ?

Не нужны задержки. Флаги проверять нужно.

Цитата(Starcomputer @ Apr 1 2013, 19:13) *
Может поделитесь кусочком кода, а именно функцией записи во флеш ? sm.gif


По ссылке есть примеры загрузчиков appnote.
В даташите тоже минимальные примеры есть.
Starcomputer
Цитата(_Артём_ @ Apr 1 2013, 19:37) *
Не нужны задержки. Флаги проверять нужно.

По ссылке есть примеры загрузчиков appnote.
В даташите тоже минимальные примеры есть.

Флаги проверяются процедурой WAIT_SPMEN() она как раз и ждет, пока сбросится SPMEN, т.е. пока операция завершится.
Или ее нужно ставить после каждого вызова записи страницы ?
appnote это AVR109 ?
У меня он есть. Все равно не разберусь, что не так sad.gif
И кстати он под IAR, а у меня CVAVR. Исходников процедур записи в аппноуте нет sad.gif
_Артём_
Цитата(Starcomputer @ Apr 1 2013, 19:59) *
Флаги проверяются процедурой WAIT_SPMEN() она как раз и ждет, пока сбросится SPMEN, т.е. пока операция завершится.
Или ее нужно ставить после каждого вызова записи страницы ?

Посмотрите как сделано в том же AVR109.

Цитата(Starcomputer @ Apr 1 2013, 19:59) *
appnote это AVR109 ?

А так же AVR230, AVR231, AVR947, AVR112...

Цитата(Starcomputer @ Apr 1 2013, 19:59) *
И кстати он под IAR, а у меня CVAVR.

Неужели нет в CVAVR либы на такой случай? Не может быть...
В AVR109 есть пример и для GCC. Хороший повод уйти от CVAVR.


Цитата(Starcomputer @ Apr 1 2013, 19:59) *
Исходников процедур записи в аппноуте нет sad.gif

Чего не хватает?
Starcomputer
>>> Посмотрите как сделано в том же AVR109.
Так-же и сделано.
#define _WAIT_FOR_SPM() while( SPMCR_REG & (1<<SPMEN) );
>>> А так же AVR230, AVR231, AVR947, AVR112...
Спасибо, посмотрю !!!
>>> Неужели нет в CVAVR либы на такой случай? Не может быть...
Увы ...
>>> Чего не хватает?
Ну в исходниках аппноута написано так:
#define _PAGE_WRITE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x05 )
__AddrToZByteToSPMCR_SPM это процедура из библиотеки inavr.h IAR. Если быть точным, то даже не из нее, а в inavr.h есть еще один #include. К сожалению я так и не смог дойти по цепочке до исходников на ассемблере sad.gif
Приведенный в топике код вроде рабочий, по крайней мере никто не нашел там ошибок, но ... не работает зараза.
>>> Хороший повод уйти от CVAVR.
Ну наверно все-таки лучше разобраться. Не будешь же бегать от одной оболочки к другой только потому, что там есть библиотека, а тут нет sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.