www.mikrocontroller.net

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


Autor: Stan Zimnicki (szimnicki)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stan Zimnicki (szimnicki)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.