Forum: Mikrocontroller und Digitale Elektronik BME280 per OneWire mit DS28E17


von Paul F. (zwanni)


Lesenswert?

Guten Tag,

wie der Titel schon sagt, versuche ich den BME280 als OneWire Sensor zu 
betreiben. Da ich kein Breakout Board finden konnte, habe ich mir das 
mal selbst zusammengebraten. Der DS28E17 antwortet auch schonmal. Mit 
dem weiteren Auslesen hab ich aber noch so ein paar Verständnisprobleme.

Ich stelle das Auslesen mal statisch als Arduino Code dar.
1
BME.reset();
2
BME.select(BME280);        // ROM command: Match ROM [55h]
3
BME.write(0x2D);           // Device command: Write, Read Data with Stop(2Dh)
4
BME.write(0xEC);           // I2C Slave Address
5
BME.write(0x01);           // Number of data bytes to be written
6
BME.write(0xFD);           // I2C Register to read
7
BME.write(0x02);           // Number of data bytes to be read
8
BME.write(crc);            // CRC 16

1. Der BME280 hat mit SDO auf GND eine 7bit Adresse von 0x76. Der 
DS28E17 erwartet eine 7bit Adresse und schaltet das R/W bit selbständig. 
Ist es dann korrekt 0xEC zu senden?

2. Der DS28E17 erwartet einen CRC16 auf die gesendeten Bytes. In der 
OneWire Library sind ja CRC16 Routinen enthalten. Dort muss aber ein crc 
Wert übergeben werden. Wie hab ich das zu verstehen?
1
uint16_t OneWire::crc16(const uint8_t* input, uint16_t len, uint16_t crc) {
2
...

von Wolfgang A. (Gast)


Lesenswert?

Paul F. schrieb:
> Der DS28E17 erwartet eine 7bit Adresse und schaltet das R/W bit
> selbständig.
> Ist es dann korrekt 0xEC zu senden?

Was genau an 0xEC = 0b11101100 ist 7bit?
Guck dir das Ack vom BME an. Spätestens dann beantwortet sich deine 
Frage von selbst. Falls der BME bei 0xEC nicht antwortet, könntest du es 
mit 0x76 probieren ;-)
Das geht schneller, als hier die Diskussion im Thread abzuwarten.

von Paul F. (zwanni)


Lesenswert?

ich weiss,... manche Fragen sollte man hier nicht stellen ^^. Für mich 
hat ein Byte halt immer 8bit. Wenn ich also ein Byte sende sind es nie 
7bit, deshalb sagt mir meine Logik immer ich muss ein bit dazuschieben 
um Platz für das R/W bit zu machen. Das ist wohl mein Denkfehler.

Konzentrieren wir uns also auf die CRC Frage. Wenn ich es richtig 
verstehe übergibt man einen Initialwert, ganz klar ist mir das aber noch 
nicht.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

mich hat mehr OneWire im Titel irritiert und nun ist es doch I2C.
Ich gebe außerdem zu: seit ich mal die ganze Rechnerei für einen HopeRF 
HP03 Luftdrucksensor in ASM auf einem Mega8 gemacht habe, nehme da 
lieber fertiges. ;)

Gruß aus Berlin
Michael

von Paul F. (zwanni)


Lesenswert?

Der Sensor ist I2C. Der DS28E17 setzt OneWire auf I2C um.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Datenblatt lesen bildet.
Was du dem crc zusätzlich übergeben musst steht im Datenblatt unter crc.
Und ja es ist das INitpolynom, das steht trommelwirbel im DB.

Da steht auch ob das LSB der I2C Adresse gesetzt werden muss oder nicht 
für R/W

von Wolfgang A. (Gast)


Lesenswert?

Paul F. schrieb:
> Wenn ich es richtig verstehe übergibt man einen Initialwert, ganz klar
> ist mir das aber noch nicht.

Hast du die AN27 von Maxim gelesen
http://www.maximintegrated.com/app-notes/index.mvp/id/27

Das Thema der 1-Wire CRC Berechnung wurde hier auch schon ausführlich 
diskutiert.
Beitrag "Re: CRC16 von Maxim Frage"
Beitrag "Re: 1-Wire DS18B20 CRC"
Beitrag "Re: DS18B20 Code funktioniert nicht"
Beitrag "1-Wire CRC Probleme"

von Wolfgang A. (Gast)


Lesenswert?

Mw E. schrieb:
> Da steht auch ob das LSB der I2C Adresse gesetzt werden muss oder nicht
> für R/W

Da verwechselts du die I2C Adresse mit dem ersten Byte der Übertragung.

Die I2C-Adresse ist lt. I2C-Spezifikation (S.15) genau 7 Bit lang. So 
ist es definiert.
http://i2c2p.twibright.com/spec/i2c.pdf

Jeder anders lautende Sprachgebrauch führt immer wieder zu Verwirrung.

