hallo, ich versuche grad ein I2C EEPROM zu beschreiben und wiede auszulesen. leider funktioniert es nicht. kann mir jemand weiterhelfen? den quellcode seht ihr unten. es handelt sich hierbei um einen PIC18f65k22, welchen ich mit dem c18 compiler programier. lesen: StartI2C(); //I2C starten putcI2C(0xAE); //EEPROM ansprechen EEAckPolling(0xAE); putcI2C(0x00); //Highteil der Speicher-Addresse EEAckPolling(0xAE); putcI2C(0x00); //Lowteil der Speicher-Addresse EEAckPolling(0xAE); StartI2C(); //erneutes Starten(24LC512Datasheet) putcI2C(0xAF); //EEPROM ansprechen(Read) EEAckPolling(0xAF); abTelegram3[0] = ReadI2C(); //Byte einlesen StopI2C(); //I2C Stop EEAckPolling(0xAE); schreiben: StartI2C(); //I2C starten putcI2C(0xAE); //EEPROM ansprechen EEAckPolling(0xAE); putcI2C(0x00); //Highteil der Speicher-Addresse EEAckPolling(0xAE); putcI2C(0x00); //Lowteil der Speicher-Addresse EEAckPolling(0xAE); putcI2C(abTelegram2[i]); //Daten in EEPROM schreiben SSPCON2=0x04; //Acknoledge while(SSPCON2==0x04); StopI2C(); //I2C stoppen EEAckPolling(0xAE); kann mir jemand helfen?
Was genau geht denn nicht? Bleibt das Programm hängen? Wenn ja, wo? Kannst Du das EEPROM in einem anderen Gerät beschreiben und lesen? Funktioniert das Schreiben? Funktioniert das Lesen? Pull-Up-Widerstände am I2C nicht vergessen? Was für ein EEPROM? (GENAUER Typ, Hersteller) Stimmt die Anzahl der Adressbytes? Schaltung? Fragen über Fragen. fchk
wenn ich es lesen will bleibt es in einer while schleife von der funktion "readI2C()" hängen, da wo er wartet bis ein zeichen empfangen ist, ich weis halt nicht ob er kein zeichen empfangen kann weil das eeprom erst gar nicht beschrieben ist oder so. ob das schreiben funktioniert weis ich nicht. pull-up widerstänade hab ich. bei den EEPROMs handelt es sich um microchip 24lc256. die adressen müssten eig stimmen
1. Wo ist Dein OpenI2C? 2. Du weißt, dass es in der PIC18F Peripherial Library I2C EEPROM Funktionen gibt. Im Installationsverzeichnis der Micrchip-Compilers gibts ein doc Verzeichnis, und da gibts unter anderem auch ein "PIC18F Peripheral Library Help Document.chm". Schau da rein, da steht alles drin. Ansonsten würde ich jetzt mit nem Logic Analyzer beigehen. fchk
1. das mit dem OpenI2C ist des nicht des gleich wie StartI2C()? wenn nicht, wo muss da OpenI2C stehen? 2. Ich wusste nicht das es sowas gibt, viel Dank. bin leider noch ein anfänger mit der PIC programmierung. ich werd dann da mal nachschauen
Deine Leseroutine stimmt nicht. Nach dem restart des I2c wird sofort gelesen, die mit den Sternchen markierten Zeilen sind zuviel. Siehe Datenblatt. lesen: StartI2C(); //I2C starten putcI2C(0xAE); //EEPROM ansprechen EEAckPolling(0xAE); putcI2C(0x00); //Highteil der Speicher-Addresse EEAckPolling(0xAE); putcI2C(0x00); //Lowteil der Speicher-Addresse EEAckPolling(0xAE); StartI2C(); //erneutes Starten(24LC512Datasheet) *** putcI2C(0xAF); //EEPROM ansprechen(Read) *** EEAckPolling(0xAF); abTelegram3[0] = ReadI2C(); //Byte einlesen StopI2C(); //I2C Stop EEAckPolling(0xAE);
zu 1.: weis jetzt was du meinst. das steht bei mir in dem hauptprogramm. und zwar OpenI2C(Master, Slew_ON)
@usuru: aber in dem bild sieht man doch das nach der LowAdresse wieder der Startbefehl kommen muss und danach das controll byte, wo bit0 eine 1 sein muss.
ich kann das EEPROM jetzt lesen, allerdings erhalte ich immer nur 0xff.
denk mal das es einen fehler beim schreiben gibt. hier der Code:
//I2C initialisieren
OpenI2C1(MASTER,SLEW_ON); //PIC als Master
SSP1ADD = 9;
for(i=0; i<20; i++)Delay10KTCYx(50);
//Zum Testen
EEByteWrite1(0xAE, 0x30, 0xA5);
Delay10KTCYx(50);
EEAckPolling1(0xAE);
Delay10KTCYx(50);
EEPageWrite1(0xAE, 0x00, arraywr);
EEAckPolling1(0xAE);
Delay10KTCYx(50);
EESequentialRead1(0xAE, 0x00, arrayrd, 20);
EEAckPolling1(0xAE);
Delay10KTCYx(50);
test = EERandomRead1(0xAE,0x30);
kann mir jemand helfen?
bastler788 schrieb: > ich kann das EEPROM jetzt lesen, allerdings erhalte ich immer nur 0xff. > denk mal das es einen fehler beim schreiben gibt. hier der Code: > > //I2C initialisieren > OpenI2C1(MASTER,SLEW_ON); //PIC als Master > SSP1ADD = 9; > for(i=0; i<20; i++)Delay10KTCYx(50); > > > //Zum Testen > EEByteWrite1(0xAE, 0x30, 0xA5); Oh, das ist aber gemein von Microchip. Ich habe mir eben den Quellcode der EE* Funktionen angeschaut. Der befindet sich im C18 Installationsverzeichnis unter src\pmc_common\i2c\i2c_ee*.c Ganz oben steht in den Kommentaren: * device. This routine can be used for any I2C* * EE memory device, which only uses 1 byte of * * address data as in the 24LC01B/02B/04B/08B. * Du hast ein größeres EEPROM und musst zwei Bytes senden. Lösung: Kopiere Dir diese Funktionen und hänge an den Funktionsnamen z.B. _L an. Ändere in den Kopien den Parameter "address" von unsigned char auf unsigned short (Du hast ja größere Adressen), und überall, wo beispielsweise ein Byte gesendet wird, wie z.B. hier if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received { if ( WriteI2C( address ) ) // write address byte to EEPROM { StopI2C(); return ( -3 ); // return with write collision error } musst Du statt address nun nacheinander (address>>8) und (address&255) senden. fchk
danke, das könnte die lösung sein. aber wenn ich die zu ändernden c-Dateien mit dem editor öffne und versuch zu ändern, dann abspeicher, dann neu kompilieren und dann in debugmodus geh, dann seh ich das er die änderung nicht übernimmt
bastler788 schrieb: > danke, das könnte die lösung sein. > aber wenn ich die zu ändernden c-Dateien mit dem editor öffne und > versuch zu ändern, dann abspeicher, dann neu kompilieren und dann in > debugmodus geh, dann seh ich das er die änderung nicht übernimmt Entweder übernimmst Du die geänderten Dateien in Dein eigenes Projekt, oder Du fügst sie der Compileebibliothek hinzu - dann musst Du die Bibliothek neu bauen. Dafür gibts in .\src entsprechende Batchfiles. Auf jeden Fall musst Du die Geänderten Funktionen anders nennen. Fchk
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.
