Forum: Mikrocontroller und Digitale Elektronik Falsche Adresse PCF 8575 ?


von Achim S. (achims)


Lesenswert?

Hallo
ich verwende den IC PCF8575 (I2C 16 Bit)
In dem Programm wollte ich die Adresse 0x32 bis 0x39 nutzen. Habe aber 
zufällig noch die Adresse 0x42 drin gehabt. Dies stammt doch vom PCF 
8574. Mit dieser Adresse geht der PCF 8575 auch. Mit seiner richtigen 
Adresse (0x32) geht er nicht.
Versteh leider nicht warum. Hat jemand eine Erklärung für mich?
achim

von spess53 (Gast)


Lesenswert?

Hi

>In dem Programm wollte ich die Adresse 0x32 bis 0x39 nutzen.

Lt. meinem Datenblatt hat der PCF8575 die Adressen 0x40/41, 0x42/43, ... 
.

MfG Spess

von holger (Gast)


Lesenswert?

>Lt. meinem Datenblatt hat der PCF8575 die Adressen 0x40/41, 0x42/43, ...

I2C slave address L H L L A2 A1 A0 R/W

Da frag ich mich auch wie man auf 0x32 bis 0x39 kommt;)

von Dieter F. (Gast)


Lesenswert?

Interessant, wie viele Datenblätter es da gibt :-)

Lt. http://www.ti.com/lit/ds/symlink/pcf8575.pdf (Seite 8 oben) gehts 
von 0x20 bis 0x27

von holger (Gast)


Lesenswert?

>Da frag ich mich auch wie man auf 0x32 bis 0x39 kommt;)

Mit 32 bis 39 dezimal ohne 0x davor passt es dann;)

von Achim S. (achims)


Angehängte Dateien:

Lesenswert?

Hallo
habe auch das selbe Datenblatt wie Dieter. Dort werden die Adressen auf 
dem Bild angegeben. Verwende die Schreibweise als Dez mit 0x...
Sorry, das ist mir unklar.
Wo hast du die Adressen her?
Gibt es zwei verschiedene Angaben oder hat jeder Hersteller seine 
eigenen Adressen?
achim

von Dieter F. (Gast)


Lesenswert?

Achim Seeger schrieb:
> Verwende die Schreibweise als Dez mit 0x...

Das ist falsch - 0x... steht für einen Hexadezimal-Wert. Du Schreibst ja 
auch nicht "das kostet 0x55,60 Euro" - oder? :-)

Wie auch im Datenblatt zu sehen entspricht z.B. 32 dezimal 0x20 
hexadezimal.

Gruß
Dieter

von Achim S. (achims)


Lesenswert?

Stimmt Dieter, du hast wieder recht.
Trotzdem versteh ich es nicht.

unsigned char adr1_w = 0x40;      // Schreibadresse 40
unsigned char adr1_r = 0x41;      // Leseadresse

unsigned char adr2_w = 0x42;      // Schreibadresse 42
unsigned char adr2_r = 0x43;      // Leseadresse

Gebe es so an in meinem Prg und damit geht es
achim

von Oliver R. (orb)


Lesenswert?

Schön wenn zu der Verwirrung mit 7- und 8-Bit Adressen noch verschiedene 
Zahlensysteme kommen ;-)

von Dieter F. (Gast)


Lesenswert?

Achim Seeger schrieb:
> unsigned char adr1_w = 0x40;      // Schreibadresse 40
> unsigned char adr1_r = 0x41;      // Leseadresse

Wenn Du genau diese Werte übergibst wird es (bei passender 
Jumper-Stellung) wohl passen, da jeweils an der eigentlichen Adresse 
noch ein Schreib-/Lese-Bit "dranhängt".

D.h. z.B. die erste Adresse 0x20 wird eins nach links geschoben (dann 
0x40) und das Schreib-/Lese-Bit (Seite 7 unten dargestellt) addiert - 
das ergibt dann 0x40 bzw. 0x41.

So gesehen hat Spess auch wieder (irgendwie) Recht, obwohl die korrekte 
Bezeichnung für das "Konstrukt" nicht "I2C-Adresse" sondern vielleicht 
"Adressierung mit Schreib-/Lese-Information" lauten sollte (oder so 
ähnlich :-)).

Gruß
Dieter

von Dieter F. (Gast)


Lesenswert?

Oliver R. schrieb:
> Schön wenn zu der Verwirrung mit 7- und 8-Bit Adressen noch verschiedene
> Zahlensysteme kommen ;-)

Achim Seeger schrieb:
> unsigned char adr1_w = 0x40;      // Schreibadresse 40
> unsigned char adr1_r = 0x41;      // Leseadresse

Richtig :-) daher sollte der Kommentar auch

// Schreibadresse 64

oder besser einfach

// Schreibadresse

lauten

