Forum: Compiler & IDEs I2C: Verständnis Fragen zu Write und Adresse


von Khan (Gast)


Lesenswert?

Hallo Zusammen,

ich versuche mich gerade in I2C einzuarbeiten, da habe ich den Kode von 
Peter Fluery entdeckt.

Habe Atmega32 und PCF8574. (Schaltung funktioniert)

1.     /* write 0x75 to eeprom address 0x05 (Byte Write) */
    ret = i2c_start(Dev24C02+I2C_WRITE); // set device address and write

Warum muss man zum Adresse noch den I2C_WRITE angeben?
Da es Addiert wird und I2C_WRITE = 0 ist hat es ja keine Wirkung.
Müsste ich nicht die Adresse um 1 ShiftLeft  und + I2C_WRITE machen?

Vor allem wird ja im Header garnicht der I2C_WRITE behandelt.
Das gleiche beim Read.

2. was passiert wenn ich eine Adresse habe wo LSB 1 ist?
wird sie durch diese schreibweise nicht verfälscht?

3. Warum schreibt Peter 2x write?
        i2c_write(0x05);    // write address = 5
        i2c_write(0x75);    // ret=0 -> Ok, ret=1 -> no ACK
        i2c_stop();         // set stop conditon = release bus

Ist das so weil es mit EEProm komunizieren soll?

4. Besteht die verbindung so lange bis ich i2c_stop() mache?
d.h. kann ich soviele daten schicken wie ich will so lange ich den bus 
mit der entsprechenden Baustein aufrecht erhalte?



Ich hoffe dass sind nicht sehr viele fragen....





Grüße Khan

von Jörg X. (Gast)


Lesenswert?

> Warum muss man zum Adresse noch den I2C_WRITE angeben?
Muss man nicht, hat ja keine Auswirkung. ABER man sieht sofort, was da 
passiert.

> Müsste ich nicht die Adresse um 1 ShiftLeft  und + I2C_WRITE machen?
Hängt definitiv davon ab, wie du die Adresse angibst..
Im pcf8754-Datenblatt steht die Adresse so:
1
   0 1 0 0 A2 A1 A0 0
2
MSB                  LSB
3
          |--------| 3 Pins, um die Adresse einzustellen
Also 8 Bit, links ausgerichtet.
> 2. was passiert wenn ich eine Adresse habe wo LSB 1 ist?
> wird sie durch diese schreibweise nicht verfälscht?
Wi gesagt, hängt davon ab wie du die adresse hinschreibst, die Adresse 
des PCF 8754 besteht aus 7 bits und lautet entweder 0x20-0x27, wenn du 
nur die 7 Adress bit anschaust ODER 0x40-0x4E (in Zweierschritten), wenn 
das R/W Bit mit drinsteht.
> 3. Warum schreibt Peter 2x write?
Weil wahrscheinlich nicht nur die Adresse geschrieben wird
> 4. Besteht die verbindung so lange bis ich i2c_stop() mache?
Prinzipiell ja, kann natürlich vom slave abhängen (wenn du ein NAK 
empfängst brauchst du nicht weiter zu senden ;) )

hth. Jörg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Khan wrote:

> Warum muss man zum Adresse noch den I2C_WRITE angeben?

Weil die Entscheidung zwischen READ und WRITE im Bit 0 der
Adresse liegt.

> Da es Addiert wird und I2C_WRITE = 0 ist hat es ja keine Wirkung.

Ist nur aus Symmetriegründen (mit I2C_READ) für die Lesbarkeit
des Codes da.

> Müsste ich nicht die Adresse um 1 ShiftLeft  und + I2C_WRITE machen?

Das ist eine Frage, wie man die Adresse auffasst.  Effektiv ist es
ja nur eine 7-Bit-Adresse, aber üblich in den Datenblättern von
I²C-ICs ist die Angabe in exakt der Form, in der man sie auch dem
Gerät mitteilt.  Ein PCF8583 hat dann also die Adresse 0xa0, wenn
geschrieben wird und 0xa1, wenn gelesen wird.

> 2. was passiert wenn ich eine Adresse habe wo LSB 1 ist?

Das kann bei I²C nicht passieren, da das die Leseadresse eines
Gerätes ist.

> 3. Warum schreibt Peter 2x write?
>         i2c_write(0x05);    // write address = 5
>         i2c_write(0x75);    // ret=0 -> Ok, ret=1 -> no ACK

Weil du zuerst die EEPROM-Adresse und dann die im EEPROM an diese
Adresse zu schreibenden Daten ausgeben musst.

> 4. Besteht die verbindung so lange bis ich i2c_stop() mache?

Ja, das ist eine I²C-Bustransaktion.

> d.h. kann ich soviele daten schicken wie ich will so lange ich den bus
> mit der entsprechenden Baustein aufrecht erhalte?

Das musst du dem Datenblatt des angesprochenen Slaves entnehmen.
Bei Speicherbausteinen ist es aber üblich, dass sie bei der Übergabe
(bzw. Anforderung) mehrerer Daten innerhalb einer Transaktion intern
die Adresse selbst weiter zählen.

von Khan (Gast)


Lesenswert?

Hey danke dass war super verständlich!

aber jetzt habe ich eine weitere Frage:

Laut datenblatt ist die Adressierung:

0 1 0 0 A2 A1 A0 R/W

RNBFRA schlägt eine Adressierung vor u.z. 0x72 = 1110010
dass definitiv nicht passt aber die schaltung funktioniert mit 0X72
warum dass? komisch oder?


grüße

von Khan (Gast)


Lesenswert?

Ok es hat sich erledigt!

Denn habe nicht den PCF8574 sondern PCF8574A und da passt es!

Ich danke euch somit bin ich fürs erste in Sachen 12C eingeweit ;-)

Grüße

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.