Hallo
ich schreibe derzeit an einem Bootloader - welcher soweit auch
funktioniert - nur der "Write FLASH"-Befehl über das ECON-Register tut
nicht, wie er soll. In den ULOAD Modus konnte ich wechseln - Erase Page
und Erase Flash funktionieren auch.
Nur anstatt die Daten zu schreiben, die ich ihm per rs232 schicke,
schreibt er die letzte beschriebene Seite aus dem FLASH-Bootloader
(Seite 227 (0xE300). Egal welche FLASH-Seite ich beschreiben will - es
findet sich immer diese Seite in der dann beschriebenen FLASH-Seite.
Die lt. Datenblatt an XDATA 0x0000-0x00FF zu schreibenden Daten habe ich
anschließend rückgelesen und sie waren, wie sie sein sollten.
Der verwendete Compiler ist der C51 von Keil
1 | unsigned char xdata MEM_BLOCK[0x0200] _at_ 0x0000;
|
2 |
|
3 |
|
4 | case WR_CMD : // Speicherseite schreiben
|
5 | page = rd_rs232();
|
6 | if (page < 0xE0) {
|
7 | crc = 0;
|
8 | for (cnt=0;cnt<256;cnt++)
|
9 | {
|
10 | MEM_BLOCK[cnt] = rd_rs232(); // Block lesen
|
11 | crc = crc_update(crc,MEM_BLOCK[cnt]);
|
12 | }
|
13 | input = rd_rs232();
|
14 | crc = crc_update(crc,input);
|
15 | input = rd_rs232();
|
16 | crc = crc_update(crc,input);// CRC auf Prüfsumme erweitern
|
17 | if (crc==0) {
|
18 | EADRH = page; // H-Byte ROM-Addresse (Page)
|
19 | EADRL = 0x13;
|
20 | ECON = 0x02; // Write MEM Page (XDATA 00-FF)
|
21 | if (ECON == 0) // ECON Status Register
|
22 | wr_rs232(ERR_OK);
|
23 | else wr_rs232(ERR_FLASH);
|
24 | } else wr_rs232(ERR_CRC); // andernfalls CRC-Fehler
|
25 | } else {
|
26 | for (cnt=0;cnt<258;cnt++)
|
27 | rd_rs232();
|
28 | wr_rs232(ERR_NOK); // ungültige Seite
|
29 | }
|
30 | break;
|
C51 Ausgabe:
; SOURCE LINE # 151
009C ?C0024:
; SOURCE LINE # 152
009C 120000 R LCALL rd_rs232
009F 8F00 R MOV page,R7
; SOURCE LINE # 153
00A1 E500 R MOV A,page
00A3 C3 CLR C
00A4 94E0 SUBB A,#0E0H
00A6 506A JNC ?C0025
; SOURCE LINE # 154
00A8 E4 CLR A
00A9 F500 R MOV crc,A
00AB F500 R MOV crc+01H,A
; SOURCE LINE # 155
00AD FA MOV R2,A
00AE FB MOV R3,A
00AF ?C0026:
; SOURCE LINE # 156
; SOURCE LINE # 157
00AF 120000 R LCALL rd_rs232
00B2 7400 MOV A,#LOW MEM_BLOCK
00B4 2B ADD A,R3
00B5 F582 MOV DPL,A
00B7 7400 MOV A,#HIGH MEM_BLOCK
00B9 3A ADDC A,R2
00BA F583 MOV DPH,A
00BC EF MOV A,R7
00BD F0 MOVX @DPTR,A
; SOURCE LINE # 158
00BE 120000 R LCALL L?0099
00C1 8E00 R MOV crc,R6
00C3 8F00 R MOV crc+01H,R7
; SOURCE LINE # 159
00C5 0B INC R3
00C6 BB0001 CJNE R3,#00H,?C0073
00C9 0A INC R2
00CA ?C0073:
00CA E4 CLR A
00CB B503E1 CJNE A,AR3,?C0026
00CE EA MOV A,R2
00CF B401DD CJNE A,#01H,?C0026
00D2 ?C0027:
; SOURCE LINE # 160
00D2 120000 R LCALL rd_rs232
00D5 750000 R MOV input,#00H
00D8 8F00 R MOV input+01H,R7
; SOURCE LINE # 161
00DA AD00 R MOV R5,input+01H
00DC 120000 R LCALL L?0100
00DF 8E00 R MOV crc,R6
00E1 8F00 R MOV crc+01H,R7
; SOURCE LINE # 162
00E3 120000 R LCALL rd_rs232
00E6 750000 R MOV input,#00H
00E9 8F00 R MOV input+01H,R7
; SOURCE LINE # 164
00EB AD00 R MOV R5,input+01H
00ED 120000 R LCALL L?0100
00F0 8E00 R MOV crc,R6
00F2 8F00 R MOV crc+01H,R7
; SOURCE LINE # 165
00F4 E500 R MOV A,crc+01H
00F6 4500 R ORL A,crc
00F8 7013 JNZ ?C0029
; SOURCE LINE # 166
00FA 8500C7 R MOV EADRH,page
; SOURCE LINE # 167
00FD 75C613 MOV EADRL,#013H
; SOURCE LINE # 168
0100 75B902 MOV ECON,#02H
; SOURCE LINE # 169
0103 E5B9 MOV A,ECON
0105 7003 JNZ ?C0030
; SOURCE LINE # 170
0107 020000 R LJMP ?C0082
010A ?C0030:
; SOURCE LINE # 171
; SOURCE LINE # 172
010A 020000 R LJMP ?C0083
010D ?C0029:
010D 7F22 MOV R7,#022H
; SOURCE LINE # 173
010F 020000 R LJMP ?C0098
0112 ?C0025:
; SOURCE LINE # 174
0112 E4 CLR A
0113 FA MOV R2,A
0114 FB MOV R3,A
0115 ?C0034:
; SOURCE LINE # 175
0115 120000 R LCALL rd_rs232
0118 0B INC R3
0119 BB0001 CJNE R3,#00H,?C0075
011C 0A INC R2
011D ?C0075:
011D BA01F5 CJNE R2,#01H,?C0034
0120 BB02F2 CJNE R3,#02H,?C0034
0123 ?C0035:
; SOURCE LINE # 176
0123 7F11 MOV R7,#011H
0125 ?C0084:
; SOURCE LINE # 177
; SOURCE LINE # 178