реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Atmega88 - нет записи во флеш, Не хочет писать флеш
Starcomputer
сообщение Mar 30 2013, 05:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-12-09
Пользователь №: 54 435



На мега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

Сообщение отредактировал IgorKossak - Mar 30 2013, 14:20
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!

Прикрепленные файлы
Прикрепленный файл  Loader.rar ( 407.88 килобайт ) Кол-во скачиваний: 15
 
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 1 2013, 01:10
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Вы соблюли все что нужно?
гляньте в datasheets. по ним делал си - работает

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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Starcomputer
сообщение Apr 1 2013, 16:13
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-12-09
Пользователь №: 54 435



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

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

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

Может поделитесь кусочком кода, а именно функцией записи во флеш ? sm.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 1 2013, 16:37
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Starcomputer @ Apr 1 2013, 19:13) *
А где нужны задержки и какие ?

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

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


По ссылке есть примеры загрузчиков appnote.
В даташите тоже минимальные примеры есть.
Go to the top of the page
 
+Quote Post
Starcomputer
сообщение Apr 1 2013, 16:59
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-12-09
Пользователь №: 54 435



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

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

Флаги проверяются процедурой WAIT_SPMEN() она как раз и ждет, пока сбросится SPMEN, т.е. пока операция завершится.
Или ее нужно ставить после каждого вызова записи страницы ?
appnote это AVR109 ?
У меня он есть. Все равно не разберусь, что не так sad.gif
И кстати он под IAR, а у меня CVAVR. Исходников процедур записи в аппноуте нет sad.gif

Сообщение отредактировал Starcomputer - Apr 1 2013, 18:04
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 1 2013, 19:08
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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

Чего не хватает?
Go to the top of the page
 
+Quote Post
Starcomputer
сообщение Apr 2 2013, 05:35
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-12-09
Пользователь №: 54 435



>>> Посмотрите как сделано в том же 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

Сообщение отредактировал Starcomputer - Apr 2 2013, 05:46
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.0142 секунд с 7
ELECTRONIX ©2004-2016