BME280 per OneWire mit DS28E17

OP #4681175
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
...
Gast #4681209
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.
OP #4681221
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.
(Firma: fritzler-avr.de) #4681237
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
Gast #4681239
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"
Gast #4681251
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.
OP #4681263
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.
(Firma: fritzler-avr.de) #4681849
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.
Gast #4958817
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
}

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