LPC2103 In Application Flash Programming?

Gast #610546
Lesenswert?

Hallo,

irgendwie will bei mir die Flashprogrammierung aus der Anwendung heraus 
nicht funktionnieren. hier mal ein Ausschnitt aus dem Programm.
1
#define IAP_LOCATION 0x7ffffff1
2
typedef void (*IAP)(unsigned int [],unsigned int[]);
3
IAP iap_entry;
4

5
 int main (void) { 
6

7
  int i;
8

9
  unsigned int command[5];
10
  unsigned int result[2];
11
  unsigned char write[]={0,1,2,3,4,5,6,7,8,9};
12
  Init();     
13
  command[0]=52;
14
  command[1]=0;//0x7000;
15
  command[2]=7;//((unsigned long)(&write)&0xFFFFFFFC);
16
  command[3]=70000;//256;
17
  command[4]=70000;
18
  iap_entry=(IAP) IAP_LOCATION;
19
  iap_entry(command, result);

Außerhalb der main Funktion deklariere ich IAP_LOCATION als 
Funktionspointer.
In der Funktion wird dem Funktionspointer dann die Addresse 0x7FFFFFF1 
wie im Datenblatt beschreiben zugeweisen. Dann rufe ich die Funktion mit 
"command" als Parameter auf.
52 sollte der Code für Erase Sectors sein. Also Sektor 0-7 löschen. Der 
Chip läuft mit 70MHz PLL 5x und 14MHz Quarz.

Prinzipiel sollte sich das Programm doch mit diesem Aufruf selber 
löschen. Habe es vorher auch mit 51 (Copy Ram To Rom) probiert und den 
Werten hinter den "//", aber auch ohne Erfolg.

Was mache ich falsch?

Grüße,
Bernd
Gast #610982
Lesenswert?

Danke,

ich habe da wohl nicht gründlich genug gelesen. Das reine Programmieren 
klappt jetzt.
1
  command[0]=50;
2
  command[1]=7;
3
  command[2]=7;
4
  iap_entry(command, result);
5
  DbgTraceLong(30, result[0]);
6
  
7
  command[0]=51;// copy ram to rom
8
  command[1]=0x7000;
9
  command[2]=((unsigned long)(&write)&0xFFFFFFFC);
10
  command[3]=512;
11
  command[4]=70000;
12
  iap_entry(command, result);
13
  DbgTraceString(0xB, "AfterFlashing");
14
  DbgTraceLong(30, result[0]);

Jetzt stellt sich noch die Frage, wo sind Konstanten wie 
"SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION" definiert?

Aber das Löschen funktionniert noch nicht.
[c]
  command[0]=50;
  command[1]=7;
  command[2]=7;
  iap_entry(command, result);
  DbgTraceLong(30, result[0]);  // gibt 0 zurück

  DbgTraceString(0xB, "BeforeEraseSector");
  command[0]=52;    //erase sector
  command[1]=7;     // startsector 7
  command[2]=7;     // endsector 7
  command[3]=70000;
  iap_entry(command, result);
  DbgTraceString(0xB, "AfterErase"); // wird nicht mehr ausgeführt?!?!?
[/c)

Das Vorbereiten mit Prepare wird mit 0 als Ergebnis abgeschlossen, wenn 
ich dann allerding Erase Sector (52) mit Startsektor 7 und Endsektor 7 
aufrufe, kehrt die Funktion nicht mehr zurück. Die Schreibfunktion (51) 
hingegen terminiert nach 1 ms.

Bernd
Gast #611145
Lesenswert?

Auch wenn ich es nicht verstehe. Nach dem ich einmal alles ausgeschaltet 
läuft es jetzt. Sollte sich der LPC irgendwie weggehangen haben?

Nun ja, auf jeden fall läufts. Danke für den Tip.

Danke,
Bernd
#611808
Lesenswert?

Ich arbeite mit dem LPC2124, deshalb kann ich es dir jetzt nicht sagen, 
wie es beim LPC2103 aussieht. Für den LPC2124 ist es sehr wichtig die 
Version 1.66 zu verwenden. Die Version 1.63 ist für die ISP 
Programmierung etwas fehlerhaft. Ein Upload kann man mit dem Philips ISP 
Utility machen und ist sehr gut Dokumentiert.

Wenn wir ins Flash etwas schreiben, schalten wir immer den PLL aus und 
gehen mit dem Speed zurück auf die 12MHz. Irgendwo hatte ich mal 
gelesen, dass man dies so machen soll.

Gruss, Daniel

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren