Forum: Mikrocontroller und Digitale Elektronik MCP23008 unterbricht I2C Verbindung zu ESP8266


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Moin zusammen!

Ich habe gerade ein ziemliches Anfängerproblem.
Ich nutze ein D1 Mini Board mit ESP8266 Chipsatz und würde gerne den 
Portextender MCP23008 via I2C einsetzen.

Ich habe dazu schon in der Arduino IDE einen Testsketch erstellt, der 
die interne LED des D1 Mini im Wechsel mit einer an den MCP23008 
angeschlossenen LED blinken lässt.

Das Problem dabei: Das Ganze funktioniert ungefähr 10 Sekunden lang 
perfekt. Danach fängt der MCP23008 an zickig zu werden und blinkt nur 
noch sporadisch mal mit.

An Librarys nutze ich "Wire.h" für die I2C-Verbindung und die 
"Adafruit_MCP23008.h", um den MCP komfortabel ansprechen zu können.
Für die Librarys hatte ich schon nach Alternativen gesucht. Für die 
Wire.h bin ich da nicht fündig geworden. Die Adafruit-Library habe ich 
testweise zwischenzeitlich rausgeworfen und die Adressbits selbst im 
Code gesetzt. Auch ohne Erfolg.

Um auszuschließen, dass es sich um ein Problem mit dem MCP-Chip handelt, 
hab ich den auch schon ausgetauscht, ohne Erfolg.

