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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.