Forum: Mikrocontroller und Digitale Elektronik Keil µVision3 Programmier-Algorithmus


von rk (Gast)


Lesenswert?

Hallo Leute,

zunächst ein paar Infos:

Hardware: phyCORE-XC167
- Prozessor: Infineon XC167CI-16F
- Flash-Speicher: AM29F800BB(-70EF)

Programmiertool: Keil ULINK2

Entwicklungsumgebung: Keil µVision3


Ich versuche mit Keil µVision3 über den Keil ULINK2 Adapter den 
Flashspeicher des phyCORE-XC167 zu programmieren, da dieser 
standartmäßig aus dem externen Flash Speicher startet.

Mit folgenden Routinen fuktioniert es:

int EraseBlock (unsigned long adr) {

  // Start Erase Sector Command
  HVAR(unsigned short, base | 0xAAA) = 0xAA;  //for byte mode:  AAA
  HVAR(unsigned short, base | 0x554) = 0x55;  //          554
  HVAR(unsigned short, base | 0xAAA) = 0x80;  //          AAA
  HVAR(unsigned short, base | 0xAAA) = 0xAA;  //          AAA
  HVAR(unsigned short, base | 0x554) = 0x55;  //          554
  HVAR(unsigned short, adr) = 0x30;
}

int ProgramBlock (unsigned long adr, void near *buf) {
  unsigned int cnt;

  for (cnt = 0; cnt < 64; cnt++)  {
    // Start Program Command
    HVAR(unsigned short, base | 0xAAA) = 0xAA;  //for byte mode:   AAA
    HVAR(unsigned short, base | 0x554) = 0x55;  //          554
    HVAR(unsigned short, base | 0xAAA) = 0xA0;   //          AAA
    HVAR(unsigned short, adr) = *((unsigned short near*) buf);

   buf = (unsigned short near*) buf+1;
  adr+=2;
  }
  return (0);
}

HVAR() schreibt dabei an die übergebene Adresse den Wert nach dem =.

Pin #Byte des Flash-Speichers ist auf High -> Word Modus

Im Datenblatt des Flash Speichers steht: Command Sequence
------------------------------------------------------------------------

Program:

Word Mode:  555h=AAh  2AAh=55h  555h=A0    -> jetzt folgen Adresse und 
Daten
Byte Mode  AAAh=AAh  555h=55h  AAAh=A0  -> jetzt folgen Adresse und 
Daten


Sector Erase:

Word Mode:  555h=AAh  2AAh=50h  555h=80h  555h=AAh  2AAh=55h  Sektor 
Adresse=30h
Byte Mode:  AAAh=AAh  555h=50h  AAAh=80h  AAAh=AAh  555h=55h 
Sektor-Adresse=30h

1.  In den Routinen oben wird die Kommando Sequenz für Byte-Mode 
verwendet. Allerdings mit der Ausnahme,
  dass Anstelle von !!!! 555h hier 554h !!!! verwendet wird. -> so 
funktioniert es auch
2.  Ändere ich 554h in 555h, so funktioniert nichts mehr, obwohl dann 
eigentlich erst die Kommando Sequenz aus dem Datenblatt
  verwendet wird.
3.  Ändere ich die Kommando Sequenz von Byte zu Word Mode, so 
funktioniert dies mit 555h überhaupt nicht.
  Verwende ich hier 554h, so lässt das Board sich zwar programmieren, 
aber die Verifizierung scheitert.


Hat jemand eine Idee?

Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.