I2c EEPROM

Gast #13332
Lesenswert?

hallo zusammen

kann mir einer sagen was ich falsch mache ich kriege vom EEPROM immer 
den wert FF zurück. Controller benutze ich den Mega 163 Compailer 
CodeVision. EEPORM ein 24C65 von Microchip.

while (1)
      {          char i,x,y;
      y=0xaa;
      i=10;
      schreiben(i,y);
      x=lesen(i);
      printf("%4x",x);
      delay_ms(2000);
      };
}
int lesen(char adresse)

{char data;
i2c_start();
i2c_write(EEPROM_Bauteil);
i2c_write(adresse);
i2c_start();
i2c_write(EEPROM_Bauteil | 1);
data=i2c_read(0);
i2c_stop();
return data;
}

void schreiben(char adresse,char data)
{
i2c_start();
i2c_write(EEPROM_Bauteil);
i2c_write(adresse);
i2c_write(data);
i2c_stop();
delay_ms(10);
printf("%4x",data);
}


hoffe jemand kann mir helfen

mfg

Rolf
Gast #13333
Lesenswert?

Hallo
ich hoffe noch immer auf eine Antwort von euch. Denn ich bin immer noch 
nicht weiter gekommen.
Ist ein unbeschriebenes EEPROM (leer) gefüllt mit 0xff ?

danke für eure Antworten.

mfg

Rolf
Gast #13334
Lesenswert?

Hallöchen!

Leider kann ich Dir auch nicht weiter helfen, da ich erstens noch nie 
was mit i2c gemacht habe (wird aber wohl noch kommen demnächst), und 
mich außerdem mit C nicht auskenne... zu Deiner letzten Frage 
allerdings: Ein unbeschriebenes EEprom hat, soviel ich weiß, alle Werte 
auf 0xFF.

ciao,
  Andi
Gast #13336
Lesenswert?

Hallo Rolf,

Das 24C65 braucht drei Bytes zur Adressierung: 1. IIC-Adresse, 
2.High-Adresse, 3. Low-Adresse. Bitte passe Deine Routinen entsprechend 
an und probiere es aus.
Noch etwas: kontrolliere, ob die A0-A2 Pins am EEPROM auch verdrahtet 
sind und die richtige IIC-Bus-Adresse verwendet wird.

Ich bin immer wieder erstaunt, welch konstruktive Vorschläge Leute 
machen können, die von nichts 'ne Ahnung haben.

Viel Erfolg Michael
Gast #13339
Lesenswert?

Hallo
@Michael Danke für deine Hilfe mit den drei Adressen hat es nun 
geklappt.
Übrigens wahr ich auch für die Antwort von Andreas dankbar denn sonnst 
hat sich ja keiner gemeldet.
Ich hätte da noch eine weitere Frage, wie sind die Speicheradressen 
aufgeteilt.

@Sven wie oben geschrieben arbeite ich mit CodeVision. Diese Funktionen 
hab nicht ich geschrieben sondern werden vom Programm zur Verfügung 
gestellt. Konnte die Funktionen in den Lib leider nicht finden.

mfg

Rolf
Gast #13340
Lesenswert?

Hallo Rolf,

bitte sieh Dir das Datenblatt zum 24C65 an. Ich empfehle Dir für dieses 
EEPROM die IIC-Bus-Adresse 0xA8. Dazu sind die Pins 1+2 mit 0V und Pin 3 
mit Vcc zu verbinden.

Die Adressierung sieht dann so aus:
i2c_write(0xA8);
i2c_write(adr/256);
i2c_write(adr%256);

Die Warteschleife delay_ms(10), wie sie von CodeVision als Beispiel 
gezeigt wird, ist sehr schlichte Programmierung. Da die heutigen EEPROMs 
sich in der Regel viel schneller programmieren lassen ist es besser, das 
EEPROM vor der Programmierung von Byte/Page zu testen, ob es sich 
ansprechen läßt. Falls nicht, muß gewartet werden, bis es bereit ist. 
Diese Warteschleife sollte nach 100 Versuchen abbrechen (timeout), damit 
der Prozessor nicht hängen bleibt, wenn das EEPROM nicht 
antwortet/vorhanden ist.

Gewarnt sei an dieser Stelle vor EEPROMs 24C02/04/08, falls noch andere 
IIC-Bus ICs den Adressraum 0xA0 belegen (z.B. Uhr PCF8583). Einige 
Hersteller beachten die A0-A2 Pins nicht, sodaß eines dieser Teile den 
gesamten Adressraum 0xAX blockiert (Microchip, Infineon). Atmel, ST und 
Rohm Teile funktionieren ordentlich. Dies nur nebenbei.

Gruß Michael
Angehängte Dateien:
Gast #13341
Lesenswert?

Danke Michael,
ich bin froh für deine tipps so bleiben mir Probleme mit blockierten 
Adressbereichen erspart. Ich brauche wirklich noch einen RTC. Doch ich 
habe auf dem Datenblatt nachgesehen zum glück ist er nicht im ax bereich 
sondern im dx, aber auch dieser blockiert den ganzen dx bereich. Doch 
für meine Anwendung reicht es.
mfg
Rolf

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