Forum: Mikrocontroller und Digitale Elektronik PIC18, I2C EEPROM


von peter m. (bastler788)


Lesenswert?

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?

von Frank K. (fchk)


Lesenswert?

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

von peter m. (bastler788)


Lesenswert?

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

von Frank K. (fchk)


Lesenswert?

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

von peter m. (bastler788)


Lesenswert?

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

von usuru (Gast)


Angehängte Dateien:

Lesenswert?

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);

von peter m. (bastler788)


Lesenswert?

zu 1.: weis jetzt was du meinst. das steht bei mir in dem hauptprogramm. 
und zwar OpenI2C(Master, Slew_ON)

von peter m. (bastler788)


Lesenswert?

@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.

von bastler788 (Gast)


Lesenswert?

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?

von Frank K. (fchk)


Lesenswert?

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

von bastler788 (Gast)


Lesenswert?

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

von Frank K. (fchk)


Lesenswert?

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

von bastler788 (Gast)


Lesenswert?

vielen dank.
grad hab ich noch hin und wieder den fehler bus collision

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.