Перейти к содержанию
    

Atmega88 - нет записи во флеш

На мега8 все работало, на мега88 не пишется флеш.

Исходный код:

 

#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).

Пушами и попами это я уже от безисходности обложил :(

Loader.rar

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы соблюли все что нужно?

гляньте в datasheets. по ним делал си - работает

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где нужны задержки и какие ?

 

Вы соблюли все что нужно?

гляньте в datasheets. по ним делал си - работает

 

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

Может поделитесь кусочком кода, а именно функцией записи во флеш ? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где нужны задержки и какие ?

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

 

Может поделитесь кусочком кода, а именно функцией записи во флеш ? :)

 

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

В даташите тоже минимальные примеры есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

В даташите тоже минимальные примеры есть.

Флаги проверяются процедурой WAIT_SPMEN() она как раз и ждет, пока сбросится SPMEN, т.е. пока операция завершится.

Или ее нужно ставить после каждого вызова записи страницы ?

appnote это AVR109 ?

У меня он есть. Все равно не разберусь, что не так :(

И кстати он под IAR, а у меня CVAVR. Исходников процедур записи в аппноуте нет :(

Изменено пользователем Starcomputer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Флаги проверяются процедурой WAIT_SPMEN() она как раз и ждет, пока сбросится SPMEN, т.е. пока операция завершится.

Или ее нужно ставить после каждого вызова записи страницы ?

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

 

appnote это AVR109 ?

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

 

И кстати он под IAR, а у меня CVAVR.

Неужели нет в CVAVR либы на такой случай? Не может быть...

В AVR109 есть пример и для GCC. Хороший повод уйти от CVAVR.

 

 

Исходников процедур записи в аппноуте нет :(

Чего не хватает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>>> Посмотрите как сделано в том же 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. К сожалению я так и не смог дойти по цепочке до исходников на ассемблере :(

Приведенный в топике код вроде рабочий, по крайней мере никто не нашел там ошибок, но ... не работает зараза.

>>> Хороший повод уйти от CVAVR.

Ну наверно все-таки лучше разобраться. Не будешь же бегать от одной оболочки к другой только потому, что там есть библиотека, а тут нет :)

Изменено пользователем Starcomputer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...