Forum: Mikrocontroller und Digitale Elektronik Wemos D1 Mini: I2C finzt nicht.


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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
}

von Stefan F. (Gast)


Lesenswert?

Zeige mal das Bild vom Oszilloskop. Ich möchte die Form der Signale 
sehen, und das ACK (bzw. dessen Ausbleiben) vom Slave nach der Adresse.

von Helmut H. (helmuth)


Lesenswert?

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

von bingo (Gast)


Lesenswert?

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.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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 ...

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.