Hallo,
ich habe den folgenden Sensor
http://www.ti.com/lit/ds/symlink/hdc1050.pdf
hier herumliegen.
Auf Seite 14 findet man die "Register Map"
Leider stellt sich heraus, dass ich nur
bestimmte dieser Register lesen kann!
kann
ich die Register
0xFB
0xFC
0xFD
0xFE
0xFF
auslesen
doch die Register
0x00
0x01
0x02
kann ich nicht auslesen.
Ist im Zusammmenhang mit diesen Registern eine andere Zugriffsmethode
erforderlich?
die REgister
0xFX
kann ich alle
wie folgt lesen:
Device Adresse schicken 0xb1000000 (+R/W bit)
Den Wert des PointerReg schicken (also z.B. 0xFF für die ID)
dann 2 Bit vom Sensor empfangen!
Was empfängst du denn statt der register ?
€dit: ich setze 1€, dass du zu schnell liest, lass deinem sensor zeit
zur konvertierung (~5ms) und lies nochmal
Statt der eigentlichen Registerwerte bekomme ich nur 0x00
also es wird nichts empfangen.
Mit Meßdauer sollte das nichts zutun haben,
wäre ich nur zu schnell, würd ich einfach nur einen alten Wert
empfangen,
der da dann halt noch drin steht.
Aber das Statusregister 0x02, sollte ja auszulesen sein!
und das geht nicht!
Wenn 0x00 zurück kommt, dann zeiht jemand die Leitung auf low, also
entwerder steht 0x00 in deinem Register oder dein Gerät misinterpretiert
deine Befehle.
Wie sprichst du denn die Kiste an ? Code ?
"HAL_I2C_Master_Transmit(&hi2c2, (uint16_t) I2C_addr<<1,
&HDC1050_Transmit_buf[0], (uint16_t) 1, 1000);" setzt den Lesepointer
auf Adresse und löst eine Wandlung aus
Jetzt braucht die Gurke eine ganz schöne Zeit (weil er Temperatur und
Feuchte in 14 bit konvertieren muss)
Deswegen liefert er ein NAK wenn du ihn nur mikrosekunden später via
"HAL_I2C_Master_Receive(&hi2c2, (uint16_t) I2C_addr<<1,
&HDC1050_Receive_buf[0], (uint16_t) 2, 1000);" angehst um Daten zu
kriegen
Ich weiß nich genau wie die STM-Hal das löst, aber ich würde raten sie
schreibt ganrnichts oder sogar nullen in den Buffer.
warte einfahc zwischen write und read ein paar (zweistellig)
millisekunden ab, im schlimmsten fall hilfts nicht.....
Ja es hilft ja nix.
Hab jetzt mal 500ms und einmal 5s gewartet....
nichts hat sich geändert......
Das Auslesen des Config-REgister sollte ja auch nicht
mit der "Conversion Time" zusammenhängen!?
HDC1050_Transmit_buf[0] = 0x00; und wenn du hier gleich 0x02 einträgst
und nicht bei 0x00 anfängst ?
Wenn das auch nix hilft: Logicanalyzer auf dne I²C Bus loslassen...
Ja merkwürdig wenn ich mir die Busaktivität anschaue, sehe ich, dass
da keine Daten kommen, wenn ich 0x00, 0x01 oder 0x02 schicke
(wenn ich das richtig abgelesen hab)
ja mensch mir gehen die Optionen aus?
Register 0xFB-0xFF kann man immer lesen, die anderen erst nach
Power-Up Zeit von min. 15ms, ansonsten wird nur NACK zuruckgesendet.
Und irgendwie komme ich nicht klar mit deiner Leseroutine und
'Single transaction'.
EDIT:
Sehe ich richtig, dass du 16bit Adresse rausschickst ?
Nö
ist
uint_8 I2C_addr = 0b1000000
und ich weiß nicht, warum die HAL Funktionen
16 bit haben möchte.
--->
HDC1050_Transmit_buf[0] = 0x02; //Pointer Register Value
HDC1050_Transmit_buf[1] = 0b00000000; // Configuration REgister bit
15:8
HDC1050_Transmit_buf[2] = 0x00; // Configuration REgister bi 7:0
--->
das ist doch ein uint8_t array !
1. 0x02 ist der PointerReg Wert
2. das Highbyte für die Konfiguartion
wenn da nun das Bit 12 0 ist (wie hier jetzt) heiß das nur, dass ich
beim
Versuch nur 2Byte vom Temperaturregister bekomme, die aus dem Humidity
Reg
müssen dann über PointerReg0x01 separat abgefragt werden und werden
nicht
gleich angehängt an die Temperaturdaten!
Ist doch so zu verstehen?
3. ist das Lowbyte, das immer 0x00 sein soll!
VG
Jörg K. schrieb:> uint_8 I2C_addr = 0b1000000>> und ich weiß nicht, warum die HAL Funktionen> 16 bit haben möchte.
Das mit uint8_t wusste ich nicht.
Aber wenn das eine Funktion ist, muss auch ein Resultat da
sein - warum prüfst du es nicht ?
Jörg K. schrieb:> Ist doch so zu verstehen?
Ja, ich verstehe es auch so.
So habe nun etwas herausgefunden:
Ich kann "seltsamerweise" nun das Config Register 0x02 auslesen
und es scheint der Wert 0b10000000 drin zu stehen.
D.H. der Steht die ganze Zeit auf "Software Reset"
Es macht ihm auch nichts aus, was ich ihm vorher geschickt habe,
wenn ich das Register lese steht immer dieser Wert drin!
Hmmh ich schau mal weiter..........
Jörg K. schrieb:> Es macht ihm auch nichts aus, was ich ihm vorher geschickt habe,> wenn ich das Register lese steht immer dieser Wert drin!
Da du ja weder das Resultat von "HAL_I2C_Master_Receive(...);"
noch von "HAL_I2C_Master_Transmit(...);" prüfst, sagt dieser Wert
genau nichts.
Max D. schrieb:> Logicanalyzer -> Transmissions aufzeichnen -> Screenshot.
Oder das.
Hallo,
hab jetzt herausgefunden, woran es lag:
zwischen Messungen muss einfach genügend Zeit vergehen!
Das kann tatsächlich nur durch "Warten" geschehen (über Delays oder
Timer Interrupt) wie auch immer!
nun klappt's
Jörg K. schrieb:> zwischen Messungen muss einfach genügend Zeit vergehen!Marc V. schrieb:> Da du ja weder das Resultat von "HAL_I2C_Master_Receive(...);"> noch von "HAL_I2C_Master_Transmit(...);" prüfst, sagt dieser Wert> genau nichts.
Hättest du das Resultat von HAL_I2C_Master_Receive(...); geprüft,
hättest du auch gesehen, dass wahrscheinlich gleich nach der Adresse
NACK zurückgesendet wird.
Jörg K. schrieb:> Das kann tatsächlich nur durch "Warten" geschehen (über Delays oder> Timer Interrupt) wie auch immer!
Nein.
Messung triggern.
Danach Adresse+RD senden, einfach auf ACK oder NACK prüfen.