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
Ist denn der EEPROM auf Adresse 0xA0 angeschlossen, dass heißt sind die Pins A0-A2 auf Masse gelegt? Sven
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
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.
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
PUSH!! (Ist lange her, aber das Problem besteht noch genauso wie oben beschrieben) ;-) Danke schonmal...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.