Hallo Forum,
Hänge seit Tagen fest.
Ich versuche einen Bootloader zu schreiben aufgrund einiger Beispiele.
Die Daten-Blöcke werden korrekt übertragen, auch die Adressen, und
jeweils vom Zielsystem korrekt bestätigt mit '\r'.
Der ganze Schreibvorgang läuft reibungslos durch, aber wenn ich den
AVR-Flash hernach mit AVR-Studio und AVRISP auslese, stehen im ganzen
Speicherbereich ab Adresse 0 bis zum Beginn des Bootloaders nur 'FF'en.
boot_page_write schreibt die Daten nicht in den Speicher.
Kennt jemand das Problem?
Ach ja, ich verwede die 2010er-WINAVR-Version (hab aber auch die 2006er
getestet, gleiches Ergebnis), und einen ATMega168.
Hier mal meine Blockloader-Routine:
1 | unsigned char BlockLoad(unsigned int size, ADDR_T *address)
|
2 | {
|
3 | unsigned int data;
|
4 | ADDR_T tempaddress;
|
5 |
|
6 | (*address) <<= 1; // Convert address to bytes temporarily.
|
7 | tempaddress = (*address); // Store address in page.
|
8 |
|
9 | do
|
10 | {
|
11 | data = recchar();
|
12 | data |= (recchar() << 8);
|
13 |
|
14 | boot_page_fill(*address,data);
|
15 | (*address)+=2; // Select next word in memory.
|
16 | size -= 2; // Reduce number of bytes to write by two.
|
17 | }
|
18 | while(size); // Loop until all bytes written.
|
19 |
|
20 | boot_page_write(tempaddress);
|
21 | boot_spm_busy_wait();
|
22 | boot_rww_enable();
|
23 |
|
24 | (*address) >>= 1; // Convert address back to Flash words again.
|
25 | return '\r'; // Report programming OK
|
26 | }
|
Danke für Eure Hilfe.
spätnächtliche Grüsse Dirk