Forum: Mikrocontroller und Digitale Elektronik I2C - EEPROM 24C128 - SSPBUF immer WRITE-Addresse


von Tobias J. (tobiasjohn) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein Problem mit dem Beschreiben und Lesen eines I2C-EEPROMs.
Im Anhang habe ich mal den Test-Code eingefügt.

Ich schreibe zuerst die ersten 10 Speicher-Adressen des EEPROMs voll und 
möchte sie dann wieder auslesen und auf einem LCD-Display ausgeben.
Das Ausgeben auf dem Display ist ja kein Problem. Leider wird dort immer 
die "Schreib-Adresse" (0xA1 bzw. 161d) ausgegeben wird.

Kann mir jemand einen Tipp geben wo das Problem liegt?

Danke schonmal,
 Gruß
 Tobias

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Ist denn der EEPROM auf Adresse 0xA0 angeschlossen, dass heißt sind die 
Pins A0-A2 auf Masse gelegt?

Sven

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Ganz sicher.

Habe es auch noch einmal nachgemessen.

Mit einer Software-Variante (I2C-Emulation) konnte ich erfolgreich lesen 
und schreiben.

Nun möchte ich aber gerne die Hardware-Variante nutzen (da der 16f877a 
das ja bietet ;-)

Gruß,
 Tobias

von MichiB (Gast)


Lesenswert?

Hi,

du liesst die Adresse zum Lesen zurück.

Ich glaube der PIC lösst nen Interrupt sobald die Adresse gesendet wurde 
un vom EEPROM mit ACK bestätigt wurde. Du musst also auf den nächsten 
Interrupt warten.

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Hallo,
ich habe es gerade noch einmal getestet.
1
TRISC3=1;           // set SCL and SDA pins as inputs
2
TRISC4=1;
3
SSPADD = 9;            // 400k at 16Mhz clock
4
SSPCON = 0b00001000;      // set I2C master mode
5
SSPEN = 1; //MSSP-Modul enable
6
7
SSPIF = 0; // Interrupt-Flag löschen
8
SEN=1; // Bus-Übernahme anweisen
9
while(!SSPIF); // Solange warten bis SSPIF gesetzt wurde
10
SSPIF = 0; // manuelles rücksetzen

im oberen Teil richte ich den PIC als Master ein.
Im Unteren Teil warte ich nur darauf, dass der PIC den Bus übernimmt.
Er bleibt aber immer in der while-schleife (while(!SSPIF)) hängen.
Warum?
Wenn ich anweise den Bus zu übernehmen (mit SEN=1) müsste dann nach der 
Übernahme das Flag SSPIF gesetzt werden. (GIE ist 1)

Kann mir da jemand helfen?
Hat jemand vielleicht ein Beispiel-Programm für Hardware-i2c mit Pic in 
C ?

Ich versuche das nun seit 2 Wochen! Das ist echt deprimierend.

Danke & Gruß,
 Tobias

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

PUSH!!

(Ist lange her, aber das Problem besteht noch genauso wie oben 
beschrieben) ;-)

Danke schonmal...

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Ich habe den ganzen Quatsch schon länger in PicBasic laufen...

Du erwähnst extra, daß GIE=1 ist. Hast Du den SSPIE auch enabled ? Hast 
Du noch eine Interrupt-Service-Routine, die den SSPIF löscht (bevor die 
While-Schleife es merkt) ?

Hast Du die SDA- und SCK-Leitung mit einem Pull-Up-Widerstand versehen ?

Sieh Dir mal das Status-Bit BCLIF an. Viel mehr kann bei einer 
Start-Condition nicht schief gehen.

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.