von Achim S. (achims)


Lesenswert?

Hallo Dieter
welcher Zahlenbereich (Adressbereich) gilt den nun?
Wie ist den nun die korrekt Schreibweise?

Hallo Oliver
finde deinen Kommentar irgendwie erbauen und Mutmachend
Könntest du was beitragen zu diesem Durcheinander?
Wie ist es mit einer Stelle oder Tut, wo so was einfach erklärt wird. 
Lese es gern und wende es an.

achim

von Dieter F. (Gast)


Lesenswert?

Achim Seeger schrieb:
> Hallo Dieter
> welcher Zahlenbereich (Adressbereich) gilt den nun?
> Wie ist den nun die korrekt Schreibweise?

Du musst die gewünschte Hexadezimal-Adresse lt. Datenblatt 1 mal nach 
links schieben und 1 oder 0 für Lesen oder Schreiben addieren:

Adresse 0x20 links geschoben wird 0x40 + Lesen(1)/Schreiben(0)
Adresse 0x21 links geschoben wird 0x42 + Lesen(1)/Schreiben(0)
...
Adresse 0x27 links geschoben wird 0x4F + Lesen(1)/Schreiben(0)

Gruß
Dieter

von Lattice User (Gast)


Lesenswert?

Achim Seeger schrieb:
> Hallo Dieter
> welcher Zahlenbereich (Adressbereich) gilt den nun?
> Wie ist den nun die korrekt Schreibweise?
>

Beide sind richtig.
Die I2C Spec lässt sich darüber nicht aus.

Selbst bei Philips dokumentierten schon von Anfang an manche Abteilungen 
in der 7bit Schreibweise, und andere in der 8bit Schreibweise.

von spess53 (Gast)


Lesenswert?

Hi

>Du musst die gewünschte Hexadezimal-Adresse lt. Datenblatt 1 mal nach
>links schieben und 1 oder 0 für Lesen oder Schreiben addieren:

Etwas pauschal. Weder die Hersteller und schon gar nicht die 
Programmierer haben dafür eine 'Norm'.

Für den PCF 8575 gibt NXP als Adresse 0 1 0 0 A2 A1 A0 R/W, TI 32..39D 
(0x20..0x27) an. Ersteres ergibt als Adresse 0x40...0x4E und muss nicht 
geschoben werden. Letztere schon. Bei den Librarys gibt es welche die 
selbst schieben, also die 7-Bit-Adresse erwarten und welche die die 
8-Bit-Adresse brauchen.

Also gibt es kein

>Wie ist es mit einer Stelle oder Tut, wo so was einfach erklärt wird.
>Lese es gern und wende es an.

Da hilft nur Datenblatt und Quelltext selbst lesen.

MfG Spess

von Oliver R. (orb)


Lesenswert?

Achim Seeger schrieb:
> welcher Zahlenbereich (Adressbereich) gilt den nun?
> Wie ist den nun die korrekt Schreibweise?

Wie schon geschrieben wurde gibt es keine korrekte Schreibweise, Du mußt 
nur wissen, daß es beide gibt und wie sie sich in einander umwandeln 
lassen.
Für Dein Bauteil kommst Du um den Blick ins Datenblatt eh nicht drumrum 
und da steht dann welche Schreibweise benutzt wird bzw ist erklärt wie 
sich die Adresse aufbaut.
Nur die Dezimaldarstellung ist eher unüblich.

von Dieter F. (Gast)


Lesenswert?

spess53 schrieb:
> Etwas pauschal

Nö - auf das benannte Datenblatt bezogen ... ;-)

von Klaus (Gast)


Lesenswert?

Oliver R. schrieb:
> Wie schon geschrieben wurde gibt es keine korrekte Schreibweise, Du mußt
> nur wissen, daß es beide gibt und wie sie sich in einander umwandeln
> lassen.

Im Standard steht dazu:

> Data transfers follow the format shown in Figure 9. After the START
> condition (S), a slave address is sent. This address is seven bits
> long followed by an eighth bit which is a data direction bit (R/W)
> — a ‘zero’ indicates a transmission (WRITE), a ‘one’ indicates a
> request for data (READ) (refer to Figure 10).

Ein Byte eines Datentransfers (an anderen Stellen auch gerne Oktet 
genannt) wird oft in mehrere Bitfelder aufgeteilt.

MfG Klaus

von Dieter F. (Gast)


Angehängte Dateien:

Lesenswert?

spess53 schrieb:
> Für den PCF 8575 gibt NXP als Adresse 0 1 0 0 A2 A1 A0 R/W, TI 32..39D
> (0x20..0x27) an. Ersteres ergibt als Adresse 0x40...0x4E und muss nicht
> geschoben werden.

Ich habe mal - aus Interesse - nachgeschaut.

