Wie definiere ich die SPI-Pins in einem ESP32-Modul?

Ich arbeite an einem Projekt, bei dem ich BME688, CAN, LoRa, SD-Karte, ePaper-Display und WiFi-Modul integriere. Ich verwende das Board Heltec LoRa V2. Und ich habe dieses Pin-Diagramm gefunden . Was ich nicht verstehe, ist, warum sie andere Pins für SPI (mit LoRa) anstelle der vordefinierten verwendet haben. Basierend auf dem ESP32-Datenblatt sind die 2 verfügbaren SPI-Pins diesen Pins zugeordnet:Geben Sie hier die Bildbeschreibung ein

ESP32 HSPI und VSPI

Meine Frage ist also, was der Vorteil ist, die SPI-Pins zu ändern (und wie ist das überhaupt möglich)? Beim Lesen der offiziellen Dokumentation von espressif wird etwas über GPIO-Matrix und IOMUX erwähnt. Wo es folgendes heißt

Die meisten Peripheriesignale in ESP32 können direkt mit einem bestimmten GPIO verbunden werden, der als IOMUX-Pin bezeichnet wird. Wenn ein Peripheriesignal zu einem anderen Pin als seinem IOMUX-Pin geleitet wird, verwendet ESP32 die weniger direkte GPIO-Matrix, um diese Verbindung herzustellen.

Wenn der Treiber so konfiguriert ist, dass alle SPI-Signale auf ihre spezifischen IOMUX-Pins gesetzt sind (oder nicht verbunden sind), umgeht er die GPIO-Matrix. Wenn ein SPI-Signal auf einen anderen Pin als seinen IOMUx-Pin konfiguriert ist, leitet der Treiber automatisch alle Signale über die GPIO-Matrix. Die GPIO-Matrix tastet alle Signale mit 80 MHz ab und sendet sie zwischen dem GPIO und dem Peripheriegerät.

Wenn die GPIO-Matrix verwendet wird, können sich Signale schneller als 40 MHz nicht ausbreiten und die Einrichtungszeit von MISO wird leichter verletzt, da die Eingangsverzögerung des MISO-Signals erhöht wird. Die maximale Taktfrequenz mit GPIO-Matrix beträgt 40 MHz oder weniger, während die Verwendung aller IOMUX-Pins 80 MHz zulässt.

Für mich ist das etwas Neues, ich habe noch nie davon gehört. Wenn jemand erklären kann, was los ist und den Grund für diese Pin-Wahl kennt, wäre ich dankbar. Kann mir außerdem jemand helfen, die Pins für den freien SPI zu definieren (da einer vom LoRa-Modul verwendet wird). Ich möchte den Oled-Bildschirm, der mit dem Modul geliefert wird, fallen lassen und stattdessen ein ePaper-Display verwenden.

Antworten (2)

Die Kurzgeschichte der SPI-Pins lautet:

  • Wenn Sie in Ihren Fragen die in der Tabelle angegebenen Pins verwenden, können Sie SPI-Geschwindigkeiten von bis zu 80 MHz erreichen.
  • Wenn Sie andere Pins verwenden, sind Sie auf 40 MHz begrenzt.

Da die meisten Peripheriegeräte eine maximale SPI-Geschwindigkeit von deutlich weniger als 40 MHz haben, ist dies oft nicht relevant. Sie können also beliebige GPIO-Pins nehmen.

Mit dem Heltec-Board ist die Wahl bereits für Sie getroffen. Ich habe keine Ahnung, warum sie sich für diesen speziellen Satz von Pins entschieden haben. Möglicherweise hat es die Leiterplatte vereinfacht.

Ich kenne die Details Ihrer Peripheriegeräte nicht. Aber nehmen wir an, Sie haben Geräte, die sowohl über SPI als auch über I2C verbunden sind.

I2C und SPI sind Busse. So können mehrere Geräte an denselben Bus angeschlossen werden. Daher muss kein separater SPI- oder I2C-Bus verwendet werden. Sie können die von Heltec ausgewählten SPI-Busse einfach wiederverwenden:

  • SPI: Stifte 5 / 19 / 27 für SCK / MISO / MOSI
  • I2C: Pis 15 / 4 von SCL / SDA

Jedes SPI-Gerät benötigt eine separate CS-Leitung. Sie können aus den verbleibenden GPIOs wählen: 0, 2, 12, 13, 17, 22, 23.

Pins ab 32 aufwärts sind auch als GPIOs verfügbar, können aber nur als Input-Pins arbeiten. Sie sind also nicht als CS-Signal geeignet.

Pin 16 kann verwendet werden, wenn die OLED nicht verwendet wird. Ich kann Ihnen nicht sagen, ob dies auch für 4 und 15 gilt, da sie möglicherweise mit Pull-up-Widerständen verbunden sind. Daher ist es wahrscheinlich besser, diese Pins wie vorgesehen für I2C zu verwenden und Ihre I2C-Geräte daran anzuschließen.

Danke für die Antwort. Ich denke, wir sind auf der gleichen Seite. Das, was ich tun möchte, ist, den Oled-Bildschirm fallen zu lassen und einen ePaper-Bildschirm zu verwenden, der SPI verwendet. Mein Hauptproblem liegt in der Syntax im Code. Ich habe versucht, die Person zu kontaktieren, die die Bibliothek für die E-Paper-Anzeige geschrieben hat, die hier zu finden ist ( github.com/ZinggJM/GxEPD2 ). Da ich ESP32 mit AVS-Architektur verwende, weiß ich nicht, ob dies das Ändern des SPI-Peripheriegeräts unterstützt.
Ich denke, ich mache einen Syntaxfehler in meinem Code zum Initialisieren des Bildschirms: SPIClass hspi (HSPI); GxIO_Class io(hspi, /*CS=5*/ 14, /*DC=*/ 17, /*RST=*/ 16); GxEPD_Class display(io, /*RST=*/ 16, /*BUSY=*/ 4); (Entschuldigung für das schreckliche Codeformat, weiß nicht, wie man es im Kommentarbereich formatiert)
Verstehe ich das richtig: Ihr Code lässt sich nicht kompilieren? Wenn ja, beginnen Sie besser eine neue Frage mit dem gesamten relevanten Code und der vollständigen Fehlermeldung.
Der Code wurde kompiliert, aber ich habe einen dummen Fehler gemacht und MISO anstelle von MOSI verwendet. So jetzt funktioniert es, aber es gibt noch ein Problem. Der LoRa_RST-Pin ist mit dem HSPI_CLK-Pin verbunden. Also muss ich jetzt diese IOMUX-Funktion verwenden, um den Standard-HSPI_CLK-Pin zu ändern, aber ich weiß nicht, wie das geht. Haben Sie Vorschläge? Sie können das Pin-Diagramm im ersten Beitrag sehen.
Etwas in der Art von hspi.begin(2, 12, 13);...

Für Arduino IDE,

Sie können die Pins von pins_arduino.h ändern

Stellen Sie sicher, dass Sie es für das richtige Board ändern. Unten war der Pfad für mich C:\Users\USER\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\variants\doitESP32devkitV1

Entschuldigung, dieser Link ist nur auf Ihrem Windows-Computer gut und vielleicht gefällt er einigen. Versuchen Sie, einen Link im Internet hinzuzufügen, der zeigt, wie es geht, oder es im Detail erklärt.