www.mikrocontroller.net

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


Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
   0 1 0 0 A2 A1 A0 0
MSB                  LSB
          |--------| 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Khan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.