http://www.nxp.com/documents/data_sheet/PCF8575.pdf

NXP sagt aus meiner Sicht genau das gleiche wie TI - die Adresse ist 
7-stellig (0x20..0x27) und wird im ersten Byte mit "angehängter" 
R/W-Information übertragen (siehe anleigende Bild - habe die Adresse 
grün markiert)

von dummy (Gast)


Angehängte Dateien:

Lesenswert?

>NXP sagt aus meiner Sicht genau das gleiche wie TI

NXP sagt auf einer Seite eines Datenblattes beides;)
Siehe Anhang.

von Dieter F. (Gast)


Lesenswert?

dummy schrieb:
> NXP sagt auf einer Seite eines Datenblattes beides;)

Es geht um den PCF8575 (mit einer 5 am Ende)

von dummy (Gast)


Lesenswert?

>> NXP sagt auf einer Seite eines Datenblattes beides;)
>
>Es geht um den PCF8575 (mit einer 5 am Ende)

Das weiss ich, bin ja nicht blöd. Das sollte nur zeigen
das das jeder hält wie ein Dachdecker. Es gibt keine
einheitliche Vorgehensweise was diese Adressen angeht.

von Dieter F. (Gast)


Lesenswert?

Was übergeben wird ist ein Byte. In diesem Byte, sind eine 
7-Bit-Adressinformation und eine 1-Bit-Schreib-Lese-Information 
enthalten.
Steht auch so in der I²C-Spezifikation:

The slave address and R/W bit
Data transfers follow the format shown in Figure 9. After the START 
condition (S), a slave address is sent. This address is seven bits long 
followed by an eighth bit which is a data direction bit (R/W) — a ‘zero’ 
indicates a transmission (WRITE), a ‘one’ indicates a request for data 
(READ)

(Und ja, ich weiß auch das es mittlerweile 10-Bit-Adressen gibt)

Ich vermute mal, dass es sich bei der rechten Abbildung um einen Fehler 
handelt, da es auf Seite 13 anders - aus meiner Sicht korrekt - 
dargestellt wird.

von Achim S. (achims)


Lesenswert?

Sorry, wenn ich mich jetzt ganz blöd stelle oder vielleicht sogar bin. 
Je mehr ich dazu von euch lese um so weniger verstehe ich.
Es gibt also 7 Stellen oder 8 Stellen. Steht im Datenblatt drin. 
Adressen können "umgerechnet" werden. Hab ich das soweit richtig 
verstanden?
Wenn ich das richtig verstanden habe, brauche ich noch ein Tip wie das 
geht.
Habe bisher immer angenommen das z.B. die Adresse

unsigned char adr1_w = 0x40;      // Schreibadresse 40
unsigned char adr1_r = 0x41;      // Leseadresse

unsigned char adr2_w = 0x42;      // Schreibadresse 42
unsigned char adr2_r = 0x43;      // Leseadresse

so angegeben richtig sind. Das jeder IC (I2C) einen bestimmten 
Adressbereich hat und so ca 1024 (?) mögliche Adressen gibt. Ich 
Dummerchin. hab da wohl was falsch verstanden.
Könnte mich jemand von dieser Unwissenheit befreien, wirklich, ich sehe 
nicht mehr durch.
achim

von Falk B. (falk)


Lesenswert?

@ Achim Seeger (achims)

>Sorry, wenn ich mich jetzt ganz blöd stelle oder vielleicht sogar bin.

Wer so wie du schon so lange mit I2C rumspielt und es noch immer nicht 
begriffen hat . . .

>Es gibt also 7 Stellen oder 8 Stellen.

Es sind immer 8 Bit, wobei das LSB angibt, ob gelesen oder geschrieben 
wird. Nun kann man diese 8 Bit als Adresse ansehen (incl. R/W Bit) oder 
nur die echten 7 Adressbits (ohne R/W Bit).

>Habe bisher immer angenommen das z.B. die Adresse

>unsigned char adr1_w = 0x40;      // Schreibadresse 40
>unsigned char adr1_r = 0x41;      // Leseadresse

>so angegeben richtig sind. Das jeder IC (I2C) einen bestimmten
>Adressbereich hat und so ca 1024 (?) mögliche Adressen gibt.

Wie kommst du bei 8 Bit auf 1024?

>Könnte mich jemand von dieser Unwissenheit befreien,

Ob das möglich ist?

von Dieter F. (Gast)


Lesenswert?

Achim Seeger schrieb:
> Habe bisher immer angenommen das z.B. die Adresse
>
> unsigned char adr1_w = 0x40;      // Schreibadresse 40
> unsigned char adr1_r = 0x41;      // Leseadresse
>
> unsigned char adr2_w = 0x42;      // Schreibadresse 42
> unsigned char adr2_r = 0x43;      // Leseadresse
>
> so angegeben richtig sind. Das jeder IC (I2C) einen bestimmten
> Adressbereich hat und so ca 1024 (?) mögliche Adressen gibt.

