Forum: Compiler & IDEs I2C (Peter Fleury's Lib) Frage zum lesen


von Fer T. (fer_t)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Fer T. (fer_t)


Lesenswert?

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?
MfG

von Karl H. (kbuchegg)


Lesenswert?

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!

von Fer T. (fer_t)


Lesenswert?

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.

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.