Forum: Mikrocontroller und Digitale Elektronik EEPROM / D-FLASH Zugriff beim XC888 / Variable nicht flüchtig speichern, INFINEON XC888


von Korny (Gast)


Lesenswert?

Hallo Zusammen,

Habe schon hier im Forum gesucht, habe auch vor ein paar Tagen meine 
Frage in einem anderen Thread mit ähnlicher Thematik gepostet 
(Beitrag "xc866 indirekt adressierbaren speicher in C beschreiben"), aber leider noch keine 
Antwort darauf erhalten.... deshalb versuch ichs nochmal so:

Ich benötige bei einem Infineon XC888 einen Speicher für
Kalibrierwerte, welcher während des Programmablaufs beschrieben werden
kann und nach dem Reset noch erhalten bleibt (oder wenn die Spannung
fehlt), also einen EEPROM.

Ich habe mir mal das EEPROM- Manual von Infineon angeschaut, dort gibt
es bereits einen FlashHandler, mit welchem man in den D-Flash Speicher 
des XC888 schreiben kann, alles auf C- Basis.

Ich werde leider aus den Beispielen überhaupt nicht schlau - ich möchte
einfach nur wissen, mit welcher Funktion ich einen Wert (8 oder 16 Bit)
in den D-Flash speichern kann und wie ich diesen Wert wieder auslesen
kann.

Hat hier schonmal jemand Erfahrung mit dem FlashHandler gemacht oder
gibt es vllt. sogar einfachere Methoden, um eine Variable beim XC888
nicht flüchtig abzuspeichern?

Danke vorab für Eure Hilfe!

Gruß

von Korny (Gast)


Angehängte Dateien:

Lesenswert?

Es scheint wohl keiner Bescheid zu wissen... da antworte ich mir doch 
mal am besten selber ;-)

Habe es nach langem Versuchen nun hinbekommen....

Es gibt zunächst beim XC888 nur einen Flash Speicher und keinen
EEPROM- man muss also immer einen ganzen Sektor vor dem Zugriff
löschen. Zudem können keine einzelnen Bytes beschrieben werden sondern
immer nur eine "Wordline" (32 Bytes).

In den Beispielroutinen von Infineon ist ein Flash- Handler enthalten,
der das Beschreiben des D-Flashs ermöglichen soll.... allerdings ist
die Dokumentation absolut chaotisch....

Ich habe mir nun ein eigenes kleines Testprogramm auf Basis des Flash- 
Handlers erstellt. Hier wird bei jedem Controller- Neustart ein Wert im 
Speicher erhöht und als Binärzahl an Port 3 (LEDs am Hitex Easykit) 
ausgegeben.

Um in den Flash schreiben zu können, muss man wie folgt vorgehen:

1. Warten, bis der Speicher bereit für einen Zugriff ist (Funktion
 FLASH_Ready(Speichersektor)
2. Speicher Auslesen und zwischenspeichern, falls man die Werte noch
 braucht
3. Speicher löschen (Funktion FLASH_Erase(Speichersektor,0))
4. Warten, bis der Speicher bereit ist (Flash_Ready())
5. In den "Wordline- Buffer" (char WLBuf[32]) zu Speichernde Daten 
übertragen
6. Flash Programmieren (Funktion FLASH_Prog(Zeiger auf Adresse))
7. Warten, bis der Speicher bereit ist (wenn man danach gleich wieder
 drauf zugreifen will)

Ich hänge das Programm mal an... ist mit DAVE und Keil erstellt.

Gruß

von RB (Gast)


Lesenswert?

Vielen Dank für die Anleitung zum Flashen des XC886.
Ich habe das Programm auf DAVE-Bench umgeschrieben :
Bei der Main Datei ist darauf zu achten , das die Lösch- und
Programmierfunktion bis zu 104 mSek benötigen und die
READY Abfrage bei mir nicht immer richtig funktionierte .
Was jedoch immer problemlos geht , ist eine Warteschleife von min.
105 mSek .

von autogon (Gast)


Lesenswert?

Авто хамер н4 ремонт и диагностика являются одним из направлений 
московского автотехцентра. Осуществляются все существующие вопросы с 
использованием новых технологий, а также огромного навыка.

von kay (Gast)


Lesenswert?

Es funktioniert teilweise... Das liegt unter anderem daran dass bei mir 
die FLASH_Erase-Funktion den Flash-Sector nicht löscht. Der Wert wird 
bei mir immer wie folgt hochgezählt:
0x01
0x03
0x0F
0x13
0x13
...
einen kleinen Schönheitsfehler habe ich im Code schon gefunden. Der 
Löschaufruf sollte so aussehen:
FLASH_Erase(SEC0,0); und nicht FLASH_Erase(DFLASH0, 0);
der erste Parameter ist der zu löschende Sector im DFLASH0 und der 
zweite Parameter der des DFLASH1.

Aber das kann nicht mein Problem sein. Warum wird der Sector nicht 
gelöscht und warum löscht der Code Bits beim schreiben (0x0F->0x13)? Ich 
habe auch schon ein 500ms Timeout hinter den besagten Funktion 
ausprobiert - das gleiche.

von kay (Gast)


Lesenswert?

also es funktionierte nur wenn ich folgenden Löschbefehl benutze.

FLASH_Erase(SECALL, 0);

Also muss irgendwas nicht stimmen.. durch ausprobieren habe ich 
herausgefunden dass anscheinend 0xA000 im Sektor 8 liegt. 
[FLASH_Erase(SEC8, 0); funktioniert auch (bei all meinen XC800 Easy 
Kits)]... wie kann das sein??? Das passt doch nicht mit der Doku 
zusammen!!!

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.