XC167 eeprom I2C

Gast #1215239
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
}
Gast #1603671
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!
Gast #1767806
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
Gast #1782360
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
Gast #2011314
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren