Forum: Mikrocontroller und Digitale Elektronik Stm32f4 I2C 16Bit auslesen


von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
Ich habe folgendes Problem:

Ich habe hier ein KT0830EG FM-Radio Empfänger. Und ich möchte mit einem 
Stm32f4 ein Register über I2C auslesen. Das Problem ist das diese 
Register alle 16bit weit sind. Das schreiben dieser Register 
funktioniert auch Problemlos. Also Radio funktioniert 1A. Nur das 
auslesen gestaltet sich bei mir Problematisch. Ich benutze eine 
veränderte Version von der I2C Libery von Uwe Becker. Das daten Blatt 
hänge ich einfach mal an. Auf seite 9 ist der Auslesevorgang zwar 
beschrieben allerdings bin ich noch nicht hinter den Richtigen Code 
gekommen. Ich würde euch ja gerne meinen Code anhängen aber da steht 
nicht mehr drin als das von Uwe Becker nur Durcheinander...

Ich hoffe ihr könnt mir helfen
Klaus

von holger (Gast)


Lesenswert?

>Das Problem ist das diese
>Register alle 16bit weit sind.

Man könnte jetzt ja auf die total bescheuerte Idee kommen
zwei Bytes nacheinander zu lesen.

von Klaus (Gast)


Lesenswert?

Danke für den heißen tipp :D Als ob ich das nicht versucht habe. Aber 
ich bekomme bei beiden bytes Den gleichen wert. Ich habe das Mit ACK und 
so noch nicht richtig verstanden.

Klaus

von Klaus (Gast)


Lesenswert?

Hier noch mal der Kleine Auslese teil:
1
 
2
3
  ret_wert=(int16_t)(I2C_ReceiveData(I2C1));
4
5
6
  I2C_AcknowledgeConfig(I2C1, ENABLE);
7
8
9
  ret_wert1=(int16_t)(I2C_ReceiveData(I2C1));
10
11
12
  I2C_AcknowledgeConfig(I2C1,DISABLE);
13
14
15
  I2C_GenerateSTOP(I2C1, ENABLE);

Der ret_wert ist auch immer richtig nur steht in ret_wert1 das gleiche 
drin. Bitte helft mir ich habe grade einfach ein bret vorm Kopf und 
komme halt nicht weiter.

Danke

von Dieter W. (dds5)


Lesenswert?

Wenn da tatsächlich eine 16Bit Übertragung laufen soll wäre das erste 
Acknowledge im Prinzip fehl am Platz.

Vielleicht hilft es, das mal wegzulassen.

von holger (Gast)


Lesenswert?

>Wenn da tatsächlich eine 16Bit Übertragung laufen soll wäre das erste
>Acknowledge im Prinzip fehl am Platz.

So ein Quatsch. Alle Bytes bekommen beim lesen ein ACK.
Nur das letzte Byte wird mit einem NACK belegt.

von Klaus (Gast)


Lesenswert?

Danke für die antworten. Im datenblatt steht ja das der FM-Empfänger die
ACK sendet. Muss ich das irgendwie auswerten? Oder wie funktioniert das?
Die möglichkeit von Dieter habe ich schon ausprobiert Liefert allerdings
das Selbe Ergebniss. ret_wert und ret_wert1 sind identisch..
Ich habe mit I2C nur erfarungen bei AVRs gemacht

von Rainer M. (excogitator)


Lesenswert?

Klaus schrieb:
> Danke für die antworten. Im datenblatt steht ja das der FM-Empfänger die
> ACK sendet.

Das stimmt nur bedingt. Schau dir das Bild auf Seite 9 doch mal genauer 
an. Solange der µC etwas sendet (z.B. Adresse) wird das Ack vom KT0830 
gesendet. Sobald der KT0830 die Daten auf den Bus legt, liegt es an dir 
bzw. dem µC das Ack bzw. Nack zu senden.

Gruß
Rainer

von Marvin M (Gast)


Lesenswert?

Moin,

wo wartest du darauf, dass das zweite Byte angekommen ist?

von Uwe B. (derexponent)


Lesenswert?

Klaus schrieb:
> Ich benutze eine
> veränderte Version von der I2C Libery von Uwe Becker.

in meiner Lib gibt es die Funktion "UB_I2C2_ReadMultiByte"
hast du die benutzt ?

Gruss Uwe

von Klaus (Gast)


Lesenswert?

Uwe B. schrieb:
> in meiner Lib gibt es die Funktion "UB_I2C2_ReadMultiByte"
> hast du die benutzt ?

Ich dachte diese Funktion liest mehrere 8bit Register nacheinander aus. 
Wenn man zum Beispiel einem EEPROM hat und da mehrer daten auf einmal 
haben möchte. Oder ließt diese Funktion auch 16bit Register aus?

> wo wartest du darauf, dass das zweite Byte angekommen ist?

Das tue ich nicht da mir nicht klar ist wie das funktioniert daran 
könnte der fehler liegen..

Klaus

von Klaus (Gast)


Lesenswert?

Ich habe grade deine Funktion ausprobiert und Tatsache sie Funktioniert! 
Super danke! Ich habe allerdings noch eine Frage. Ich habe jetzt die 
Zwei bytes und diese habe ich schon in einem uint16_t gespeichert. Jetzt 
frage ich mich wie ich daraus die unteren 4 bits beispielsweise bekomme 
also <0:3> damit ich zum Beispiel die Lautstärke auslesen kann.

Klaus

von Uwe B. (derexponent)


Lesenswert?

Klaus schrieb:
> Jetzt
> frage ich mich wie ich daraus die unteren 4 bits beispielsweise bekomme
> also <0:3> damit ich zum Beispiel die Lautstärke auslesen kann.
>
> Klaus

einfach mit einer Bitmaske :
1
uint8_t volume; // Wert von 0...15
2
3
volume = (16bit_value & 0x000F);

Gruss Uwe

von Klaus (Gast)


Lesenswert?

Hallo,

Alles klar danke ich habe alles Hin bekommen. Danke für euere Tolle 
unterstützung!

Klaus

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.