From 820c191929532d3afc58f1244297e5e9824fc03f Mon Sep 17 00:00:00 2001 From: Natsu-B Date: Fri, 14 Feb 2025 19:25:03 +0900 Subject: [PATCH 1/4] [add] SPICREATE esp32 s3 support --- SPICREATE 2.0.0/src/SPICREATE.cpp | 58 ++++++++++++------------------- SPICREATE 2.0.0/src/SPICREATE.h | 38 ++++++++++++++++---- 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/SPICREATE 2.0.0/src/SPICREATE.cpp b/SPICREATE 2.0.0/src/SPICREATE.cpp index 44c9eb3..00d2c71 100644 --- a/SPICREATE 2.0.0/src/SPICREATE.cpp +++ b/SPICREATE 2.0.0/src/SPICREATE.cpp @@ -1,10 +1,11 @@ // version: 2.0.0 #include "SPICREATE.h" // 2.0.0 +/** @deprecated csセット用だったが、spi_device_interface_config_tのspics_numで代用することにした */ void csSet(spi_transaction_t *t) { - digitalWrite((int)t->user, HIGH); return; } +/** @deprecated csセット用だったが、spi_device_interface_config_tのspics_numで代用することにした */ void csReset(spi_transaction_t *t) { digitalWrite((int)t->user, LOW); @@ -12,41 +13,32 @@ void csReset(spi_transaction_t *t) } SPICREATE_BEGIN +#if !(IS_S3) bool SPICreate::begin(uint8_t spi_bus, int8_t sck, int8_t miso, int8_t mosi, uint32_t f) { - - frequency = f; - if ((sck == -1) && (miso == -1) && (mosi == -1)) - { - bus_cfg.sclk_io_num = (spi_bus == VSPI) ? SCK : 14; - bus_cfg.miso_io_num = (spi_bus == VSPI) ? MISO : 12; - bus_cfg.mosi_io_num = (spi_bus == VSPI) ? MOSI : 13; - } - else + if ((sck == -1) && (miso == -1) && (mosi == -1) && spi_bus == VSPI) { - bus_cfg.sclk_io_num = sck; - bus_cfg.miso_io_num = miso; - bus_cfg.mosi_io_num = mosi; + sck = SCK; + miso = MISO; + mosi = MOSI; } + spi_host_device_t host_in; + host_in = (spi_bus == HSPI) ? HSPI_HOST : VSPI_HOST; + return begin(host_in, sck, miso, mosi, f); +} +#endif - bus_cfg.max_transfer_sz = max_size; +bool SPICreate::begin(spi_host_device_t host_in, int8_t sck, int8_t miso, int8_t mosi, uint32_t f) +{ + frequency = f; - if ((mode != SPI_MODE1) && (mode != SPI_MODE3)) - { - mode = SPI_MODE3; - } + bus_cfg.sclk_io_num = sck; + bus_cfg.miso_io_num = miso; + bus_cfg.mosi_io_num = mosi; - host = (spi_bus == HSPI) ? HSPI_HOST : VSPI_HOST; - dma_chan = 1; - if (spi_bus == VSPI) - { - dma_chan = 1; - } - if (spi_bus == HSPI) - { - dma_chan = 2; - } - esp_err_t e = spi_bus_initialize(host, &bus_cfg, dma_chan); + bus_cfg.max_transfer_sz = max_size; + + esp_err_t e = spi_bus_initialize(host, &bus_cfg, SPI_DMA_CH_AUTO); if (e != ESP_OK) { // printf("[ERROR] SPI bus initialize failed : %d\n", e); @@ -69,13 +61,13 @@ bool SPICreate::end() int SPICreate::addDevice(spi_device_interface_config_t *if_cfg, int cs) { deviceNum++; - CSs[deviceNum] = cs; pinMode(cs, OUTPUT); digitalWrite(cs, HIGH); - if (deviceNum > 9) + if (deviceNum > 3) { return 0; } + if_cfg->spics_io_num = cs; esp_err_t e = spi_bus_add_device(host, if_cfg, &handle[deviceNum]); if (e != ESP_OK) { @@ -100,7 +92,6 @@ void SPICreate::sendCmd(uint8_t cmd, int deviceHandle) comm.flags = SPI_TRANS_USE_TXDATA; comm.length = 8; comm.tx_data[0] = cmd; - comm.user = (void *)CSs[deviceHandle]; pollTransmit(&comm, deviceHandle); } uint8_t SPICreate::readByte(uint8_t addr, int deviceHandle) @@ -109,7 +100,6 @@ uint8_t SPICreate::readByte(uint8_t addr, int deviceHandle) comm.flags = SPI_TRANS_USE_RXDATA | SPI_TRANS_USE_TXDATA; comm.tx_data[0] = addr; comm.length = 16; - comm.user = (void *)CSs[deviceHandle]; pollTransmit(&comm, deviceHandle); return comm.rx_data[1]; } @@ -138,9 +128,7 @@ void SPICreate::transmit(uint8_t *tx, uint8_t *rx, int size, int deviceHandle) void SPICreate::transmit(spi_transaction_t *transaction, int deviceHandle) { - digitalWrite(CSs[deviceHandle], LOW); esp_err_t e = spi_device_transmit(handle[deviceHandle], transaction); - digitalWrite(CSs[deviceHandle], HIGH); return; } void SPICreate::pollTransmit(spi_transaction_t *transaction, int deviceHandle) diff --git a/SPICREATE 2.0.0/src/SPICREATE.h b/SPICREATE 2.0.0/src/SPICREATE.h index 3ecb41c..6fb63c7 100644 --- a/SPICREATE 2.0.0/src/SPICREATE.h +++ b/SPICREATE 2.0.0/src/SPICREATE.h @@ -9,6 +9,14 @@ #include #include +#ifdef CONFIG_IDF_TARGET_ESP32S3 +#define IS_S3 1 +#elif CONFIG_IDF_TARGET_ESP32 +#define IS_S3 0 +#else +#error "No supported board specified!!!" +#endif + void csSet(spi_transaction_t *t); void csReset(spi_transaction_t *t); namespace arduino @@ -23,20 +31,36 @@ namespace arduino class SPICreate { spi_bus_config_t bus_cfg = {}; - spi_device_handle_t handle[10]; - int CSs[10]; + spi_device_handle_t handle[3]; int deviceNum{0}; +#if IS_S3 + spi_host_device_t host{SPI2_HOST}; +#else spi_host_device_t host{HSPI_HOST}; +#endif uint8_t mode{SPI_MODE3}; // must be 1 or 3 - int dma_chan{1}; // must be 1 or 2 - int max_size{4094}; // default size + int max_size{4092}; // default size uint32_t frequency{SPI_MASTER_FREQ_8M}; std::deque transactions; int queue_size{1}; public: - bool begin(uint8_t spi_bus = HSPI, int8_t sck = -1, int8_t miso = -1, int8_t mosi = -1, uint32_t f = 8000000); +#if !(IS_S3) + bool begin( + uint8_t spi_bus = HSPI, + int8_t sck = -1, + int8_t miso = -1, + int8_t mosi = -1, + uint32_t f = SPI_MASTER_FREQ_8M); +#endif + bool begin( + spi_host_device_t host_in = SPI2_HOST, + int8_t sck = -1, + int8_t miso = -1, + int8_t mosi = -1, + uint32_t f = SPI_MASTER_FREQ_8M); + bool end(); int addDevice(spi_device_interface_config_t *if_cfg, int cs); @@ -53,8 +77,8 @@ namespace arduino void pollTransmit(spi_transaction_t *transaction, int deviceHandle); }; } // dma - } // spi - } // esp32 + } // spi + } // esp32 } // arduino #ifndef SPICREATE_BEGIN From 87af37bb0c49ab3d06934f4d6709fa7bfc5aeb61 Mon Sep 17 00:00:00 2001 From: Natsu-B Date: Sat, 15 Feb 2025 13:23:05 +0900 Subject: [PATCH 2/4] [add] SPICREATE esp32 s3 support --- SPICREATE 2.0.0/src/SPICREATE.cpp | 27 +++++++++++++++------------ SPICREATE 2.0.0/src/SPICREATE.h | 4 ++-- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/SPICREATE 2.0.0/src/SPICREATE.cpp b/SPICREATE 2.0.0/src/SPICREATE.cpp index 00d2c71..52f61dc 100644 --- a/SPICREATE 2.0.0/src/SPICREATE.cpp +++ b/SPICREATE 2.0.0/src/SPICREATE.cpp @@ -8,7 +8,6 @@ void csSet(spi_transaction_t *t) /** @deprecated csセット用だったが、spi_device_interface_config_tのspics_numで代用することにした */ void csReset(spi_transaction_t *t) { - digitalWrite((int)t->user, LOW); return; } SPICREATE_BEGIN @@ -16,12 +15,6 @@ SPICREATE_BEGIN #if !(IS_S3) bool SPICreate::begin(uint8_t spi_bus, int8_t sck, int8_t miso, int8_t mosi, uint32_t f) { - if ((sck == -1) && (miso == -1) && (mosi == -1) && spi_bus == VSPI) - { - sck = SCK; - miso = MISO; - mosi = MOSI; - } spi_host_device_t host_in; host_in = (spi_bus == HSPI) ? HSPI_HOST : VSPI_HOST; return begin(host_in, sck, miso, mosi, f); @@ -31,12 +24,24 @@ bool SPICreate::begin(uint8_t spi_bus, int8_t sck, int8_t miso, int8_t mosi, uin bool SPICreate::begin(spi_host_device_t host_in, int8_t sck, int8_t miso, int8_t mosi, uint32_t f) { frequency = f; - + if ((sck == -1) && (miso == -1) && (mosi == -1)) + { +#if (IS_S3) + sck = 12; + miso = 13; + mosi = 11; +#else + sck = (host_in == VSPI_HOST) ? VSPI_IOMUX_PIN_NUM_CLK : HSPI_IOMUX_PIN_NUM_CLK; + miso = (host_in == VSPI_HOST) ? VSPI_IOMUX_PIN_NUM_MISO : HSPI_IOMUX_PIN_NUM_MISO; + mosi = (host_in == VSPI_HOST) ? VSPI_IOMUX_PIN_NUM_MOSI : HSPI_IOMUX_PIN_NUM_MOSI; +#endif + } bus_cfg.sclk_io_num = sck; bus_cfg.miso_io_num = miso; bus_cfg.mosi_io_num = mosi; - - bus_cfg.max_transfer_sz = max_size; + bus_cfg.quadwp_io_num = -1; // unused + bus_cfg.quadhd_io_num = -1; // unused + bus_cfg.max_tramosi_io_numnsfer_sz = max_size; esp_err_t e = spi_bus_initialize(host, &bus_cfg, SPI_DMA_CH_AUTO); if (e != ESP_OK) @@ -61,8 +66,6 @@ bool SPICreate::end() int SPICreate::addDevice(spi_device_interface_config_t *if_cfg, int cs) { deviceNum++; - pinMode(cs, OUTPUT); - digitalWrite(cs, HIGH); if (deviceNum > 3) { return 0; diff --git a/SPICREATE 2.0.0/src/SPICREATE.h b/SPICREATE 2.0.0/src/SPICREATE.h index 6fb63c7..f47ecda 100644 --- a/SPICREATE 2.0.0/src/SPICREATE.h +++ b/SPICREATE 2.0.0/src/SPICREATE.h @@ -38,8 +38,8 @@ namespace arduino #else spi_host_device_t host{HSPI_HOST}; #endif - uint8_t mode{SPI_MODE3}; // must be 1 or 3 - int max_size{4092}; // default size + uint8_t mode{SPI_MODE3}; // must be 1 or 3 + int max_size{SPI_MAX_DMA_LEN}; // default size uint32_t frequency{SPI_MASTER_FREQ_8M}; std::deque transactions; From d5106ae34ce691736898df08fa0736fbd716de5c Mon Sep 17 00:00:00 2001 From: Natsu-B Date: Sat, 15 Feb 2025 21:38:26 +0900 Subject: [PATCH 3/4] [fix] typo --- SPICREATE 2.0.0/src/SPICREATE.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPICREATE 2.0.0/src/SPICREATE.cpp b/SPICREATE 2.0.0/src/SPICREATE.cpp index 52f61dc..eb1adad 100644 --- a/SPICREATE 2.0.0/src/SPICREATE.cpp +++ b/SPICREATE 2.0.0/src/SPICREATE.cpp @@ -41,7 +41,7 @@ bool SPICreate::begin(spi_host_device_t host_in, int8_t sck, int8_t miso, int8_t bus_cfg.mosi_io_num = mosi; bus_cfg.quadwp_io_num = -1; // unused bus_cfg.quadhd_io_num = -1; // unused - bus_cfg.max_tramosi_io_numnsfer_sz = max_size; + bus_cfg.max_transfer_sz = max_size; esp_err_t e = spi_bus_initialize(host, &bus_cfg, SPI_DMA_CH_AUTO); if (e != ESP_OK) From 3ab42230a420799686ba2a7922155627488024d8 Mon Sep 17 00:00:00 2001 From: Natsu-B Date: Thu, 20 Feb 2025 13:08:57 +0900 Subject: [PATCH 4/4] [delete] remove unused variables --- SPICREATE 2.0.0/src/SPICREATE.cpp | 13 ++++++++----- SPICREATE 2.0.0/src/SPICREATE.h | 13 +++---------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/SPICREATE 2.0.0/src/SPICREATE.cpp b/SPICREATE 2.0.0/src/SPICREATE.cpp index eb1adad..a53d345 100644 --- a/SPICREATE 2.0.0/src/SPICREATE.cpp +++ b/SPICREATE 2.0.0/src/SPICREATE.cpp @@ -13,17 +13,20 @@ void csReset(spi_transaction_t *t) SPICREATE_BEGIN #if !(IS_S3) -bool SPICreate::begin(uint8_t spi_bus, int8_t sck, int8_t miso, int8_t mosi, uint32_t f) +/** + * @brief SPICreateを利用するときに最初に実行する関数 + * ESP32 無印のみ対応の関数としている + */ +bool SPICreate::begin(uint8_t spi_bus, int8_t sck, int8_t miso, int8_t mosi, uint32_t unused) { spi_host_device_t host_in; host_in = (spi_bus == HSPI) ? HSPI_HOST : VSPI_HOST; - return begin(host_in, sck, miso, mosi, f); + return begin(host_in, sck, miso, mosi); } #endif -bool SPICreate::begin(spi_host_device_t host_in, int8_t sck, int8_t miso, int8_t mosi, uint32_t f) +bool SPICreate::begin(spi_host_device_t host_in, int8_t sck, int8_t miso, int8_t mosi) { - frequency = f; if ((sck == -1) && (miso == -1) && (mosi == -1)) { #if (IS_S3) @@ -131,7 +134,7 @@ void SPICreate::transmit(uint8_t *tx, uint8_t *rx, int size, int deviceHandle) void SPICreate::transmit(spi_transaction_t *transaction, int deviceHandle) { - esp_err_t e = spi_device_transmit(handle[deviceHandle], transaction); + spi_device_transmit(handle[deviceHandle], transaction); return; } void SPICreate::pollTransmit(spi_transaction_t *transaction, int deviceHandle) diff --git a/SPICREATE 2.0.0/src/SPICREATE.h b/SPICREATE 2.0.0/src/SPICREATE.h index f47ecda..d7dbd51 100644 --- a/SPICREATE 2.0.0/src/SPICREATE.h +++ b/SPICREATE 2.0.0/src/SPICREATE.h @@ -4,10 +4,8 @@ #ifndef SPICREATE_Master #define SPICREATE_Master -#include -#include #include -#include +#include #ifdef CONFIG_IDF_TARGET_ESP32S3 #define IS_S3 1 @@ -40,10 +38,6 @@ namespace arduino #endif uint8_t mode{SPI_MODE3}; // must be 1 or 3 int max_size{SPI_MAX_DMA_LEN}; // default size - uint32_t frequency{SPI_MASTER_FREQ_8M}; - - std::deque transactions; - int queue_size{1}; public: #if !(IS_S3) @@ -52,14 +46,13 @@ namespace arduino int8_t sck = -1, int8_t miso = -1, int8_t mosi = -1, - uint32_t f = SPI_MASTER_FREQ_8M); + uint32_t unused = SPI_MASTER_FREQ_8M); #endif bool begin( spi_host_device_t host_in = SPI2_HOST, int8_t sck = -1, int8_t miso = -1, - int8_t mosi = -1, - uint32_t f = SPI_MASTER_FREQ_8M); + int8_t mosi = -1); bool end();