ESP32: Remapping der SPI-Pins "on the fly"

OP #7773711
Lesenswert?

Hallo zusammen,

ich habe mir ein ESP32 "CYD" Modul (Cheap Yellow Display, z.B. bei ebay suchen nach "ESP32 TFT 2.8") zugelegt, und versuche, Teile meiner eigenen SW unter Nutzung der Arduino IDE zum spielen zu bringen. Das TFT kann ich ansteuern, den Touchcontroller jedoch (noch) nicht.

(Die Demo-SW des Herstellers funktioniert, das Modul ist also in Ordnung.)

Das TFT liegt an den Standard-Pins der HSPI Schnittstelle, der Touchcontroller jedoch an den Pins CLK:IO25,DIN:IO32M;DOIT:IO39...), die dann ebenfalls an die SPI Schnittstelle gemapped werden. Es ist also notwendig, "on the fly", das Mapping jeweils umzuschalten. (Die VSPI-Schnittstelle ist fest für die SD-Card vorgesehen). Nur mir gelingt das nicht.

Wo ist mein Fehler?

Mein Code (auszugsweise)

void setup() { ......

//SPI-Schnittstelle fuer TFT initialisieren. HSPI-Pins!!! SPI.begin(TFT_SCK, TFT_MISO, TFT_MOSI, TFT_CS); SPI.beginTransaction(SPISettings(6000000, MSBFIRST, SPI_MODE0)); pinMode(TFT_CS, OUTPUT); .... Initialisierung des TFT .... } void loop() { ....... // Einlesen Touch
SPI.end(); SPI.begin(TOUCH_SCK, TOUCH_MISO, TOUCH_MOSI, TOUCH_CS_PIN); SPI.beginTransaction(SPISettings(6000000, MSBFIRST, SPI_MODE0)); ... Ende Touch .... //Ausgabe auf TFT SPI.end(); SPI.begin(TFT_SCK, TFT_MISO, TFT_MOSI, TFT_CS); SPI.beginTransaction(SPISettings(6000000, MSBFIRST, SPI_MODE0)); ....... }

Ein Umschalten auf die anderen Pins erfolgt bei mir nicht. SPI wird beim ersten Versich, Touch einzulesen, abgeschaltet und läßt sich auch nicht mehr aktivieren. Die SPI Signale habe mit dem Oszi kontrolliert.

Wo liegt das Problem? In der Demo-Version funktioniert das alles, und nach meiner, sicherlich nicht vollständigen, Analyse des Sourcecodes der Demoversion wird keine SW-SPI für das Auslesen des Touchcontrollers benutzt.

(Ich möchte nicht die TFT-eSPI Library von Bodmer verwenden, da diese nicht mit meiner sonstigen SW zusammenspielt.)

Pls help. Danke.

OP #7773773
Lesenswert?

Jan H. schrieb:

Ich schließe mich den mal an..

Mich würde generell mal interessieren wie man z.B. bei einem ESP32C3 die SPI Schnitstelle (GPSPI2) auf beliebige I/O´s mapped..

Nun, wie erwähnt, bei mir funktioniert das jetzt. Ist wogl ein ESP32-WROOM-32. Ich kenne den C3 nicht, ich schaue mal nach... Aha, hat weniger GPIOs. Sollte sonst aber genauso funktionieren.

Erstmaliger Aufruf der SPI-Schnittstelle: (Mein Beispiel)

wichtig ist dabei, daß den Mode der einzelnen Ausgangspins (MOSI, SCK und CS) auf Output gestellt werden, aber nicht auf HIGH oder LOW festgelegt werden.

pinMode(TOUCH_MOSI, OUTPUT); u.s.w.

SPI.begin(TFT_SCK, TFT_MISO, TFT_MOSI, TFT_CS); SPI.beginTransaction(SPISettings(6000000, MSBFIRST, SPI_MODE0));

Soll nun die Schnittstelle "umgemapped" werden, muß die alte Schnittstelle zunächst gestoppt und dann neu mit den anderen Pins gestartet werden.

1
SPI.endTransaction();
2
SPI.end();
3
SPI.begin(TOUCH_SCK, TOUCH_MISO, TOUCH_MOSI, TOUCH_CS_PIN);
4
SPI.beginTransaction(SPISettings(6000000, MSBFIRST, SPI_MODE0));

Good Luck

OP #7773793
Lesenswert?

Jan H. schrieb:

Danke für die Mühe.

no prob. Gerngeschehen.

Ich möchte es gerne ohne die vorgefertigten Routinen versuchen und verstehen was genau gemacht wird.

Das ist auch meine Vorgehensweise. Alle meine Routinen, na gut, der größte Teil, stammt von mir selbst ohne Nutzung irgendwelcher Libraries. Für meine normalen Basteleien nutze ich Atmel Studio für die AVRs und den SAM8 auf der Arduino-DUE Platine. Ich verzichte bewußt auf die ASF-Geschichte und arbeite eigentlich nur mit Ansi-C. Von CPP habe ich keine Ahnung.

Daß ich bei den ESPs auf die Arduino-IDE zurückgreifen muß, gefällt mir absolut nicht. Aber eine eigene ESP-IDE, z.B. Eclipse, habe ich noch nicht zum Spielen gebracht (unter Ubuntu-Linux in einer VM)

Viele Grüße

OP #7773824
Lesenswert?

Ja, gegen einen "Austausch" habe ich nichts einzuwenden. Aber mein "alter" Rechner von 2012 mit Win 7 kann kein Skype mehr. Und ich werde auch nicht updaten/upgraden.

Sollte keine SW mehr auf dem Rechner funktionieren, werde ich einen neuen PC mit Linux aufbauen. (Ich mag weder Microsoft noch Gates). Die VMs sind zu langsam.

Wenn Dur irgendwelche Fragen hast: PN.

Oder bist Du aus der Nähe von PLZ 52525?

Yogy

OP #7774230
Lesenswert?

Bernd N. schrieb:

Dein Problem ist ja bereits gelöst. Nur als Hinweis, ein guter Startpunkt bezüglich des Displays (Board) findest du hier: https://github.com/witnessmenow/ESP32-Cheap-Yellow-Display/tree/main/Examples/Basics

Ein schönes Testprojekt ist ebenfalls auf der Seite. https://github.com/witnessmenow/ESP32-Cheap-Yellow-Display/tree/main/Examples/Projects/VolosSlidersRGB

Danke für den Link; habe ich sofort abgespeichert.

#7774245
Lesenswert?

Nur der Vollständigkeit halber:

Statt das aus Bequemlichkeitsgründen vordefinierte globale "SPI"-Objekt ständig umzukonfigurieren, kannst du auch mehrere eigene anlegen.

SPIClass tft_spi(TFT_MOSI, TFT_MISO, TFT_SCLK); SPIClass touch_spi(TOUCH_MOSI ...

Kann aber trotzdem gut sein, dass die nicht gleichzeitig verwendbar sind, wenn Pins, SPI-Hardware, DMA etc. geteilt sind. Muss deine Anwendung sicherstellen. Muss sie mit nur einem SPI-Objekt aber auch.

OP #7774265
Lesenswert?

Εrnst B. schrieb:

Nur der Vollständigkeit halber:

Statt das aus Bequemlichkeitsgründen vordefinierte globale "SPI"-Objekt ständig umzukonfigurieren, kannst du auch mehrere eigene anlegen.

SPIClass tft_spi(TFT_MOSI, TFT_MISO, TFT_SCLK); SPIClass touch_spi(TOUCH_MOSI ...

Kann aber trotzdem gut sein, dass die nicht gleichzeitig verwendbar sind, wenn Pins, SPI-Hardware, DMA etc. geteilt sind. Muss deine Anwendung sicherstellen. Muss sie mit nur einem SPI-Objekt aber auch.

Danke für den Hinweis. Leider habe ich von CPP und den Klassengeschichten keine Ahnung. Ich habe daher (dank Google und effektiv Github) zwei Objekte angelegt. Das funktionierte (keine Compilerfehler), solange alles in einer einzigen Datei zu finden war.

Das Initialisieren im Hauptprogramm (.ino-File) und das Aufrufen aus einer der Funktion aus einem anderen eingebundenen File hat nicht funktioniert. Ich habe das versucht, die "neue Klasse" mit public zu versehen und entsprechend mit extern darauf zu referenzieren... FAIL. Wie gesagt, ich habe keine Ahnung von cpp.

Vlt. versuche ich das nochmal..

Ach ja, das Modul teilt die HSPI-Schnittstelle zwischen TFT und TOUCH, die VSPI Schnittstelle ist für die SD-Card vorgesehen. Aber ich bin ja erst am Anfang.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren