1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-31 15:12:06 +00:00

Always use IDF SPI on ESP32

This commit is contained in:
J. Nick Koston
2025-10-05 23:15:53 -05:00
parent cfd241ff29
commit f195ac1afd
6 changed files with 62 additions and 27 deletions

View File

@@ -268,10 +268,10 @@ def validate_spi_config(config):
# Given an SPI index, convert to a string that represents the C++ object for it. # Given an SPI index, convert to a string that represents the C++ object for it.
def get_spi_interface(index): def get_spi_interface(index):
if CORE.using_esp_idf: platform = get_target_platform()
if platform == PLATFORM_ESP32:
return ["SPI2_HOST", "SPI3_HOST"][index] return ["SPI2_HOST", "SPI3_HOST"][index]
# Arduino code follows # Arduino code follows
platform = get_target_platform()
if platform == PLATFORM_RP2040: if platform == PLATFORM_RP2040:
return ["&SPI", "&SPI1"][index] return ["&SPI", "&SPI1"][index]
if index == 0: if index == 0:
@@ -306,7 +306,7 @@ def spi_mode_schema(mode):
if mode == TYPE_SINGLE: if mode == TYPE_SINGLE:
return SPI_SINGLE_SCHEMA return SPI_SINGLE_SCHEMA
pin_count = 4 if mode == TYPE_QUAD else 8 pin_count = 4 if mode == TYPE_QUAD else 8
onlys = [cv.only_on([PLATFORM_ESP32]), cv.only_with_esp_idf] onlys = [cv.only_on([PLATFORM_ESP32])]
if pin_count == 8: if pin_count == 8:
onlys.append( onlys.append(
only_on_variant( only_on_variant(
@@ -352,7 +352,7 @@ CONFIG_SCHEMA = cv.All(
async def to_code(configs): async def to_code(configs):
cg.add_define("USE_SPI") cg.add_define("USE_SPI")
cg.add_global(spi_ns.using) cg.add_global(spi_ns.using)
if CORE.using_arduino: if CORE.using_arduino and get_target_platform() != PLATFORM_ESP32:
cg.add_library("SPI", None) cg.add_library("SPI", None)
for spi in configs: for spi in configs:
var = cg.new_Pvariable(spi[CONF_ID]) var = cg.new_Pvariable(spi[CONF_ID])
@@ -394,7 +394,9 @@ def spi_device_schema(
cv.Optional(CONF_SPI_MODE, default=default_mode): cv.enum( cv.Optional(CONF_SPI_MODE, default=default_mode): cv.enum(
SPI_MODE_OPTIONS, upper=True SPI_MODE_OPTIONS, upper=True
), ),
cv.Optional(CONF_RELEASE_DEVICE): cv.All(cv.boolean, cv.only_with_esp_idf), cv.Optional(CONF_RELEASE_DEVICE): cv.All(
cv.boolean, cv.only_on([PLATFORM_ESP32])
),
} }
if cs_pin_required: if cs_pin_required:
schema[cv.Required(CONF_CS_PIN)] = pins.gpio_output_pin_schema schema[cv.Required(CONF_CS_PIN)] = pins.gpio_output_pin_schema
@@ -443,13 +445,15 @@ def final_validate_device_schema(name: str, *, require_mosi: bool, require_miso:
FILTER_SOURCE_FILES = filter_source_files_from_platform( FILTER_SOURCE_FILES = filter_source_files_from_platform(
{ {
"spi_arduino.cpp": { "spi_arduino.cpp": {
PlatformFramework.ESP32_ARDUINO,
PlatformFramework.ESP8266_ARDUINO, PlatformFramework.ESP8266_ARDUINO,
PlatformFramework.RP2040_ARDUINO, PlatformFramework.RP2040_ARDUINO,
PlatformFramework.BK72XX_ARDUINO, PlatformFramework.BK72XX_ARDUINO,
PlatformFramework.RTL87XX_ARDUINO, PlatformFramework.RTL87XX_ARDUINO,
PlatformFramework.LN882X_ARDUINO, PlatformFramework.LN882X_ARDUINO,
}, },
"spi_esp_idf.cpp": {PlatformFramework.ESP32_IDF}, "spi_esp_idf.cpp": {
PlatformFramework.ESP32_IDF,
PlatformFramework.ESP32_ARDUINO,
},
} }
) )

View File

@@ -7,7 +7,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#ifdef USE_ARDUINO #if defined(USE_ARDUINO) && !defined(USE_ESP32)
#include <SPI.h> #include <SPI.h>
@@ -19,13 +19,13 @@ using SPIInterface = SPIClass *;
#endif #endif
#ifdef USE_ESP_IDF #ifdef USE_ESP32
#include "driver/spi_master.h" #include "driver/spi_master.h"
using SPIInterface = spi_host_device_t; using SPIInterface = spi_host_device_t;
#endif // USE_ESP_IDF #endif // USE_ESP32
#ifdef USE_ZEPHYR #ifdef USE_ZEPHYR
// TODO supprse clang-tidy. Remove after SPI driver for nrf52 is added. // TODO supprse clang-tidy. Remove after SPI driver for nrf52 is added.

View File

@@ -3,7 +3,7 @@
namespace esphome { namespace esphome {
namespace spi { namespace spi {
#ifdef USE_ARDUINO #if defined(USE_ARDUINO) && !defined(USE_ESP32)
static const char *const TAG = "spi-esp-arduino"; static const char *const TAG = "spi-esp-arduino";
class SPIDelegateHw : public SPIDelegate { class SPIDelegateHw : public SPIDelegate {
@@ -73,9 +73,6 @@ class SPIBusHw : public SPIBus {
channel->pins(Utility::get_pin_no(clk), Utility::get_pin_no(sdi), Utility::get_pin_no(sdo), -1); channel->pins(Utility::get_pin_no(clk), Utility::get_pin_no(sdi), Utility::get_pin_no(sdo), -1);
channel->begin(); channel->begin();
#endif // USE_ESP8266 #endif // USE_ESP8266
#ifdef USE_ESP32
channel->begin(Utility::get_pin_no(clk), Utility::get_pin_no(sdi), Utility::get_pin_no(sdo), -1);
#endif
#ifdef USE_RP2040 #ifdef USE_RP2040
if (Utility::get_pin_no(sdi) != -1) if (Utility::get_pin_no(sdi) != -1)
channel->setRX(Utility::get_pin_no(sdi)); channel->setRX(Utility::get_pin_no(sdi));

View File

@@ -4,7 +4,7 @@
namespace esphome { namespace esphome {
namespace spi { namespace spi {
#ifdef USE_ESP_IDF #ifdef USE_ESP32
static const char *const TAG = "spi-esp-idf"; static const char *const TAG = "spi-esp-idf";
static const size_t MAX_TRANSFER_SIZE = 4092; // dictated by ESP-IDF API. static const size_t MAX_TRANSFER_SIZE = 4092; // dictated by ESP-IDF API.

View File

@@ -1,6 +1,16 @@
substitutions: spi:
clk_pin: GPIO6 - id: quad_spi
mosi_pin: GPIO7 type: quad
miso_pin: GPIO5 interface: hardware
clk_pin:
<<: !include common.yaml number: 6
data_pins:
- 7
- 2
- 10
- allow_other_uses: true
number: 3
- id: spi_id_2
interface: any
clk_pin: 4
mosi_pin: 5

View File

@@ -1,13 +1,37 @@
spi: spi:
- id: three_spi - id: quad_spi
type: quad
interface: spi3 interface: spi3
clk_pin: clk_pin:
number: 47 number: 47
mosi_pin: data_pins:
number: 40 - allow_other_uses: true
- id: hw_spi number: 40
- allow_other_uses: true
number: 41
- allow_other_uses: true
number: 42
- allow_other_uses: true
number: 43
- id: octal_spi
type: octal
interface: hardware interface: hardware
clk_pin: clk_pin:
number: 0 number: 0
miso_pin: data_pins:
number: 41 - 36
- 37
- 38
- 39
- allow_other_uses: true
number: 40
- allow_other_uses: true
number: 41
- allow_other_uses: true
number: 42
- allow_other_uses: true
number: 43
- id: spi_id_3
interface: any
clk_pin: 8
mosi_pin: 9