Forum: Mikrocontroller und Digitale Elektronik PIC 18f2550 und I2C EEPROM


von AntonEbers (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Gemeinde,

wie schon im Titel ersichtlich möchte ich gern mit einem PIC 18f2550 in 
einen EEPROM schreiben und auch wieder aus ihm lesen und das über den 
I2C Bus

Zu den Daten:

µC PIC: 18f2550
EEPROM: 24AA 1025 I/P
Compiler: C18


Verwendeter Code:

Schreiben:
1
   
2
OpenI2C(MASTER, SLEW_ON);
3
SSPADD = 9;
4
IdleI2C();              
5
StartI2C();             //I2C starten
6
WriteI2C(0xA6);         //Controllbyte
7
EEAckPolling(0xA6);
8
WriteI2C(0x00)          //Highteil der Speicher-Addresse
9
EEAckPolling(0xA6);
10
WriteI2C(0x00)          //Lowteil der Speicher-Addresse
11
EEAckPolling(0xA6);
12
WriteI2C(0x05))         //Daten
13
EEAckPolling(0xA6);
14
StopI2C();              //I2C Stop

Lesen:
1
OpenI2C(MASTER, SLEW_ON);    // Initialize I2C module
2
SSPADD = 9; 
3
IdleI2C();
4
StartI2C();                 //I2C starten
5
WriteI2C(0xA6);      //Controllbyte
6
EEAckPolling(0xA6);
7
WriteI2C(0x00;      //Highteil der Speicher-Addresse
8
EEAckPolling(0xA6);
9
WriteI2C(0x00);      //Lowteil der Speicher-Addresse
10
EEAckPolling(0xA6);
11
IdleI2C();
12
StartI2C();                        //I2C starten
13
ToSendDataBuffer[1] = ReadI2C();   //Daten auslesen
14
EEAckPolling(0xA6);
15
StopI2C();                       //I2C Stop

Das Problem ist, dass ich immer 0xff im ToSendDataBuffer[1] stehen habe.
Ich verstehe auch das diagramm für das lesen nicht ganz da nach dem 
zweiten StartI2C noch ein Controllbyte eingezeichnet ist dass ich aber 
werder senden noch empfangen kann ohne dass sich der µc aufhängt.

Ich kenne auch die I2C EEPROM Funktionen aus der C18 lib nur sind die 
nicht für EEPROMs mit mehr als einem Adressbyte.

Das WriteProtectionPin ist richtig angeschlossen und die beiden 
Adresspins sind auf + angeschlossen.

Ich bin um jede Hilfe dankbar.
von tt2t (Gast)


Lesenswert?

Grundsätzliches zu I2C bei http://sprut.de/electronic/pic/grund/i2c.htm
von AntonEbers (Gast)


Lesenswert?

Danke für Deine Antwort

ich kenne die Seite von Sprut aber ich kann dort keine Antwort auf mein 
Problem finden
von holger (Gast)


Lesenswert?

>ich kenne die Seite von Sprut aber ich kann dort keine Antwort auf mein
>Problem finden

EEAckPolling(0xA6); macht nicht das was du denkst.
Das hat in deinem Program so wie von dir verwendet
nichts zu suchen.
von AntonEbers (Gast)


Lesenswert?

Danke auch Dir für deine Antwort

Was muss ich stattdessen verwenden?
Ist alles Grundlegend falsch? Wenn ja wie sollte es aussehen?
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.