1 votos

¿Cómo definir los pines SPI en un módulo ESP32?

Estoy trabajando en un proyecto donde estoy integrando BME688, CAN, LoRa, tarjeta SD, pantalla ePaper y módulo WiFi. Estoy utilizando la placa Heltec LoRa V2. Y he encontrado este diagrama de pines. Lo que no entiendo es por qué usaron pines diferentes para SPI (con LoRa) en lugar de los predefinidos. Según la hoja de datos de ESP32, los 2 pines SPI disponibles están asignados a estos pines: ingresar descripción de la imagen aquí

ESP32 HSPI & VSPI

Entonces, mi pregunta es ¿cuál es el beneficio de cambiar los pines de SPI (y cómo es eso posible)? Al leer la documentación oficial de espressif menciona algo sobre la matriz GPIO y IOMUX. Donde se indica lo siguiente

La mayoría de las señales periféricas en ESP32 pueden conectarse directamente a un GPIO específico, que se llama su pin IOMUX. Cuando una señal periférica se enruta a un pin que no es su pin IOMUX, ESP32 utiliza la matriz GPIO menos directa para hacer esta conexión.

Si el controlador está configurado con todas las señales SPI establecidas en sus pines IOMUX específicos (o sin conexión), evitará la matriz GPIO. Si se configura alguna señal SPI en un pin que no sea su pin IOMUX, el controlador enrutarán automáticamente todas las señales a través de la Matriz GPIO. La matriz GPIO muestrea todas las señales a 80MHz y las envía entre el GPIO y el periférico.

Cuando se utiliza la matriz GPIO, las señales más rápidas que 40MHz no pueden propagarse y el tiempo de configuración de MISO es más fácilmente violado, ya que se aumenta el retardo de entrada de la señal MISO. La frecuencia máxima de reloj con la Matriz GPIO es de 40MHz o menos, mientras que el uso de todos los pines IOMUX permite 80MHz.

Para mí esto es algo nuevo, nunca había oído hablar de esto. Si alguien puede explicar qué está pasando y conoce la razón detrás de esta elección de pin, lo apreciaría. Además, ¿alguien puede ayudarme a definir los pines para el SPI libre (ya que uno está siendo utilizado por el módulo LoRa)? Quiero omitir la pantalla OLED que viene con el módulo y usar en su lugar una pantalla ePaper.

4voto

Lisa Anne Puntos 108

La breve historia de los pines SPI es:

  • Si usas los pines mostrados en la tabla en tus preguntas, puedes lograr velocidades SPI de hasta 80 MHz.
  • Si usas otros pines, entonces estás limitado a 40 MHz.

Dado que la mayoría de los periféricos tienen una velocidad SPI máxima considerablemente menor a 40 MHz, a menudo no es relevante. Por lo tanto, puedes tomar cualquier pin GPIO que desees.

Dado el board Heltec, la elección ya ha sido hecha por ti. No tengo idea de por qué eligieron este conjunto particular de pines. Posiblemente, haya simplificado el PCB.

No conozco los detalles de tus periféricos. Pero vamos a asumir que tienes dispositivos conectados tanto por SPI como por I2C.

I2C y SPI son buses. Por lo tanto, varios dispositivos pueden estar conectados al mismo bus. Por lo tanto, no es necesario utilizar un bus SPI o I2C separado. Simplemente puedes reutilizar los buses SPI elegidos por Heltec:

  • SPI: pines 5 / 19 / 27 para SCK / MISO / MOSI
  • I2C: pines 15 / 4 para SCL / SDA

Cada dispositivo SPI requerirá una línea de CS separada. Puedes elegir entre los GPIO restantes: 0, 2, 12, 13, 17, 22, 23.

Los pines desde el 32 en adelante también están disponibles como GPIOs pero solo pueden funcionar como pines de entrada. Por lo tanto, no son adecuados como señal CS.

El pin 16 se puede usar si no se usa el OLED. No puedo decirte si lo mismo es cierto para 4 y 15, ya que podrían estar conectados a resistencias pull-up. Por lo tanto, probablemente sea mejor usar esos pines para I2C según lo diseñado y conectar tus dispositivos I2C a ellos.

0 votos

Gracias por la respuesta. Creo que estamos en la misma página. Lo que quiero hacer es reemplazar la pantalla OLED por una de tinta electrónica que utilice SPI. Mi principal problema proviene de la sintaxis en el código. Intenté contactar a la persona que escribió la librería para la pantalla de tinta electrónica, que se puede encontrar aquí (github.com/ZinggJM/GxEPD2). Dado que estoy utilizando ESP32 con arquitectura AVS, no sé si esto admite cambiar el periférico SPI.

0 votos

Estoy pensando que estoy cometiendo un error de sintaxis en mi código para inicializar la pantalla: SPIClass hspi(HSPI); GxIO_Class io(hspi, /*CS=5*/ 14, /*DC=*/ 17, /*RST=*/ 16); GxEPD_Class display(io, /*RST=*/ 16, /*BUSY=*/ 4); (Disculpa por el terrible formato del código, no sé cómo formatearlo en la sección de comentarios)

0 votos

¿Entiendo correctamente: tu código no compila? Si es así, es mejor comenzar una nueva pregunta con todo el código relevante y el mensaje de error completo.

1voto

Para Arduino IDE,

Puedes cambiar los pines desde pins_arduino.h

Asegúrate de cambiarlo para la placa correcta. A continuación fue la ruta para mí C:\Users\USER\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\variants\doitESP32devkitV1

0 votos

Lo siento, ese enlace solo es válido en tu computadora Windows y tal vez en algunas similares. Intenta agregar un enlace en internet que muestre cómo hacerlo o explícalo detalladamente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X