Starcomputer 0 30 марта, 2013 Опубликовано 30 марта, 2013 (изменено) · Жалоба На мега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 Изменено 30 марта, 2013 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 · Жалоба Вы соблюли все что нужно? гляньте в datasheets. по ним делал си - работает я на задержках тупанул, а как ввел задержку, так и заработало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Starcomputer 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 · Жалоба А где нужны задержки и какие ? Вы соблюли все что нужно? гляньте в datasheets. по ним делал си - работает я на задержках тупанул, а как ввел задержку, так и заработало Может поделитесь кусочком кода, а именно функцией записи во флеш ? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 · Жалоба А где нужны задержки и какие ? Не нужны задержки. Флаги проверять нужно. Может поделитесь кусочком кода, а именно функцией записи во флеш ? :) По ссылке есть примеры загрузчиков appnote. В даташите тоже минимальные примеры есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Starcomputer 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 (изменено) · Жалоба Не нужны задержки. Флаги проверять нужно. По ссылке есть примеры загрузчиков appnote. В даташите тоже минимальные примеры есть. Флаги проверяются процедурой WAIT_SPMEN() она как раз и ждет, пока сбросится SPMEN, т.е. пока операция завершится. Или ее нужно ставить после каждого вызова записи страницы ? appnote это AVR109 ? У меня он есть. Все равно не разберусь, что не так :( И кстати он под IAR, а у меня CVAVR. Исходников процедур записи в аппноуте нет :( Изменено 1 апреля, 2013 пользователем Starcomputer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 1 апреля, 2013 Опубликовано 1 апреля, 2013 · Жалоба Флаги проверяются процедурой WAIT_SPMEN() она как раз и ждет, пока сбросится SPMEN, т.е. пока операция завершится. Или ее нужно ставить после каждого вызова записи страницы ? Посмотрите как сделано в том же AVR109. appnote это AVR109 ? А так же AVR230, AVR231, AVR947, AVR112... И кстати он под IAR, а у меня CVAVR. Неужели нет в CVAVR либы на такой случай? Не может быть... В AVR109 есть пример и для GCC. Хороший повод уйти от CVAVR. Исходников процедур записи в аппноуте нет :( Чего не хватает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Starcomputer 0 2 апреля, 2013 Опубликовано 2 апреля, 2013 (изменено) · Жалоба >>> Посмотрите как сделано в том же 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. Ну наверно все-таки лучше разобраться. Не будешь же бегать от одной оболочки к другой только потому, что там есть библиотека, а тут нет :) Изменено 2 апреля, 2013 пользователем Starcomputer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться