Hallo Leute, ich programmiere mit einem XC167 und möchte über den IIC Bus den eeprom beschreiben. Laut Datenblatt ein 24WC08, sollte also 8Kbit groß sein. Ich beschreibe eine Adresse (16 Bit) und lese anschließend den Wert wieder aus. Ich bekomme allerdings immer 0xFF zurück. Ich habe mich bereits erkundigt und erfahren, dass dies der Auslieferungszustand ist. Ich vermute also, dass das Auslesen des eeproms funktioniert, aber das Beschreiben nicht. Der WP Pin ist auf GND, sollte also nicht schreibgeschützt sein! Rufe ich untenstehende Routine auf, bekomme ich 0 zurück. Alle ACK Bits werden also erkannt. Wäre super wenn jemand helfen könnte! Danke! byte writeEE(word address,byte data){ if((IIC_ST&0x0010)>>4!=0) return (1); //check for busy flag IIC_ST = 0x0000; //reset status register IIC_CON |= 0x0010; //generate start (Set BUM) IIC_RTBL = 0xA8; //write slave address and WR while ((IIC_ST & 0x0020) == 0); //wait for end of Tx (IRQD) if (IIC_ST & 0x0008) goto noack; //check for ACK (LRB) IIC_RTBL = (byte)(address>>8); //write address high byte while ((IIC_ST & 0x0020) == 0); //wait for end of Tx (IRQD) if (IIC_ST & 0x0008) goto noack; //check for ACK (LRB) IIC_RTBL = (byte)address; //write address low byte while ((IIC_ST & 0x0020) == 0); //wait for end of Tx (IRQD) if (IIC_ST & 0x0008) goto noack; //check for ACK (LRB) IIC_RTBL = data; //write data byte while ((IIC_ST & 0x0020) == 0); //wait for end of Tx (IRQD) if (IIC_ST & 0x0008) goto noack; //check for ACK (LRB) IIC_CON &= 0xFFEF; //generate stop (clear BUM) IIC_ST &= 0xFF1F; //clear IRQD, IRQP, IRQE while (IIC_ST & 0x0010); //wait for idle bus return (0); //done noack: IIC_CON &= ~0x0010; // generate stop (clear BUM) IIC_ST &= ~0x00E0; //clear IRQD, IRQP, IRQE while (IIC_ST & 0x0010); //wait for idle bus return (2); //signal error }
Hat denn noch niemals jemand beim XC167 einen eeprom über I2C programmiert? Vielleicht würde mir ein anderes Beispielprogramm helfen! Wäre super!
Hallo kk, schaust Du hier: http://www.keil.com/download/docs/292.asp Da gibts auch noch mehr zum Thema. Tschü Dude
Für alle die das Problem noch interessiert. Schaut mal ins Errata. --> unbedingt zwei NOP einfügen, bevor das Flag IRQD ausgewertet wird!
Hallo kk, hast Du das Problem geloest? Ich habe das gleiche Problem beim EEPROM Write/Read-Testen mit IIC. Kannst Du mir die Loesung geben? Dank. mfg yuliang
Hi! Haben ebenfalls das Problem. Das mit DAVE erzeugte Programm läuft auch net. Kann jemand mal bitte ein lauffähiges Programm das mal die grundsätzlichen IIC Reihenfolgen und abfragen zeigt online stellen? DANKE!
Hallo an alle! Ich habe den Code von Keil heruntergeladen, nachdem ich mit dem Code, den Dave erstellt hat, Probleme beim Schreiben hatte. Aber leider habe ich auch mit dem Code von Keil die gleichen Schwierigkeiten. Wenn ich zwei Schreibzugriffe sofort hintereinander in Echtzeit ausführe, dann bekomme ich beim zweiten Zugriff einen Fehler (das LRB-Bit ist gesetzt). Beim Durchsteppen, oder wenn ich eine 10ms-Wartezeit einfüge, ist alles ok. Hat hierzu jemand einen Tip für mich? Danke willi99
Hallo, schon mal die Timings vom Controller und die in Datenblatt des EEPROM's verglichen? Sieht ein wenig nach zu viel "Speed" vom Controller aus. Gruß AJ
Hallo, das EEPROM benötigt zum schreiben ca 10ms. D.h. wenn ihr einen Wert ins EEPROM schreibt müsst ihr 10ms warten, bis das EEPROM wieder bereit ist. Deutlich einfacher ist es, wenn man FRAMs benutzt, die können mit der IIC-Bus -Geschwindigkeit beschrieben werden. Siehe www.ramtron.com
Der Keil-I2C-Democode hat einen Fehler. Jeder ungerade Zugriff auf das EEPROM wird nicht funktionieren. Außerdem musst Du (wie schon in einer vorherigen Antwort) davon ausgehen, dass zwischen Datenübertragung zum EEPROM + STOP und dem internen Wegspeichern des EEPROMs bis zu 10ms vergehen können. In dieser Zeit meldet sich das EEPROM nicht mehr, wenn man einen Zugriff versucht.
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.