Forum: Mikrocontroller und Digitale Elektronik ESP32: Remapping der SPI-Pins "on the fly"


von Hanns-Jürgen M. (yogy)


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.

von Jan H. (janiiix3)


Lesenswert?

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

von Hanns-Jürgen M. (yogy)


Lesenswert?

So, das Proeblem ist schon gelöst. Wenn mal ein unbeteiligter 
drüberschaut...

Ein kleiner Fehler, eine Unsachtsamkeit meinerseits: falsche 
Pindefinition...

Also problem gelöst. Danke dennoch fürs lesen.

von Hanns-Jürgen M. (yogy)


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.

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

Good Luck

von Jan H. (janiiix3)


Lesenswert?

Danke für die Mühe.
Ich möchte es gerne ohne die vorgefertigten Routinen versuchen und 
verstehen was genau gemacht wird.

Gruß Jan

von Hanns-Jürgen M. (yogy)


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

von Jan H. (janiiix3)


Lesenswert?

Sehr gut, findet man leider eher weniger.

Hast du zufällig Skype oder Discord? Dann kann man sich kurzfristig 
austauschen?

Gruß Jan

von Hanns-Jürgen M. (yogy)


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

von Bernd N. (_bn_)


Lesenswert?

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

von Hanns-Jürgen M. (yogy)


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.

von Εrnst B. (ernst)


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.

von Hanns-Jürgen M. (yogy)


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.

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.