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...
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.