Forum: Mikrocontroller und Digitale Elektronik ESP8266 als SPI-Slave kommunizieren


von Hanns-Jürgen M. (yogy)


Lesenswert?

Hallo zusammen,

es gibt hier einen Beitrag

Beitrag "ESP8266MOD als SPI Slave? Firmware?"

der auch mein Problem beschreibt. Leider gibt es in dem Beitrag kein 
Ergebnis / Lösung.

Ich möchte den ESP als "dummen" WLAN-Adapter nutzen und quasi alternativ 
zu einem W5500 LAN Adapter betreiben können. Das Hauptsystem, in meinem 
System auf einem Arduino DUE basierend, soll dazu als MASTER mit dem ESP 
als SLAVE kommunizieren.

Den ESP programmneiere ich (noch) über die Arduino-SW-Plattform, und die 
gibt keine Möglichkeit, die SPI (HSPI) Schnittstelle des ESP als Slave 
zu betreiben. (Den DUE programmiere ich über ATMEL Studio ohne ASF 
Nutzung)

Ich habe nun gesucht und gesucht. Es gibt da bei GITHUB ein paar 
Lösungen, die aber für mich eher nicht brauchbar sind. Ich habe mir dann 
bei Expressiv die "Technical Reference" zum ESP8266 heruntergeladen. 
Dort ist "eigentlich" alles vorhanden, was ich benötige, aber, wie es 
fehlen, wie bei vielen chinesischen Programmbeispielen, die Listings der 
notwendigen Headerdateien.

Daher meine Frage an euch: Hat jemand die HSPI-Schnittstelle in 
Standdard C als Slave auf einem ESP8266 zum Spielen gebracht? Wo sind 
die passenden Header-Dateien zu finden oder gar ein Tutorial? Wäre toll.

Ach ja, die Verwendung der SPI-Schnittstelle ist zwingend, die RS232 
Schnittstelle oder gar eine SW Emulation kommen aus 
Geschwindigkeitsgründen nicht infrage.

Danke im Voraus, Yoygy

von OMG (Gast)


Lesenswert?

Hanns-Jürgen M. schrieb:
> Ach ja, die Verwendung der SPI-Schnittstelle ist zwingend, die RS232
> Schnittstelle oder gar eine SW Emulation kommen aus
> Geschwindigkeitsgründen nicht infrage.

Ja, dann also lieber eine Nichtfunktion anstelle einer
praktikablen Implementierung.

I2C geht ja auch gaaaaar nicht, gell?

von Brain 2.0 (Gast)


Lesenswert?

Und der ESP8266 hat auch keine RS232.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Vielleicht sollte ich erwähnen, daß es sich konkret um ein ESP8266MOD 
auf einem D1 mini Board handelt. Und dieses Modul hat sowohl eine 
serielle Schnittstelle (okay, keine RS232-Pegel) als auch eine irgendwie 
geartete SPI-Schnittstelle und eine I2C Schnittstelle. Letztere kann ich 
bei mir leider auch nicht verwenden.

Aber ich bin ein Schrittchen weiter (Github), ich gebe also noch nicht 
auf. Ich werde berichten.

von Stefan F. (Gast)


Lesenswert?

Soweit ich dieses Thema im Forum seit etwa 10 Jahren beobachte habe ich 
noch von keiner zufriedenstellend funktionierenden SPI-Slave Lösung 
gelesen. Zwischenzeit hieß es mal, dass es doch mit Tricks gehen soll, 
wurde dann aber kurze Zeit später doch wieder als unzuverlässig 
widerrufen.

von Hanns-Jürgen M. (yogy)


Lesenswert?

@Stefan

Ja, es sieht wirklich nicht gut aus. Damit meine nicht die 
Funktionsmöglichkeit, sondern meine Befähigung, die Espressif Vorlage 
(ist wohl c++) in den Arduino Rahmen einzubringen. Compilerfehler ohne 
Ende, deren Lösung mich sinnfreie Stunden gekostet hat. Und dabei geht 
es doch nur um so etwas Einfaches wie SPI.

So, ich muß jetzt meine Spielereien für einige Tage unterbrechen, dann 
setze ich mich noch einmal an das Thema. Ich habe da noch eine andere 
Vorlage bei Github gefunden, die ich dann vlt. auch ausprobieren werde,

Ein Umdrehen der Geschichte (ESP als MASTER, DUE als SLAVE) ist nicht 
möglich, da in der Gesamt-HW die Richtungen von MISI und MISO nicht 
umkehrbar sind und die Leitungen zu den /SS-Pins des DUE anderweitig 
verdrahtet sind. Das wäre ein Workaround gewesen.

Ich melde mich wieder, so oder so.

von Stefan F. (Gast)


Lesenswert?

Ich habe das Gefühl, dass ESP als Slave nur seriell vernünftig 
funktionieren.

von Hanns-Jürgen M. (yogy)


Lesenswert?

@Stefan et altera

Tja, ich habe aufgegeben. Ich bekomme es nicht auf die Schnelle zum 
Spielen. Da ist nicht nur GPIO15 (D8), der beim Start des ESP "offen", 
zumindest nicht positiv, sein muß, sondern auch die beiden versuchten 
Ansätze (Github) sind für mich mehr oder weniger undurchschaubar. CPP 
und die dort verwendete C-Nutzung sind mir ziemlich unverständlich.

