|
|
  |
Atmega88 - нет записи во флеш, Не хочет писать флеш |
|
|
|
Mar 30 2013, 05:27
|
Участник

Группа: Участник
Сообщений: 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). Пушами и попами это я уже от безисходности обложил
Сообщение отредактировал IgorKossak - Mar 30 2013, 14:20
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Прикрепленные файлы
Loader.rar ( 407.88 килобайт )
Кол-во скачиваний: 15
|
|
|
|
|
Apr 1 2013, 16:13
|
Участник

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

|
А где нужны задержки и какие ? Цитата(arttab @ Apr 1 2013, 04:10)  Вы соблюли все что нужно? гляньте в datasheets. по ним делал си - работает
я на задержках тупанул, а как ввел задержку, так и заработало Может поделитесь кусочком кода, а именно функцией записи во флеш ?
|
|
|
|
|
Apr 1 2013, 16:37
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Starcomputer @ Apr 1 2013, 19:13)  А где нужны задержки и какие ? Не нужны задержки. Флаги проверять нужно. Цитата(Starcomputer @ Apr 1 2013, 19:13)  Может поделитесь кусочком кода, а именно функцией записи во флеш ?  По ссылке есть примеры загрузчиков appnote. В даташите тоже минимальные примеры есть.
|
|
|
|
|
Apr 1 2013, 16:59
|
Участник

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

|
Цитата(_Артём_ @ Apr 1 2013, 19:37)  Не нужны задержки. Флаги проверять нужно. По ссылке есть примеры загрузчиков appnote. В даташите тоже минимальные примеры есть. Флаги проверяются процедурой WAIT_SPMEN() она как раз и ждет, пока сбросится SPMEN, т.е. пока операция завершится. Или ее нужно ставить после каждого вызова записи страницы ? appnote это AVR109 ? У меня он есть. Все равно не разберусь, что не так  И кстати он под IAR, а у меня CVAVR. Исходников процедур записи в аппноуте нет
Сообщение отредактировал Starcomputer - Apr 1 2013, 18:04
|
|
|
|
|
Apr 1 2013, 19:08
|
Гуру
     
Группа: Свой
Сообщений: 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)  Исходников процедур записи в аппноуте нет  Чего не хватает?
|
|
|
|
|
Apr 2 2013, 05:35
|
Участник

Группа: Участник
Сообщений: 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. К сожалению я так и не смог дойти по цепочке до исходников на ассемблере  Приведенный в топике код вроде рабочий, по крайней мере никто не нашел там ошибок, но ... не работает зараза. >>> Хороший повод уйти от CVAVR. Ну наверно все-таки лучше разобраться. Не будешь же бегать от одной оболочки к другой только потому, что там есть библиотека, а тут нет
Сообщение отредактировал Starcomputer - Apr 2 2013, 05:46
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|