I2C (Peter Fleury's Lib) Frage zum lesen

OP #2503158
Hallo,
Ich habe eine Frage, welche sich auf die Lib von Peter Fleury bezieht 
(i2cmaster).
Und zwar möchte ich Werte aus einem 24C02 kompatiblen Slave auslesen, 
der wert ist ein int, also uint16_t (2 Byte).
Ist folgender Code richtig?
1
  uint16_t C1;
2
  i2c_start_wait(0x10:0x11+I2C_READ); //Adresse 1tes Byte 0x10 zweites 0x11
3
  C1 = i2c_readAck();
4
  C1 = (C1 & 0xFF) + i2c_readNak();

Danke schon mal :D

MfG,
Fer_t
Gast
Ob die Lesesequenz richtig ist, verrät dir das Datenblatt des 24C02.

Das hier:
1
C1 = (C1 & 0xFF) + i2c_readNak();
macht auf jeden Fall nicht das, was du wünscht.

Besser ist:
1
C1 = (C1<<8 ) + i2c_readNak();

Oliver
Fer T. schrieb:
> Danke, werde ich ändern :D
>
> Aber ist es richtig in der Start Bedingung beide Bytes anzugeben, oder
> nur das erste, und er wächselt automatisch die adresse beim zweiten
> Adressaufruf?

Ob das so ist oder nicht, entscheidet das 24C02, denn es wertet in 
letzter Konsequenz das Übertragene aus.
Die Info darüber findest du im Datenblatt des 24C02.
Also schau rein!
OP
Danke,
also wenn ich es es richtig verstanden habe muss ich eine 
"Sequence-Read" durch führen, was wenn ich es richtig verstanden hat, 
dass ich zuerst einen "dummy Write" durch führen muss und dann ein Start 
(um den "international Counter" zu setzten) gefolgt von einem "Ack Read" 
für das MSB und einem "Nak Read" für das LSB.

Ist das richtig so?
1
     i2c_start_wait(0xA0+I2C_WRITE);     // EEPROM Adresse
2

3
     i2c_write(0x10);                        // Adresse erstes Byte
4
     i2c_rep_start(0xA1+I2C_READ);       
5
     C1 = i2c_readAck();
6
     C1 = (C1<<8 ) + i2c_readNak();                    // read one byte from EEPROM
7
     i2c_stop();

Ich denke das sollte jetzt stimmen, oder?

Wobei evtl. kann mir jemand noch kurz helfen:
In meinem Datenblatt ist angegeben, dass die Adresse des EEPROM für das 
Lesen 0xA1 und Schreiben 0xA0 ist, sollte doch trotzdem (ist ja beachtet 
oben) so stimmen, oder?

MFG

PS: Bei dem Daten des EEPROM handelt es sich um Parameter eines 
Bauteiles, die vorher ausgelesen müssen um später mit den ADC Werten des 
Bauteils verrechnet zu werden.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.