Da Ding liegt nun in der Ecke. Leider habe ich aktuell nicht die Zeit, 
die EXPRESSIF-Programmierumgebung zu installieren und mich darin 
einzuarbeiten.

Schließen wir das Thema erst einmal ab.

Viele Grüße, Yogy

von Andreas (Gast)


Lesenswert?

Ich keine Dein Projekt ja nicht aber da du schon einen ESP vorschlägst 
...

Wäre es für dich eine Option auf einen ESP32 umzusteigen, der kann LAN 
und WLAN und du sparst dir das Daten hin und her gehampple.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Andreas schrieb:
> Ich keine Dein Projekt ja nicht aber da du schon einen ESP vorschlägst
> ...
>
> Wäre es für dich eine Option auf einen ESP32 umzusteigen, der kann LAN
> und WLAN und du sparst dir das Daten hin und her gehampple.
Danke für den Tip. sehe ich mir mal an.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Ich habe mir ein paar ESP32-Module (DOIT ESP32 Wroom Devkit V4) besorgt 
und versucht, eine ESP-Slave Funktion zum Spielen zu bringen. (Wie 
erwähnt, habe ich von C++ kaum Ahnung)

Die erste benutzte Library (Cpp) konnte ich nicht eininden bzw. 
kompilieren.

Die zweite Lib (https://github.com/iPAS/esp32-slave-spi) ließ sich 
kompilieren und installieren. Aber die SW "schmiert" ab und der ESP 
bootet neu, sobald SPI-Daten empfangen worden sind und diese ausgelesen 
werden sollen:

Fehlermeldung:

slave input in HEX: (gibt meine SW aus, bevor der Buffer ausgelesen 
werden soll)
CORRUPT HEAP: Bad head at 0x3ffba63c. Expected 0xabba1234 got 0x3ffba990
abort() was called at PC 0x40087139 on core 1

ELF file SHA256: 0000000000000000

Backtrace: 0x40088cf0:0x3ffb1ad0 0x40088f6d:0x3ffb1af0 
0x40087139:0x3ffb1b10 0x40087265:0x3ffb1b40 0x400f0a17:0x3ffb1b60 
0x400ecd05:0x3ffb1e20 0x400ecc94:0x3ffb1e70 0x4008d649:0x3ffb1ea0 
0x40081c92:0x3ffb1ec0 0x40087031:0x3ffb1ee0 0x4000bec7:0x3ffb1f00 
0x40138229:0x3ffb1f20 0x40137f69:0x3ffb1f40 0x400d08e3:0x3ffb1f60 
0x400d07db:0x3ffb1f80 0x400d2601:0x3ffb1fb0 0x40089f7e:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

Die Library nutzt Buffer auf dem Heap, dies habe ich nun umgewandelt, so 
daß "eigentlich" kein Raum auf dem Heap von mir genutzt wird. Aber wer 
weiß, was der Arduinokram so treibt. Vielleicht bin ich auch nur zu 
blöde.

Ich habe mich etwas in den ESP32 und die RTOS Funktionen eingelesen und 
komme auch mit der Library einigermaßen zurecht, aber hier stehe ich nun 
wie der Ochs vorm Berg.

Die Funktion, bei der die Fehlermeldung und der Neustart auftreten ist:

Aufruf im Hauptprogramm (Loop)
1
  if (slave.getInputStream()->length() && digitalRead(SS) == HIGH) {
2
//Inhalt zum Test disabled
3
  }
(Sourcecode bei Github, s.o.)


oder besser:

Kennt irgendjemand hier eine SPI-SLAVE Library, die in Standard C 
geschrieben wurde?

von Hanns-Jürgen M. (yogy)


Lesenswert?

So, Ergänzung: Ich habe angefangen, die Vorlage (für meine Zwecke) zu 
vereinfachen und kann nun den ESP als SPI-Slave betreiben und damit 
Werte vom Mastersystem (basierend auf einem Arduino-DUE) empfangen. Die 
SPI des DUE ist der Master und arbeitet Mode 0, der ESP (SPI-Slave) aber 
in Mode 1 ohne DMA. Lasse ich beide im Mode 0 arbeiten, ist die 
Datenübertragung fehlerhaft, genauer, um ein bit verschoben. Äusserst 
dubios. Entspräche aber der Darstellung in der Expressif 
ESP32_rechnical_reference auf Seite 121. Oder sehe ich das falsch.

Als nächstes versuche ich die Rückübertragung vom Slave zum Master.

von Hanns-Jürgen M. (yogy)


Lesenswert?

So, nachdem ich mich am WE nochmals mir dem Thema SPI-SLAVE auf ESP32 
beschäftigt habe, habe ich die grundsätzliche Frage gelöst. Ich kann nun 
von einem SPI-Master aus Daten zum ESP32 übertragen und auch Daten 
abholen. Ich habe schlußendlich die Vorlage nach 
(https://github.com/iPAS/esp32-slave-spi) von für mich unnötigen Ballast 
befreit. Heap und ähnliches verwende ich nicht. Ich habe auch mit der 
Umstellung dieser Routinen von C++ nach Ansii-C begonnen.

Nochmals danke für eure Hilfe und Anregungen. Yogy.

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.