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);
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.