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
>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.
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
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
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.
>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.
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
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.