Um das Problem weiter einzugrenzen, habe ich auf den ESP dann den Sketch 
"I2C_Scanner" 
(https://github.com/wemos/D1_mini_Examples/blob/master/examples/02.Special/Wire/I2C_Scanner/I2C_Scanner.ino) 
kompiliert. Dieser fragt sekündlich den I2C-Bus ab und listet im 
Serial-Monitor erkannte Geräte auf. Dabei fällt auf, dass der MCP die 
ersten Sekunden problemlos gefunden wird ("I2C device found at address 
0x20 !"). Nach besagten etwa 10 Sekunden wird der MCP dann nicht, bzw. 
nur noch sporadisch zwischendurch erkannt. Warum weiß ich nicht.

Kann ich meine Verdrahtung erstmal als Fehlerquelle ausschließen, wenn 
das Ansprechen des MCPs ja die ersten Sekunden problemlos funktioniert? 
Letztlich kann man da ja auch nicht viel falsch machen, oder?
Der D1 Mini ist via D1 (GPIO5/SCL) und D2 (GPIO4/SDA) mit dem Pendant 
des MCP verbunden. Das sind auch soweit ich gesehen habe die 
Standardpins des D1 Mini. Adressbits des MCP A0 bis A2 sind alle auf 
Masse gezogen, was 0x20 entspricht. Betrieben wir das Ganze mit den 5V 
am USB-Port. Der MCP bekommt die 5V vom D1 Mini, hat also keine eigene 
Spannungsversorgung. Ist aber auch testweise aktuell nur die eine LED 
dran.
Hoffe das ist soweit verständlich.

Ich bin grad etwas ratlos, was ich noch ausprobieren kann. Ich bin zwar 
kein völliger Mikrocontroller-Anfänger, habe mich aber bisher immer nur 
im Arduino-Bereich aufgehalten und mittels Breadboards experimentiert.

Danke schonmal im Voraus für eure Hilfe!
VG Stefan

von Helmut -. (dc3yc)


Lesenswert?

Wo sind die Pullup-Widerstände an SDA und SCL? Wo ist der 
Entkopplungskondensator an der Betriebsspannung vom MCP23008?

von Stefan (Gast)


Lesenswert?

Moin Helmut,

vielen Dank für die Tipps. In meinen bisherigen Projekten hatte ich die 
Pullup-Widerstände und auch den Entkopplungskondensator immer mal wieder 
eingebaut, wenn ich das in vorhandenen Schaltungen so gesehen habe. Ich 
habe bisher jedoch nicht gewusst, wofür die eigentlich sind. Jetzt weiß 
ich mehr!

Ich habe beides gerade kurz in meiner Schaltung ergänzt und es - Du hast 
es wahrscheinlich schon vermutet - löst mein Problem und funktioniert 
nun einwandfrei.

Vielen Dank für die schnelle Hilfe! Man lernt nie aus :-)

von Brain 2.0 (Gast)


Lesenswert?

Kritisch sehe ich die Verbindung über I2C ohne Levelshifter.
Der ESP8266 arbeitet intern mit 3,3V, damit auch auf den Pins. Der MCP 
bei dir mit 5V.
Bisher habe ich noch keine offizielle Info (Datenblatt) gelesen, dass 
der ESP an den Pins auch 5V tolerant ist.

von Stefan F. (Gast)


Lesenswert?

Brain 2.0 schrieb:
> Bisher habe ich noch keine offizielle Info (Datenblatt) gelesen, dass
> der ESP an den Pins auch 5V tolerant ist.

Muss er auch nicht, weil anders herum der Port-Expander zu 3,3V 
kompatibel ist. Man legt einfach die Pull-Up Widerstände auf 3,3V.

von Brain 2.0 (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Brain 2.0 schrieb:
> Bisher habe ich noch keine offizielle Info (Datenblatt) gelesen, dass
> der ESP an den Pins auch 5V tolerant ist.
>
> Muss er auch nicht, weil anders herum der Port-Expander zu 3,3V
> kompatibel ist. Man legt einfach die Pull-Up Widerstände auf 3,3V.

Ok, danke.
Das wusste ich bisher nicht, da ich den Expander bisher nicht verwendet 
habe.

von Stefan F. (Gast)


Lesenswert?

Was die 5V Toleranz des ESP8266 angeht: Die gibt es nicht. In einem 
Diskussionsforum hat Espressif das mal erklärt.

Die meisten CMOS Chips haben ESD Schutzdioden nicht mehr 0,5V über VCC 
und unter GND zulassen.

Beim ESP ist das anders. Er hat an dein Eingängen eine Schaltung die 
ähnlich wie ein Thyristor wirkt, der bei 4-6V auslöst und dann den 
Eingang kurz schließt und dadurch so lange blockiert, bis kein Strom 
mehr fließt. Die Schwelle ist nicht genau definiert.

von Stefan F. (Gast)


Lesenswert?

Wenn du kein Oszilloskop zur Hand hast, kannst du die Pegel am inaktiven 
I²C Bus mit einem Multimeter prüfen. Die idealen Werte sind:

Spannung zwischen GND und SDA: 3,3V sein
Spannung zwischen GND und SCL: 3,3V sein

Strom zwischen GND und SDA: 1-2mA
Strom zwischen GND und SCL: 1-2mA

von Gerhard O. (gerhard_)


Lesenswert?

NXP erfand vor langer Zeit eine Pegelschnittstelle für I2C mit zwei 
Logic-Level MOSFETS. Einfach GATE auf die 3.3V Seite anlegen. SRC zum 
ESP hin und DRAIN zum MCP23008 (5V Seite). Beide Seiten brauchen 
Pullup-Rs. Diese Pegelwandler gibt es fertig konfektioniert in der Bucht 
bzw. von einigen Vertreibern. Diese Methode habe ich schon unzählige 
Male im Einsatz und funktioniert 100% zuverlässig. BSS138 wäre ein 
Vorschlag:

https://www.onsemi.com/pub/Collateral/BSS138-D.PDF

https://www.nxp.com/docs/en/application-note/AN10441.pdf

https://www.sparkfun.com/products/12009

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Pegelwandler sind hier nicht nötig, weil beide IC's mit 3,3V 
kommunizieren können.

von portwandler (Gast)


Lesenswert?

gibt es die auch mit mehr Ports?
16 oder so?

von Stefan F. (Gast)


Lesenswert?


von Gerhard O. (gerhard_)


Lesenswert?

Stefan ⛄ F. schrieb:
> Pegelwandler sind hier nicht nötig, weil beide IC's mit 3,3V
> kommunizieren können.

Im Datenblatt auf Seite 24V (2.1) aber steht, daß die HIGH Pegelschwelle 
des MCP23008 bei 0.8 x VDD lieg und das macht bei 5V VDD 4V. Bei 3.V ist 
man da schon unter der Grenze. Das mag funktionieren, aber man geht ein 
Risiko ein.

Weniger riskant wäre also beidseitige Pegelanpassung schon da er ja 
selber bestätigt, daß der Expander mit 5V vsorgt wird.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Gerhard O. schrieb:
> Im Datenblatt auf Seite 24V (2.1) aber steht, daß die HIGH Pegelschwelle
> des MCP23008 bei 0.8 x VDD lieg.

Oh Scheiße, das hatte ich das falsch in Erinnerung. Gut dass du 
aufgepasst hast!

Dann sollte man wohl doch besser Pegelwandler einsetzen.

von Gerhard O. (gerhard_)


Lesenswert?

portwandler schrieb:
> gibt es die auch mit mehr Ports?
> 16 oder so?

https://www.nxp.com/documents/data_sheet/PCA9505_9506.pdf?

von Blubblub (Gast)


Lesenswert?

@ Stefan (Gast)
Selten erlebt in diesem Forum, das jemand seine Frage derart vernünftig 
und strukturiert stellt - Respekt.
Schön das die so schnell geholfen werden konnt - das hast du dir 
wirklich verdient.

von Brain 2.0 (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
>
> Dann sollte man wohl doch besser Pegelwandler einsetzen.

Dann lag ich mit meinem Post doch nicht so "ganz" falsch.
Lediglich der Auslöser ist nicht der ESP8266, sondern der MCP23008.

von portwalker (Gast)


Lesenswert?

Gerhard O. schrieb:
> portwandler schrieb:
>> gibt es die auch mit mehr Ports?
>> 16 oder so?
>
> https://www.nxp.com/documents/data_sheet/PCA9505_9506.pdf?

Mordsklopper!!

wie oft pro Sekunde kann ich den "Updaten" mit den Arduino Libraries?
Hat da jemand komkretes Zahlenwerk?

BG. Glückauf

von portwandler (Gast)


Lesenswert?

Hat jemand dazu Erfahrung?

von Stefan F. (Gast)


Lesenswert?

portwandler schrieb:
> Hat jemand dazu Erfahrung?

Rechne es dir doch selber aus. Wie viele Bytes musst du übertragen und 
wie schnell geht das bei der gewünschten Übertragungsrate? Kann ja nicht 
so schwer sein, dass man dafür über 24 Stunden braucht.

von portwandler (Gast)


Lesenswert?

Standard Mode kann laut SPEc/Wikipedia:
Standard Mode (Sm)   0,1 Mbit/s

das sind 100 Kbit/s

Damit sollte es doch locker möglich sein ein 16 Bit Schieberegister
mindestens 100 Mal pro Sekunde zu aktualisieren.

Keine Ahnung was eine Arduino Library davon noch wegschluckt.
Hat da jemand "Ahnung" ?

;-)

Danke

von Klaus R. (klara)


Lesenswert?

portwandler schrieb:
> Standard Mode kann laut SPEc/Wikipedia:
> Standard Mode (Sm)   0,1 Mbit/s
>
> das sind 100 Kbit/s

Ja, 100 KBit/s ist auch beim ESP8266 der Standard. Nach unten sind ca. 
10 KHz möglich, nach oben sollten 400 kHz möglich sein.

> Keine Ahnung was eine Arduino Library davon noch wegschluckt.
> Hat da jemand "Ahnung" ?
>
Was soll da wegeschluckt werden? Für den Prozessor-Takt sind 100 kHz 
nicht viel. Anbei ein Programm mit dem ich die untere Grenzfrequenz 
getestet habe. Für Dich sollte "Wire.setClock(frequenz)" interessant 
sein.
mfg Klaus
1
// ESP32 I2C Scanner
2
// Based on code of Nick Gammon  http://www.gammon.com.au/forum/?id=10896
3
// ESP32 DevKit - Arduino IDE 1.8.5
4
// Device tested PCF8574 - Use pullup resistors 3K3 ohms !
5
// PCF8574 Default Freq 100 KHz 
6
7
#include <Wire.h>
8
9
void setup()
10
{
11
  Serial.begin (115200);  
12
  Wire.begin (21, 22);   // sda= GPIO_21 /scl= GPIO_22
13
}
14
15
void Scanner ()
16
{
17
  Serial.println ();
18
  Serial.println ("I2C scanner. Scanning ...");
19
  byte count = 0;
20
  unsigned int frequenz;
21
22
  Wire.begin();
23
  Serial.print ("I2C Taktfrequenz: ");
24
  frequenz = Wire.getClock();
25
  Serial.println (frequenz);
26
  Serial.println ();
27
  delay (5000);
28
  
29
  for (frequenz = 100000; frequenz > 1000; frequenz = frequenz - 1000) 
30
  {
31
    Wire.setClock(frequenz);
32
    delay (500);
33
    Serial.print ("I2C Taktfrequenz gesetzt: ");
34
    Serial.print (frequenz, DEC);
35
    Serial.println ();
36
    delay (100);
37
    Serial.print ("I2C Taktfrequenz ist    : ");
38
    Serial.print (Wire.getClock(), DEC);
39
    Serial.println ();
40
    delay (100);
41
42
    count = 0;
43
    for (byte i = 8; i < 120; i++) 
44
    {
45
      Wire.beginTransmission (i);          // Begin I2C transmission Address (i)
46
      if (Wire.endTransmission () == 0)  // Receive 0 = success (ACK response) 
47
      {
48
        Serial.print ("Found address: ");
49
        Serial.print (i, DEC);
50
        Serial.print (" (0x");
51
        Serial.print (i, HEX);     
52
        Serial.println (")");
53
        count++;
54
      }
55
    }
56
    Serial.print ("Found ");      
57
    Serial.print (count, DEC);        // numbers of devices
58
    Serial.println (" device(s).");
59
    delay (1000);
60
  }
61
 }
62
void loop()
63
{
64
  Scanner ();
65
  delay (1000);
66
}

von Stefan (Gast)


Lesenswert?

Moin nochmal,

vielen Dank für die ganzen Antworten. Ich hatte gar nicht mehr mit so 
vielen Reaktionen gerechnet, nachdem ich schon eine für mich 
funktionierende Antwort bekommen hatte.

Um nochmal kurz zurück zum Thema 3.3V und 5V zwischen ESP8266 und 
MCP23008 zu kommen:
Wenn ich euch richtig verstanden habe, müsste es ja reichen, wenn ich 
die Pullup-Widerstände von SDA/SCL anstatt an den 5V-Pin an den 3.3V-Pin 
des ESP8266 verbinde?

Ich könnte ja genauso gut sowohl die Pullups, als auch die 
Versorgungsspannung des MCP23008 über den 3.3V-Pin nutzen, oder?
Der MCP arbeitet ja auch laut Datenblatt mit 3.3V ohne Probleme. 
Angegeben ist 1.8V-5.5V bei 100kHz. Mehr als 100kHz kann der ESP8266 
wohl eh nicht ohne zusätzlichen Aufwand, wenn ich das in dessen 
Datenblatt richtig nachgeschlagen habe.

Danke euch!

von Stefan F. (Gast)


Lesenswert?

Stefan schrieb:
> Wenn ich euch richtig verstanden habe, müsste es ja reichen, wenn ich
> die Pullup-Widerstände von SDA/SCL anstatt an den 5V-Pin an den 3.3V-Pin
> des ESP8266 verbinde?

Das hatte ich gemeint, aber nun stellte sich ja doch heraus, dass der 
Chip mit 3,3V Pegel nicht klar kommt, wenn er selbst mit 5V versorgt 
wird. Dann brauchst du Pegelwandler. Die kannst du speziell für I²C Bus 
als kompakte Module kaufen. Da sind zwei kleine MOSFET Transistoren und 
4 Pull-Up Widerstände drauf.

Stefan schrieb:
> Ich könnte ja genauso gut sowohl die Pullups, als auch die
> Versorgungsspannung des MCP23008 über den 3.3V-Pin nutzen, oder?
> Der MCP arbeitet ja auch laut Datenblatt mit 3.3V ohne Probleme.

Wenn du den Chip mit 3,3V versorgst, brauchst du keine Pegelwandler. 
Aber Pull-Up Widerstände. Ja, der MCP arbeitet auch mit 3,3V. Aber was 
schließt du denn an seine I/O Pins an? Kommt das mit 3,3V klar? Und ist 
der 3,3V Spannungsregler auf deinem ESP Modul genügend belastbar. Gerade 
die Wemos Module sind da meistens nur sehr knapp ausgestattet.

Stefan schrieb:
> Mehr als 100kHz kann der ESP8266
> wohl eh nicht ohne zusätzlichen Aufwand, wenn ich das in dessen
> Datenblatt richtig nachgeschlagen habe.

Das ist nicht richtig, er schafft auch die 400 kHz locker flockig.

von Joachim B. (jar)


Lesenswert?

Stefan ⛄ F. schrieb:
> Du brauchst also Pegelwandler

der MCP kann aber auch mit VCC 3,3V arbeiten!
Dann braucht er keinen Pegelwandler, wird denn 5V benötigt?

Im Bild wird ja NUR eine LED geschaltet und wenn man nicht gerade high 
power LEDs schaltet dann sollte 3,3V reichen, blaue und weisse LEDs sind 
zwar mit 3,2-3,6V angegeben leuchten aber trotzdem nur nicht immer volle 
Helleigkeit.

von Einer K. (Gast)


Lesenswert?

Stefan schrieb:
> Mehr als 100kHz kann der ESP8266
> wohl eh nicht ohne zusätzlichen Aufwand, wenn ich das in dessen
> Datenblatt richtig nachgeschlagen habe.

Dazu steht nichts im Datenblatt, da der ESP8266 keine Hardware I2C/TWI 
Einheit hat.
Das wird in Software realisiert.

von Stefan F. (Gast)


Lesenswert?

Im Quelltext steht maximal 400kHz bei 80MHz CPU Takt, bzw 800kHz bei 
160MHz CPU Takt. Größere Werte werden automatisch reduziert.

von Klaus R. (klara)


Lesenswert?

Stefan ⛄ F. schrieb:
> Im Quelltext steht maximal 400kHz bei 80MHz CPU Takt, bzw 800kHz
> bei
> 160MHz CPU Takt. Größere Werte werden automatisch reduziert.

Und kleinere als 10 KHz werden ebenfalls korrigiert.
mfg Klaus

von Geert V. (geertvc)


Lesenswert?

Stefan ⛄ F. schrieb:
> Pegelwandler sind hier nicht nötig, weil beide IC's mit 3,3V
> kommunizieren können.

To me, this is not correct.  When looking to the scheme, I see the 
MCP23008 is powered with +5V.  According the datasheets, the HIGH levels 
(also for SDA and SCL) must be above 0.7VDD, which is above 3.5V.  In 
this case, since the ESP is working on 3.3V, you don't satisfy this 
requirement.
Maybe because of tolerances, it MIGHT work.  But it's not guaranteed...

von Stefan F. (Gast)


Lesenswert?

Geert V. schrieb:
> To me, this is not correct.

Yes you are right, we found this out already before.

von Johann K. (Firma: privat) (johnboyk)


Lesenswert?

Da mein Schwerpunkt mehr auf Programmieren, als auf Analog-Elektronik 
ist, bitte ich gleich vorab die vielleicht "blöde" Frage zu 
entschuldigen, aber nur mit lesen und fragen kann man lernen:
Die fehlenden Pullup-Widerstände für SDA und SCL habe ich verstanden und 
auch schon in diversen anderen Schaltungen gesehen. Bitte kann mir 
jemand kurz erklären was ein Entkopplungs-Kondensator für VCC ist? Wie 
stark sollte dieser ungefähr sein und wo in der ursprünglichen Schaltung 
gehört er hinein?
In meinem Fall möchte ich den MCP23008 mit 3.3V betreiben und er soll 4 
LED's leuchten lassen und für 4 Tasten-Inputs verwendet werden. Reicht 
da als "Entkopplungs-Kondensator" einfach ein 100µF Elko zwischen VCC 
für MCP23008 und GND?

von Stefan F. (Gast)


Lesenswert?

Johann K. schrieb:
> Bitte kann mir jemand kurz erklären was ein
> Entkopplungs-Kondensator für VCC ist?

Der sorgt dafür, dass die Stromversorgung trotz sprunghafter Wechsel der 
Stromaufnahme einigermaßen stabil bleibt.

"Entkoppeln" meint hier, dass die Störungen die ein IC sonst verursachen 
würde sich nicht auf andere IC auswirken.

> Wie stark sollte dieser ungefähr sein
#Kann man nicht pauschal sagen, es kommt auf die Bedürfnisse der 
Schaltung an. 100nF ist ein gängiger Wert, der meistens passt.

> und wo in der ursprünglichen Schaltung gehört er hinein?

An jedes IC direkt an dessen Stromversorgungs-Pins. Wenn es mehrere 
solche Pins hat, dann nimmt man auch mehrere Kondensatoren.

> Reicht da als "Entkopplungs-Kondensator" einfach ein 100µF Elko

Große Kondensatoren sind träger, als kleine. Deswegen gilt hier nicht 
"viel hilft viel". Fange mal mit 100nF an und Kontrolliere die Spannung 
mit einem Oszilloskop. Bei den Frequenzen um die es hier geht ist 
alleine das richtige Messen schon eine Herausforderung für sich.

von Johann K. (Firma: privat) (johnboyk)


Lesenswert?

VIELEN DANK an Euch Alle!
Ich habe nur durch mit-lesen schon einiges in diesem Forum gelernt und 
bin begeistert wie rasch hier mit Wissen zur Selbsthilfe unterstützt 
wird!
Danke!

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.