Stm32f4 I2C 16Bit auslesen

Gast #3588825
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
Angehängte Dateien:
Gast #3588899
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
Gast #3588944
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.
Gast #3588981
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
#3589049
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
Gast #3589836
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
Gast #3589903
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren