Wemos D1 Mini: I2C finzt nicht.

OP (Firma: Q3) #6718701
Ich versuche mit dem folgenden simplen Code einen HMC5883L (Kompass) am 
Wemos D1 Mini auszulesen. Obwohl ich mit dem Oszi an den Pins 4 u. 5 den 
Takt bzw. gesendete Daten nachweisen kann, kommt von dem Chip selbst 
keine Antwort. Ich habe inzwischen 3 Stück (frisch aus der Tüte) 
ausprobiert, so dass es nicht sehr wahrscheinlich ist, dass die alle 
drei defekt sind.

Ein an den gleichen Pins ersatzweise angeschlossener Gyro-Sensor MPU6050 
benötigt freilich einige andere Init-Bytes, aber der funktioniert sofort 
am Wemos D1 Mini.

Warum läuft das Kompass-Dingens nicht? (an einem UNO läuft der Code 
dagegen sofort). SDA und SCL hab ich auch mehrmals zum Test vertauscht 
... nix. Auch die PIN-Defs bei Wire.begin mit allen anderen Pins 
ausprobiert ... Aus dem Loop kommt immer nur "no data" :-(
1
#include <Wire.h>
2
byte adr = 0x1E;
3

4
void setup()
5
{
6
  Serial.begin(9600);
7
  Wire.begin(4,5);
8
  wsend2(adr,0x02,0x00); //Mode-Register, kontinuierliches Messen
9
}
10

11
void loop()
12
{
13
  int x,y,z;
14
  wsend1(adr,0x03); //Leseregister X MSB
15
  Wire.requestFrom(adr, 6);
16
  if(6<=Wire.available())
17
  {
18
    x = Wire.read()<<8; x |= Wire.read(); //X lsb
19
    z = Wire.read()<<8; z |= Wire.read(); //Z lsb
20
    y = Wire.read()<<8; y |= Wire.read(); //Y lsb
21
    Serial.println(String(x)+" "+String(y)+" "+String(z)); 
22
   }
23
   else Serial.println("no data");
24
   
25
 delay(500);
26
}
27

28
void wsend1(byte adr, byte data1)
29
{
30
  Wire.beginTransmission(adr);
31
  Wire.write(data1); 
32
  Wire.endTransmission();
33
}
34

35
void wsend2(byte adr, byte data1, byte data2)
36
{
37
  Wire.beginTransmission(adr);
38
  Wire.write(data1); 
39
  Wire.write(data2);
40
  Wire.endTransmission();
41
}
#6718715
Würde mal das Ergebnis von endTransmission() anschauen
Returns byte, which indicates the status of the transmission:

    0:success
    1:data too long to fit in transmit buffer
    2:received NACK on transmit of address
    3:received NACK on transmit of data
    4:other error
Gast #6718840
Die häufigste Ursache für einen nicht funktionierenden I2C-Bus sind zu 
hohe oder fehlende Pullup-Widerstände. Bei 3.3 Volt würde ich mal 
1k0-1k2 probieren, die oft verwendeten 4k7 oder gar 10k sind viel zu 
hoch.

Häng mal ein Oszi an die Signale SDA und SCK/SDL und schau Dir die 
Signale an.
OP (Firma: Q3) #6720634
DasProblem hat sich auf sehr banale Weise erledigt: Das Breakout war 
falsch bedruckt. Anstatt eines HMC5883 war ein QMC5883 verbaut, obwohl 
die andere Bezeichnung auf der Platine stand. Ein simpler I2C-Scan 
förderte die Adresse 0x0D zutage statt 0x1E ...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.