Forum: Mikrocontroller und Digitale Elektronik Sensirion SCD40 via I2C


von Tino K. (blumengiesser)


Lesenswert?

Ich habe einen SCD40 von Sensirion und via I2C an den ATmega88PB 
angeschlossen. Der hat native I2C. Die Bibliothek habe ich in diversen 
anderen Projekten am laufen. Nur der SCD40 antwortet nicht.

folgende code:

  i2c_init();
  sei();
        _delay_ms(1000);//laut SPEC für den CO2 Sensor
  uint8_t msb=0;
  uint8_t lsb=0;
        uint8_t crc=0;

  i2c_start(0x62 & 0xFE); //WRITE command
  i2c_write(0x36); //Seriennummer MSB
  i2c_write(0x82); //Seriennummer LSB
  _delay_ms(10);
  i2c_start(0x62 | 0x01); //READ command
  msb = i2c_readAck();
  lsb = i2c_readAck();
  crc = i2c_readNak();
  i2c_stop();

Ab i2c_readAck(); hängt das Programm weil die Clock Leitung dauerhaft 
auf 0 gezogen bleibt. Habe das Gefühl dass der nicht antwortet aber was 
ist falsch? Adresse von dem ist 0x62. 50kHz Clock Leitung, 4,7k Ohm 
Pullup and 5V (bei 3,3V geht es auch nicht). Leitung kann man leider 
nicht durchklingeln weil der Sensor ungünstiges Footprint hat...

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Hier sind erst mal das Datenblatt und einige Links zu Arduino und 
Raspberry-Programmen:
https://sensirion.com/de/produkte/katalog/SCD40/

Soweit sehe ich auch keinen Fehler.

Kann es sein, dass die Hex-Zahlen der Datenblatt-Tabelle Table 9 nur 7 
Bit haben, und erst noch eine Stelle nach links geschoben werden müssen?
Aber da stehen auch drei 8 Bit Zahlen
read_measurement 0xec05
get_data_ready_status 0xe4b8
set_ambient_pressure 0xe000
seltsam...

: Bearbeitet durch User
von Sebastian (Gast)


Lesenswert?

Tino K. schrieb:
> i2c_start(0x62 | 0x01); //READ command

Das muss laut Bild ein "repeated start" werden. Macht i2c_start das, 
oder hat die Bibliothek dafür ein i2c_repstart oder so ... ?

LG, Sebastian

von Sebastian (Gast)


Lesenswert?

Laut Datenblatt sollte der delay nur 1ms sein, nicht 10ms. Ausserdem 
gibt read_serial_number 9 Bytes zurück, nicht nur 3. Aber ob das der 
Fehler ist? Versuch doch spasseshalber mal 0x82 0x36 zu senden anstelke 
von 0x36 0x82 ...

LG, Sebastian

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Einer der Links auf der Datenblattseite:
https://github.com/Sensirion/arduino-snippets/blob/main/SCD4x_I2C_minimal_example/SCD4x_I2C_minimal_example.ino

Das ist ein Arduino-Minimalprogramm.

(const int16_t SCD_ADDRESS = 0x62; wieso int16 für ein Byte?)

// start scd measurement in periodic mode, will update every 5 s
Wire.beginTransmission(SCD_ADDRESS);
Wire.write(0x21);
Wire.write(0xb1);
Wire.endTransmission();

Der fängt also gleich mit der periodischen Messung an und braucht keine 
Seriennummer.

>spasseshalber mal 0x82 0x36
Datenblatt Table 9:
get_serial_number 0x3682 "read"
start_periodic_measurement 0x21b1 "send command"
die Reihenfolge high/low scheint zu stimmen

von Wolfgang (Gast)


Lesenswert?

Tino K. schrieb:
> Ab i2c_readAck(); hängt das Programm weil die Clock Leitung dauerhaft
> auf 0 gezogen bleibt. Habe das Gefühl dass der nicht antwortet ...

Prüfe, wer die Leitung runter zieht. Dann weißt du, wo du suchen musst. 
Mehr als einen kleinen Widerstand und ein Oszi brauchst du dafür nicht.

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.