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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan (Gast)


Angehängte Dateien:

Bewertung
2 lesenswert
nicht 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)


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

von Stefan (Gast)


Bewertung
3 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
2 lesenswert
nicht 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. (stefanus)


Bewertung
2 lesenswert
nicht 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_)


Bewertung
1 lesenswert
nicht 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. (stefanus)


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

von portwandler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
gibt es die auch mit mehr Ports?
16 oder so?

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert

von Gerhard O. (gerhard_)


Bewertung
2 lesenswert
nicht 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. (stefanus)


Bewertung
2 lesenswert
nicht 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_)


Bewertung
1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hat jemand dazu Erfahrung?

von Stefan ⛄ F. (stefanus)


Bewertung
1 lesenswert
nicht 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.

: Bearbeitet durch User
von portwandler (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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
// ESP32 I2C Scanner
// Based on code of Nick Gammon  http://www.gammon.com.au/forum/?id=10896
// ESP32 DevKit - Arduino IDE 1.8.5
// Device tested PCF8574 - Use pullup resistors 3K3 ohms !
// PCF8574 Default Freq 100 KHz 

#include <Wire.h>

void setup()
{
  Serial.begin (115200);  
  Wire.begin (21, 22);   // sda= GPIO_21 /scl= GPIO_22
}

void Scanner ()
{
  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
  unsigned int frequenz;

  Wire.begin();
  Serial.print ("I2C Taktfrequenz: ");
  frequenz = Wire.getClock();
  Serial.println (frequenz);
  Serial.println ();
  delay (5000);
  
  for (frequenz = 100000; frequenz > 1000; frequenz = frequenz - 1000) 
  {
    Wire.setClock(frequenz);
    delay (500);
    Serial.print ("I2C Taktfrequenz gesetzt: ");
    Serial.print (frequenz, DEC);
    Serial.println ();
    delay (100);
    Serial.print ("I2C Taktfrequenz ist    : ");
    Serial.print (Wire.getClock(), DEC);
    Serial.println ();
    delay (100);

    count = 0;
    for (byte i = 8; i < 120; i++) 
    {
      Wire.beginTransmission (i);          // Begin I2C transmission Address (i)
      if (Wire.endTransmission () == 0)  // Receive 0 = success (ACK response) 
      {
        Serial.print ("Found address: ");
        Serial.print (i, DEC);
        Serial.print (" (0x");
        Serial.print (i, HEX);     
        Serial.println (")");
        count++;
      }
    }
    Serial.print ("Found ");      
    Serial.print (count, DEC);        // numbers of devices
    Serial.println (" device(s).");
    delay (1000);
  }
 }
void loop()
{
  Scanner ();
  delay (1000);
}

von Stefan (Gast)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
1 lesenswert
nicht 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.

: Bearbeitet durch User
von Joachim B. (jar)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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. (stefanus)


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

: Bearbeitet durch User
von Klaus R. (klara)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
1 lesenswert
nicht lesenswert
Geert V. schrieb:
> To me, this is not correct.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.