mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XC167 eeprom I2C


Autor: kk (Gast)
Datum:

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

Autor: kk (Gast)
Datum:

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

Wäre super!

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo kk,

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

Da gibts auch noch mehr zum Thema.

Tschü Dude

Autor: kk (Gast)
Datum:

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

Autor: Liang Yu (yuliang)
Datum:

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

Autor: Markus (Gast)
Datum:

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

Autor: Eye of the eagle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seid 's blind, link oben von Keil. Der läuft.

Autor: will99 (Gast)
Datum:

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

Autor: AJ (Gast)
Datum:

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

Autor: Tom (Gast)
Datum:

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

Autor: lodeki50 (Gast)
Datum:

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

Autor: lodeki50 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung, jeder gerade Zugriff.

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.