Dass die Slave Adresse mit dem R/W-Bit zusammen in das erste übertragen 
Byte gepackt wird, steht auf einem anderen Blatt. Wenn es in der 
Bibliothek eine I2C-Read- und eine I2C-Write-Funktion gibt, ist das 
deren Aufgabe, sich um das Zusammenbasteln zu kümmern - und das tut sie 
dann auch.

von Paul F. (zwanni)


Lesenswert?

Die Datenblätter habe ich beide vorliegen und gelesen. Manchmal ist 
nicht alles für jeden gleich ersichtlich und verständlich, 
Entschuldigung.
Im Datenblatt des DS28E17 finde ich nur einen kurzen Absatz wie der IC 
den CRC Kram behandelt. Ein Initpolynom kann ich dort mit meinem 
Kenntnisstand nicht finden.

In diesem Forum fehlt ein Tutorial dafür, eine Frage mit Empathie zum 
Wissensstand des Fragestellers zu bewerten und zu beantworten.

Danke Wolfang, die Links scheinen viele Infos zu enthalten. Ich versuche 
mich mal da durchzuquälen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Das Polynom steht im DB sogar als riesengroße Grafik, also wer das 
übersieht?
Weiterhin wird auch auf eine Appnote verwiesen wo das 1wire CRC erklärt 
wird.

Paul F. schrieb:
> In diesem Forum fehlt ein Tutorial dafür, eine Frage mit Empathie zum
> Wissensstand des Fragestellers zu bewerten und zu beantworten.
Gilt auch für die TE, zB Datenblatt Links in den Anfangspost packen 
damit man das nich selber suchen muss.

von Paul F. (zwanni)


Angehängte Dateien:

Lesenswert?

danke, ich habs jetzt hinbekommen. Der BME280 läuft nun als 1-Wire 
Sensor. Mal sehen wie er sich als Feuchtigkeitssensor macht.

...

: Bearbeitet durch User
von Joel E. (Firma: na) (joel21987)


Lesenswert?

Hallo, können Sie bitte Ihren Arbeitscode posten? Ich versuche, meine 
DS28E17 auch über I2C zu sprechen. Vielen Dank.

von Paul (Gast)


Lesenswert?

@Joel E B Ich habe mir speziell für den BME280 die Library von Adafruit 
für 1-Wire umgebaut. Ich poste mal eine der Funktionen dann sollte der 
Ablauf klar werden.
1
uint8_t Adafruit_BME280::read8(byte reg) {
2
    uint8_t value;
3
    uint8_t packet[7];                                      // Reserve bytes to transmit data
4
    packet[0] = DS28E17_WRITE_READ_DATA_WITH_STOP;          // Command ("Write Data With Stop")
5
    packet[1] = BME280_ADDRESS;                             // I2C slave to address
6
    packet[2] = 0x01;                                       // Number of data bytes to write
7
    packet[3] = reg;                                        // The data to write
8
    packet[4] = 1;                                          // Number of bytes to read
9
    
10
    uint16_t CRC16 = _bme280_onewire->crc16(&packet[0], 5);
11
12
    CRC16 = ~CRC16;
13
    packet[6] = CRC16 >> 8;                                 // Most significant byte of 16 bit CRC
14
    packet[5] = CRC16 & 0xFF;                               // Least significant byte of 16 bit CRC
15
16
    _bme280_onewire->reset();
17
    _bme280_onewire->select(onewire_address);
18
    _bme280_onewire->write_bytes(packet, sizeof(packet), 1);  // Write the packet and hold the bus
19
    while(_bme280_onewire->read_bit() == true) {              // Wait for not busy
20
        delay(1);
21
    }
22
  _bme280_onewire->read();                  // Read DS28E17 Status
23
  _bme280_onewire->read();                  // Read DS28E17 Write Status
24
25
    value = _bme280_onewire->read();              // Read value
26
    _bme280_onewire->depower();                               // Release the bus
27
    return value;
28
}

von Joel E. (Firma: na) (joel21987)


Lesenswert?

Got it working. Thanks!

von Klara (Gast)


Lesenswert?

Hallo ihr lieben,
Ich hab das ganze mal nachgebaut, kann mir jmd den Code zu diesem 
Projekt schicken geben ?

LG Klara

von Nami (Gast)


Lesenswert?

Klara. Hast du den Code erhalten? Oder hast du die Bibliothek selber 
ergänzt? Beste Grüsse, Nami

von Paul F. (zwanni)


Lesenswert?

Hallo,

für alle die noch danach suchen...
Habe sowohl für den BME280 als auch BME680 Projekte auf meiner Webseite:
http://www.fay.tv/bme280-1-wire

http://www.fay.tv/bme680-1-wire

grüße
zwanni

von Klara (Gast)


Lesenswert?

Nein. Nein. Ich habe es nicht weiter versucht. Ich bin gescheitert auf 
ganzer Linie.

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.