Forum: Mikrocontroller und Digitale Elektronik EEPROM mit Infineon XC2200 ueber IIC benutzten


von Stan Z. (szimnicki)


Lesenswert?

Liebe Foren-User,

  ich habe ein Problem beim einfachen Lesen und Schreiben auf ein EEPROM 
mit Infineon XC2200 ueber IIC.

   Ich stosse auf fuer mich unlogische Fehler. Das Programm bleibt 
stecken (z.B. an der Stelle wo das TBUF in Shift-Register geladen werden 
soll und ein Transmit buffer Interrupt auftreten soll oder beim Lesen). 
Anderer Fehler: die uebertragenen Daten stimmen nicht bzw. sie Addresse 
auf dem EEPROM ist falsch. Ich habe schon sehr oft meinen Code umgebaut 
und bin immer wiedere auf solche Fehler stossen.

  Ich verwende Dave. Hatte jemand aehnliche Erfahrungen? Kann mir jemand 
bitte Tipps geben? Vielen Dank!

Mein aktueller Code in main nur um die Daten zu verschicken und 
Empfangen:



  U2C1_IIC_vWriteData(U2C1TDF_MStart,0xA0);
  U2C1_IIC_vWriteData(U2C1TDF_MTxData,0x00);
  U2C1_IIC_vWriteData(U2C1TDF_MTxData,0x64);
  U2C1_IIC_vWriteData(U2C1TDF_MStop,0xA0);

  for(i=0;i<0xffff;i++);
  for(i=0;i<0xffff;i++);

  U2C1_IIC_vWriteData(U2C1TDF_MStart,0xA0);
  U2C1_IIC_vWriteData(U2C1TDF_MTxData,0x01);



  U2C1_IIC_vWriteData(U2C1TDF_MStart,0xA1);

//Hier bleibt es beim lesen stecken
  b=(ubyte)U2C1_IIC_uwReadData();

  U2C1_IIC_vWriteData(U2C1TDF_MStop,0xA1);

von Peter D. (peda)


Lesenswert?

Ein Fehler ist schonmal, daß Du nicht den EEPROM angibst und nichts 
kommentierst.

Die Mehrheit hier dürfte Deinen Freund Dave nicht kennen. Also mußt Du 
bei den Funktionsaufrufen kommentieren, was Du reingibst und was zurück 
kommt.

Und wenn Du stecken bleibst, solltest Du vielleicht mal die Returnwerte 
der vorherigen Aufrufe auswerten, d.h. nicht nur wegschmeißen.


Dein Dave wird bestimmt auch ne ordentlich Delayfunktion haben, solchen 
Murx mit Zählschleifen macht man nicht.


Peter

von Stan Z. (szimnicki)


Angehängte Dateien:

Lesenswert?

Danke fuer die Hinweise. Ich benutzte den 24LC02B EEPROM von Microchip. 
Nach dem IIC-Protokoll folgen: nach Start-Signal die Addresse auf dem 
EEPROM, dann die zu uebertragenden Daten und Stop-Signal.

 Das Datenblatt ist beigefuegt.

   Als Entwicklungsumgebung benutze ich tasking. Ich habe versucht mir 
die Ausgangswerte der Funktionen anzuschauen, aber das Debugging-Tool 
von Tasking ist nicht zuverlaessig und instabil. Ferner kenne ich mich 
mit dem genauen Ablauf im Microkontroller noch nicht so genau aus.

  Dave ist eine Software von Infineon zur MCU-Programmierung und 
enthaelt fertige Funktionen wie diese vWriteData. Die Funktion ladet das 
zugehoerige TDF-Signal(also welche Art von Nachricht es ist) und danach 
auch das weitere Byte ins U2C1_TBUF00.


Nochmal der Code:
//Schreiben:

  U2C1_IIC_vWriteData(U2C1TDF_MStart,0xA0); //Schicken von Start und 
Adresse+R/W-Zugriff
  U2C1_IIC_vWriteData(U2C1TDF_MTxData,0x00);//Adresse auf EEPROM
  U2C1_IIC_vWriteData(U2C1TDF_MTxData,0x64); //Zu uebertragende Daten
  U2C1_IIC_vWriteData(U2C1TDF_MStop,0xA0); //Stop

  for(i=0;i<0xffff;i++);//Warten
  for(i=0;i<0xffff;i++);

//EEPROM Lesezugriff:

  U2C1_IIC_vWriteData(U2C1TDF_MStart,0xA0);//Nochmal 
Start+Adresse+Adresse+R/W-Zugriff

  U2C1_IIC_vWriteData(U2C1TDF_MTxData,0x01); //Adresse auf EEPROM, die 
gelesen werden soll



  U2C1_IIC_vWriteData(U2C1TDF_MStart,0xA1); //Nochmal Adresse des EEPROM


//Hier bleibt es beim lesen stecken
  b=(ubyte)U2C1_IIC_uwReadData(); //Auslesen der Speicheradresse

  U2C1_IIC_vWriteData(U2C1TDF_MStop,0xA1); //Stop


und die Definition der Funktionen:

void U2C1_IIC_vWriteData(uword uwTDF, uword uwData)
{

  while(U2C1_TCSRL & 0x0080);             // check TDV, wait until TBUF 
is ready

  U2C1_PSCR   |= 0x2000;                                       // clear 
PSR_TBIF
  U2C1_TBUF00  = ((uwTDF << 8) & 0x0700) | (uwData & 0x00FF);  // load 
TBUF00

} //  End of function U2C1_IIC_vWriteData



uword U2C1_IIC_uwReadData(void)
{

  while(!((U2C1_PSR & 0x8000) || (U2C1_PSR & 0x4000)));

  U2C1_PSCR   |= 0xC000;         // clear PSR_AIF & PSR_RIF
  return(U2C1_RBUF);             // return receive buffer register

} //  End of function U2C1_IIC_uwReadData

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.