Hallo,
ich habe hier eine Platine mit dem erwähnten PIC18F4580 und einem
Wiz820io(Wiznet W5200), als Compiler nutze ich MikroC von
Mikroelektronika in der neusten Version.
Für diesen habe ich einen TFTP-Bootloader programmiert, so ähnlich wie
dieser für AVR(Arduino):
http://playground.arduino.cc/Code/TFTPBootloader1
Der Funktioniert soweit, dass der TFTP Transfer funktioniert, jedoch
erhalte ich alle möglichen merkwürdigen Probleme mit meinen Programmen.
Die so übertragenen Programme funktionieren nur sporadisch oder nur in
Teilen, ein fester Text(im Flash) driftet auf einmal weg und statt dem
Text wird irgendwas aus dem Flash ausgegeben(Text über die Serielle
Schnittstelle)
Ein zwei mal Programmieren funktioniert in der Regel gar nicht.
Ich bin was PIC-Programierung angeht ein Anfänger, ich habe vorher noch
nie mir PICs gearbeitet, nur AVRs und ein paar ARM-Prozessoren.
Das ist der Teil des Bootloader, der die TFTP-Pakete entgegen nimmt und
verarbeitet.
Der Bootloader ist 2k Words groß, daher die Grenze bei 0x1000.
Der Schreibschutz für den Bootloader ist aktiv.
1 | case 0x0002: //WRQ - We get a write request, send the ack and set the code to invalid, to prevent unpredictable behaviour on failure
|
2 | for(i = 12; buffer[i] != 0; i++);
|
3 | i++;
|
4 | if(strcmp((buffer+i), "octet") != 0)
|
5 | {
|
6 | SendError(1, remoteIP, port);
|
7 | return 0;
|
8 | }
|
9 | //InitUDPServer(0, 1030);
|
10 | SendAck(0, remoteIP, port);
|
11 | SetCodeInvalid();
|
12 | for(i = 0x1000; i < 32768; i+=64);
|
13 | FLASH_Erase_64(i);
|
14 | break;
|
15 | case 0x0003: //DATA
|
16 | if(packet != packetNumber)
|
17 | {
|
18 | SendError(11, remoteIP, port);
|
19 | return 0;
|
20 | }
|
21 | len -= 4; //Remove TFTP-Header information
|
22 | for(i = 12; i < len; i+=32)
|
23 | {
|
24 | addr = (packet) * 512 + i - 524; //524 is (packet - 1) * 512 + i - 12
|
25 | if(addr <= (BOOTLOADER_END-31)) //We want to start writing at the end of the bootloader at 0x1000
|
26 | continue;
|
27 | if(0x1000 > addr)
|
28 | {
|
29 | i += 0x1000 - addr;
|
30 | addr = 0x1000;
|
31 | }
|
32 | FLASH_Write_32(addr, buffer+i);
|
33 | }
|
34 | SendAck(packet, remoteIP, port);
|
35 | packet++;
|
36 | if(len < 512) //We finished the data transfers
|
37 | {
|
38 | SetCodeValid();
|
39 | return 0;
|
40 | }
|
41 | break;
|
Danke im vorraus.
Mit freundlichen Grüßen
J.Hebeler