Jein :-)

Wenn Du mit "Adresse" das Byte mit den Adress- UND 
Schreib-Lese-Informationen meinst ist das für den ersten Teil korrekt 
(wobei der Kommentar immer noch falsch ist ...)

Mit 7 Adress-Bit kann man aber keine 1024 Adressen abbilden - es sind 
theoretisch 128 möglich, von denen aber 16 reserviert/nicht nutzbar sind 
(wenn man von der möglichen 10-Bit-Adressierung absieht) - also max. 112 
unterschiedliche Slave-Adressen.

von Klaus (Gast)


Lesenswert?

Dieter Frohnapfel schrieb:
> (Und ja, ich weiß auch das es mittlerweile 10-Bit-Adressen gibt)

Nicht "mitlerweile" sondern schon immer. Und da wirds dann komisch, das 
R/W Bit liegt, wenn man es in die Adresse reinrechnet, mitten drin.

Die Spezialisten hier schimpfen immer, wenn man ein Register, daß 
verschiedene Bits oder Bitfelder beinhaltet in einem Rutsch als Hexwert 
beschreibt. Ein solcher Code sei schlecht wartbar und unleserlich.
Mit derselben Begründung ist dann das erste Byte eine I2C-Telegramms 
(auch schon mal Address Byte genannt):
1
data = I2C_address << 1 | RW_bit

MfG Klaus

von Dieter F. (Gast)


Lesenswert?

Klaus schrieb:
> Nicht "mitlerweile" sondern schon immer.

Nö - das ist nicht korrekt. Die 10-Bit-Adressierung kam später.

von Achim S. (achims)


Lesenswert?

Hallo Falk
diese 1024 hab ich irgendwo im Netz gelesen. Das mit den 128 ist ja 
klar. Ich kenne auch die Version, das in abhängigkeit der verwendeten 
ICs es zu einer doppelten Adresse kommen kann und ich dann 2x Bus 
verwenden muss mit einem entsprechenden ICs um beide Bus Adressen zu 
verwenden.
Es geht mir im Moment darum, das ich jetzt durcheiander gekommen bin 
oder eine Stelle nicht ganz verstanden habe oder etwas einfach 
durcheinander bringe.
Deswegen frage ich bei euch.
Zu der falschen Bezeichnung. Habe infach das Stück von oben kopiert
Werde jetzt im Prg es ändern.
achim

von Falk B. (falk)


Lesenswert?

Es kommt darauf an, wie die Adresse im Programm/den Funktionen verwendet 
wird. Da muss man im Sourcecode nachsehen.
1
#define RW_BIT 1
2
3
//Version 1 , 7 Bit ohne RW
4
5
#define I2C_ADDRESS 0x20
6
7
data = I2C_ADDRESS << 1 | RW_bit
8
9
//Version 2 , 8 Bit incl. RW
10
11
#define I2C_ADDRESS 0x40
12
13
data = I2C_ADDRESS | RW_bit

von Dieter F. (Gast)


Lesenswert?

Dieter Frohnapfel schrieb:
> Die 10-Bit-Adressierung kam später.

... nämlich 1992 (1982 wurde die "originale I²C-Bus-Spezifikation" 
bekanntgegeben) ...

von Lattice User (Gast)


Lesenswert?

Dieter Frohnapfel schrieb:
> Klaus schrieb:
>> Nicht "mitlerweile" sondern schon immer.
>
> Nö - das ist nicht korrekt. Die 10-Bit-Adressierung kam später.

Ab Version 1.0 (1992), d.h. die erste Version die nicht nur Philips 
intern war. Ich würde sagem, dass zählt als schon immer.

In der Spec wird die Addresse immer nur binär geschrieben, und wird 
dabei sehr oft in 4bit gefolgt von 3bit gruppiert. Und das legitimiert 
die hexadezimale 8bit Schreibweise.

Die aus der I2C Spec abgeleitete SMBUS Spec schreibt an mehreren 
Stellen, dass das bit 0 der Assigned Address (ein 8bit Wert!) zu 
ignorieren ist. Davon abgesehen wird immer binär notiert, aber auch hier 
mit 4bit,3bit Gruppierung.

Darauf zu bestehen, dass das eine richtig und das andere falsch ist 
(egal wie rum) geht schlicht und einfach an der Realität vorbei.

von Dieter F. (Gast)


Lesenswert?

Lattice User schrieb:
> Ich würde sagem, dass zählt als schon immer.

Nö - (mal abgesehen davon, dass mich "würde" nicht berührt; aber ihr 
könnt gerne eine Gebetsfahne oder -trommel aufstellen, nur wird es 
dadurch nicht richtiger :-)

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.