PIC18, I2C EEPROM

OP #2229508
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?
#2229695
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
OP #2229806
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
#2230009
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
Gast #2230122
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);
Angehängte Dateien:
Gast #2232191
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?
#2232403
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
Gast #2232489
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
#2232536
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren