Forum: Mikrocontroller und Digitale Elektronik XC167 eeprom I2C


von kk (Gast)


Lesenswert?

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
}

von kk (Gast)


Lesenswert?

Hat denn noch niemals jemand beim XC167 einen eeprom über I2C 
programmiert? Vielleicht würde mir ein anderes Beispielprogramm helfen!

Wäre super!

von 12er Dude (Gast)


Lesenswert?

Hallo kk,

schaust Du hier: http://www.keil.com/download/docs/292.asp

Da gibts auch noch mehr zum Thema.

Tschü Dude

von kk (Gast)


Lesenswert?

Für alle die das Problem noch interessiert. Schaut mal ins Errata.
--> unbedingt zwei NOP einfügen, bevor das Flag IRQD ausgewertet wird!

von Liang Y. (yuliang)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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!

von Eye of the eagle (Gast)


Lesenswert?

Seid 's blind, link oben von Keil. Der läuft.

von will99 (Gast)


Lesenswert?

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

von AJ (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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

von lodeki50 (Gast)


Lesenswert?

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.

von lodeki50 (Gast)


Lesenswert?

Entschuldigung, jeder gerade Zugriff.

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.