Problem mit I2C Sensor bei Zugriff auf bestimmte Register

Gast #4607861
Lesenswert?
• ▲
▼
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!
Gast #4607889
Lesenswert?
• ▲
▼
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!
#4607949
Lesenswert?
• ▲
▼
"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.....
Gast #4607968
Lesenswert?
• ▲
▼
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!?
Gast #4608010
Lesenswert?
• ▲
▼
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?
(Firma: Vescomp) #4608036
Lesenswert?
• ▲
▼
Jörg K. schrieb:
> ja mensch mir gehen die Optionen aus?
1
   HDC1050_Transmit_buf[0] = 0x02;  //Pointer Register Value
2
   HDC1050_Transmit_buf[1] = 0b00000000;  // Configuration REgister bit 15:8
3
   HDC1050_Transmit_buf[2] = 0x00;   // Configuration REgister bi 7:0

 Laut DaBla ist das nicht richtig:
1
Configure the acquisition parameters in register address 0x02:
2
(a) Set the acquisition mode to measure both temperature and humidity by setting Bit[12] to 1.
3
(b) Set the desired temperature measurement resolution:
4
– Set Bit[10] to 0 for 14 bit resolution.
5
– Set Bit[10] to 1 for 11 bit resolution.
6
(c) Set the desired humidity measurement resolution:
7
– Set Bit[9:8] to 00 for 14 bit resolution.
8
– Set Bit[9:8] to 01 for 11 bit resolution.
9
– Set Bit[9:8] to 10 for 8 bit resolution.
10

11
Read the temperature data from register address 0x00, followed by the humidity data from register address
12
0x01 in a single transaction as shown in Figure 14. A read operation will return a NACK if the contents of the registers have not been updated as shown in Figure 13.

 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 ?
Gast #4608082
Lesenswert?
• ▲
▼
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
Gast #4608826
Lesenswert?
• ▲
▼
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..........
(Firma: Vescomp) #4608937
Lesenswert?
• ▲
▼
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.
Gast #4614352
Lesenswert?
• ▲
▼
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
(Firma: Vescomp) #4614493
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.