From 54b3dee7f7d01fc17d5c34dc1098dd58877ca010 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Mon, 3 Jul 2023 23:47:37 +0200 Subject: [PATCH 01/11] Remove unnecessary CMT SPI inversions --- lib/CMT2300a/cmt_spi3.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/lib/CMT2300a/cmt_spi3.c b/lib/CMT2300a/cmt_spi3.c index 95954e4e2..83f2b7892 100644 --- a/lib/CMT2300a/cmt_spi3.c +++ b/lib/CMT2300a/cmt_spi3.c @@ -63,19 +63,16 @@ void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fc }; ESP_ERROR_CHECK(spi_bus_add_device(SPI_CMT, &devcfg2, &spi_fifo)); - esp_rom_gpio_connect_out_signal(pin_sdio, spi_periph_signal[SPI_CMT].spid_out, true, false); delay(100); } -void cmt_spi3_write(uint8_t addr, uint8_t dat) +void cmt_spi3_write(uint8_t addr, uint8_t data) { - uint8_t tx_data; - tx_data = ~dat; spi_transaction_t t = { - .cmd = 1, - .addr = ~addr, + .cmd = 0, + .addr = addr, .length = 8, - .tx_buffer = &tx_data, + .tx_buffer = &data, .rx_buffer = NULL }; SPI_PARAM_LOCK(); @@ -88,9 +85,8 @@ uint8_t cmt_spi3_read(uint8_t addr) { uint8_t rx_data; spi_transaction_t t = { - .cmd = 0, - .addr = ~addr, - .length = 8, + .cmd = 1, + .addr = addr, .rxlength = 8, .tx_buffer = NULL, .rx_buffer = &rx_data @@ -104,17 +100,14 @@ uint8_t cmt_spi3_read(uint8_t addr) void cmt_spi3_write_fifo(const uint8_t* buf, uint16_t len) { - uint8_t tx_data; - spi_transaction_t t = { .length = 8, - .tx_buffer = &tx_data, // reference to write data .rx_buffer = NULL }; SPI_PARAM_LOCK(); for (uint8_t i = 0; i < len; i++) { - tx_data = ~buf[i]; // negate buffer contents + t.tx_buffer = buf + i; ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); delayMicroseconds(4); // > 4 us } @@ -123,20 +116,16 @@ void cmt_spi3_write_fifo(const uint8_t* buf, uint16_t len) void cmt_spi3_read_fifo(uint8_t* buf, uint16_t len) { - uint8_t rx_data; - spi_transaction_t t = { - .length = 8, .rxlength = 8, - .tx_buffer = NULL, - .rx_buffer = &rx_data + .tx_buffer = NULL }; SPI_PARAM_LOCK(); for (uint8_t i = 0; i < len; i++) { + t.rx_buffer = buf + i; ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); delayMicroseconds(4); // > 4 us - buf[i] = rx_data; } SPI_PARAM_UNLOCK(); } From de1b8be6967128ae116a8d588408adb5d1c857a1 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Tue, 4 Jul 2023 20:29:26 +0200 Subject: [PATCH 02/11] Implement shared nRF/CMT SPI bus --- lib/CMT2300a/cmt_spi3.c | 75 +++++---- lib/CMT2300a/cmt_spi3.h | 18 +- lib/CMT2300a/cmt_spi_patcher_handle.cpp | 27 +++ lib/CMT2300a/cmt_spi_patcher_handle.h | 25 +++ lib/Hoymiles/src/Hoymiles.cpp | 6 +- lib/Hoymiles/src/Hoymiles.h | 6 +- lib/Hoymiles/src/HoymilesRadio_NRF.cpp | 8 +- lib/Hoymiles/src/HoymilesRadio_NRF.h | 7 +- lib/Hoymiles/src/nrf_hal.cpp | 213 ++++++++++++++++++++++++ lib/Hoymiles/src/nrf_hal.h | 43 +++++ lib/Hoymiles/src/spi_patcher.cpp | 17 ++ lib/Hoymiles/src/spi_patcher.h | 43 +++++ lib/Hoymiles/src/spi_patcher_handle.cpp | 11 ++ lib/Hoymiles/src/spi_patcher_handle.h | 13 ++ platformio.ini | 4 +- src/InverterSettings.cpp | 11 +- 16 files changed, 473 insertions(+), 54 deletions(-) create mode 100644 lib/CMT2300a/cmt_spi_patcher_handle.cpp create mode 100644 lib/CMT2300a/cmt_spi_patcher_handle.h create mode 100644 lib/Hoymiles/src/nrf_hal.cpp create mode 100644 lib/Hoymiles/src/nrf_hal.h create mode 100644 lib/Hoymiles/src/spi_patcher.cpp create mode 100644 lib/Hoymiles/src/spi_patcher.h create mode 100644 lib/Hoymiles/src/spi_patcher_handle.cpp create mode 100644 lib/Hoymiles/src/spi_patcher_handle.h diff --git a/lib/CMT2300a/cmt_spi3.c b/lib/CMT2300a/cmt_spi3.c index 83f2b7892..4adcfcc3d 100644 --- a/lib/CMT2300a/cmt_spi3.c +++ b/lib/CMT2300a/cmt_spi3.c @@ -1,33 +1,25 @@ #include "cmt_spi3.h" +#include "cmt_spi_patcher_handle.h" #include -#include -#include // for esp_rom_gpio_connect_out_signal - -SemaphoreHandle_t paramLock = NULL; -#define SPI_PARAM_LOCK() \ - do { \ - } while (xSemaphoreTake(paramLock, portMAX_DELAY) != pdPASS) -#define SPI_PARAM_UNLOCK() xSemaphoreGive(paramLock) - -// for ESP32 this is the so-called HSPI -// for ESP32-S2/S3/C3 this nomenclature does not really exist anymore, -// it is simply the first externally usable hardware SPI master controller -#define SPI_CMT SPI2_HOST spi_device_handle_t spi_reg, spi_fifo; -void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed) -{ - paramLock = xSemaphoreCreateMutex(); +int8_t m_pin_sdio, m_pin_clk, m_pin_cs, m_pin_fcs; +uint32_t m_spi_speed; +void cmt_patch_spi(spi_host_device_t host_device) +{ spi_bus_config_t buscfg = { - .mosi_io_num = pin_sdio, + .mosi_io_num = m_pin_sdio, .miso_io_num = -1, // single wire MOSI/MISO - .sclk_io_num = pin_clk, + .sclk_io_num = m_pin_clk, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 32, }; + + ESP_ERROR_CHECK(spi_bus_initialize(host_device, &buscfg, SPI_DMA_DISABLED)); + spi_device_interface_config_t devcfg = { .command_bits = 1, .address_bits = 7, @@ -35,16 +27,15 @@ void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fc .mode = 0, // SPI mode 0 .cs_ena_pretrans = 1, .cs_ena_posttrans = 1, - .clock_speed_hz = spi_speed, - .spics_io_num = pin_cs, + .clock_speed_hz = (int)m_spi_speed, + .spics_io_num = m_pin_cs, .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE, .queue_size = 1, .pre_cb = NULL, .post_cb = NULL, }; - ESP_ERROR_CHECK(spi_bus_initialize(SPI_CMT, &buscfg, SPI_DMA_DISABLED)); - ESP_ERROR_CHECK(spi_bus_add_device(SPI_CMT, &devcfg, &spi_reg)); + ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg, &spi_reg)); // FiFo spi_device_interface_config_t devcfg2 = { @@ -53,17 +44,31 @@ void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fc .dummy_bits = 0, .mode = 0, // SPI mode 0 .cs_ena_pretrans = 2, - .cs_ena_posttrans = (uint8_t)(1 / (spi_speed * 10e6 * 2) + 2), // >2 us - .clock_speed_hz = spi_speed, - .spics_io_num = pin_fcs, + .cs_ena_posttrans = (uint8_t)(1 / (m_spi_speed * 10e6 * 2) + 2), // >2 us + .clock_speed_hz = (int)m_spi_speed, + .spics_io_num = m_pin_fcs, .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE, .queue_size = 1, .pre_cb = NULL, .post_cb = NULL, }; - ESP_ERROR_CHECK(spi_bus_add_device(SPI_CMT, &devcfg2, &spi_fifo)); + ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg2, &spi_fifo)); +} + +void cmt_unpatch_spi(spi_host_device_t host_device) +{ + spi_bus_remove_device(spi_reg); + spi_bus_remove_device(spi_fifo); + spi_bus_free(host_device); +} - delay(100); +void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed) +{ + m_pin_sdio = pin_sdio; + m_pin_clk = pin_clk; + m_pin_cs = pin_cs; + m_pin_fcs = pin_fcs; + m_spi_speed = spi_speed; } void cmt_spi3_write(uint8_t addr, uint8_t data) @@ -75,9 +80,9 @@ void cmt_spi3_write(uint8_t addr, uint8_t data) .tx_buffer = &data, .rx_buffer = NULL }; - SPI_PARAM_LOCK(); + cmt_request_spi(); ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); - SPI_PARAM_UNLOCK(); + cmt_release_spi(); delayMicroseconds(100); } @@ -91,9 +96,9 @@ uint8_t cmt_spi3_read(uint8_t addr) .tx_buffer = NULL, .rx_buffer = &rx_data }; - SPI_PARAM_LOCK(); + cmt_request_spi(); ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); - SPI_PARAM_UNLOCK(); + cmt_release_spi(); delayMicroseconds(100); return rx_data; } @@ -105,13 +110,13 @@ void cmt_spi3_write_fifo(const uint8_t* buf, uint16_t len) .rx_buffer = NULL }; - SPI_PARAM_LOCK(); + cmt_request_spi(); for (uint8_t i = 0; i < len; i++) { t.tx_buffer = buf + i; ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); delayMicroseconds(4); // > 4 us } - SPI_PARAM_UNLOCK(); + cmt_release_spi(); } void cmt_spi3_read_fifo(uint8_t* buf, uint16_t len) @@ -121,11 +126,11 @@ void cmt_spi3_read_fifo(uint8_t* buf, uint16_t len) .tx_buffer = NULL }; - SPI_PARAM_LOCK(); + cmt_request_spi(); for (uint8_t i = 0; i < len; i++) { t.rx_buffer = buf + i; ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); delayMicroseconds(4); // > 4 us } - SPI_PARAM_UNLOCK(); + cmt_release_spi(); } diff --git a/lib/CMT2300a/cmt_spi3.h b/lib/CMT2300a/cmt_spi3.h index 0e77e311f..5064c8368 100644 --- a/lib/CMT2300a/cmt_spi3.h +++ b/lib/CMT2300a/cmt_spi3.h @@ -1,7 +1,20 @@ #ifndef __CMT_SPI3_H #define __CMT_SPI3_H -#include +#include + +#ifdef __cplusplus + +extern "C" +{ + void cmt_patch_spi(spi_host_device_t host_device); + void cmt_unpatch_spi(spi_host_device_t host_device); +} + +#else + +void cmt_patch_spi(spi_host_device_t host_device); +void cmt_unpatch_spi(spi_host_device_t host_device); void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed); @@ -11,4 +24,7 @@ uint8_t cmt_spi3_read(uint8_t addr); void cmt_spi3_write_fifo(const uint8_t* p_buf, uint16_t len); void cmt_spi3_read_fifo(uint8_t* p_buf, uint16_t len); + +#endif + #endif diff --git a/lib/CMT2300a/cmt_spi_patcher_handle.cpp b/lib/CMT2300a/cmt_spi_patcher_handle.cpp new file mode 100644 index 000000000..f1fe875e4 --- /dev/null +++ b/lib/CMT2300a/cmt_spi_patcher_handle.cpp @@ -0,0 +1,27 @@ +#include "cmt_spi_patcher_handle.h" + +#include "cmt_spi3.h" + +#include "spi_patcher.h" + +cmt_spi_patcher_handle cmt_spi_patcher_handle_inst; + +void cmt_spi_patcher_handle::patch(spi_host_device_t host_device) +{ + cmt_patch_spi(host_device); +} + +void cmt_spi_patcher_handle::unpatch(spi_host_device_t host_device) +{ + cmt_unpatch_spi(host_device); +} + +void cmt_request_spi() +{ + spi_patcher_inst.request(&cmt_spi_patcher_handle_inst); +} + +void cmt_release_spi() +{ + spi_patcher_inst.release(); +} diff --git a/lib/CMT2300a/cmt_spi_patcher_handle.h b/lib/CMT2300a/cmt_spi_patcher_handle.h new file mode 100644 index 000000000..c64901185 --- /dev/null +++ b/lib/CMT2300a/cmt_spi_patcher_handle.h @@ -0,0 +1,25 @@ +#pragma once + +#ifdef __cplusplus + +#include "spi_patcher_handle.h" + +class cmt_spi_patcher_handle : public spi_patcher_handle +{ +public: + void patch(spi_host_device_t host_device) override; + void unpatch(spi_host_device_t host_device) override; +}; + +extern "C" +{ + void cmt_request_spi(); + void cmt_release_spi(); +} + +#else + +void cmt_request_spi(void); +void cmt_release_spi(void); + +#endif diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index e7b3d2632..03e55d92c 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -24,9 +24,9 @@ void HoymilesClass::init() _radioCmt.reset(new HoymilesRadio_CMT()); } -void HoymilesClass::initNRF(SPIClass* initialisedSpiBus, const uint8_t pinCE, const uint8_t pinIRQ) +void HoymilesClass::initNRF(nrf_hal* hal, uint8_t pinIRQ) { - _radioNrf->init(initialisedSpiBus, pinCE, pinIRQ); + _radioNrf->init(hal, pinIRQ); } void HoymilesClass::initCMT(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3) @@ -271,4 +271,4 @@ void HoymilesClass::setMessageOutput(Print* output) Print* HoymilesClass::getMessageOutput() { return _messageOutput; -} \ No newline at end of file +} diff --git a/lib/Hoymiles/src/Hoymiles.h b/lib/Hoymiles/src/Hoymiles.h index 42724e066..6c6d11d69 100644 --- a/lib/Hoymiles/src/Hoymiles.h +++ b/lib/Hoymiles/src/Hoymiles.h @@ -16,8 +16,8 @@ class HoymilesClass { public: void init(); - void initNRF(SPIClass* initialisedSpiBus, const uint8_t pinCE, const uint8_t pinIRQ); - void initCMT(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3); + void initNRF(nrf_hal* hal, uint8_t pinIRQ); + void initCMT(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, int8_t pin_gpio2, int8_t pin_gpio3); void loop(); void setMessageOutput(Print* output); @@ -51,4 +51,4 @@ class HoymilesClass { Print* _messageOutput = &Serial; }; -extern HoymilesClass Hoymiles; \ No newline at end of file +extern HoymilesClass Hoymiles; diff --git a/lib/Hoymiles/src/HoymilesRadio_NRF.cpp b/lib/Hoymiles/src/HoymilesRadio_NRF.cpp index 4bf104ade..60d9a0f99 100644 --- a/lib/Hoymiles/src/HoymilesRadio_NRF.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_NRF.cpp @@ -8,14 +8,14 @@ #include #include -void HoymilesRadio_NRF::init(SPIClass* initialisedSpiBus, const uint8_t pinCE, const uint8_t pinIRQ) +void HoymilesRadio_NRF::init(nrf_hal* hal, uint8_t pinIRQ) { _dtuSerial.u64 = 0; - _spiPtr.reset(initialisedSpiBus); - _radio.reset(new RF24(pinCE, initialisedSpiBus->pinSS())); + _hal.reset(hal); + _radio.reset(new RF24(hal)); - _radio->begin(_spiPtr.get()); + _radio->begin(); _radio->setDataRate(RF24_250KBPS); _radio->enableDynamicPayloads(); diff --git a/lib/Hoymiles/src/HoymilesRadio_NRF.h b/lib/Hoymiles/src/HoymilesRadio_NRF.h index a6777ce52..bac4086e6 100644 --- a/lib/Hoymiles/src/HoymilesRadio_NRF.h +++ b/lib/Hoymiles/src/HoymilesRadio_NRF.h @@ -7,13 +7,14 @@ #include #include #include +#include "nrf_hal.h" // number of fragments hold in buffer #define FRAGMENT_BUFFER_SIZE 30 class HoymilesRadio_NRF : public HoymilesRadio { public: - void init(SPIClass* initialisedSpiBus, const uint8_t pinCE, const uint8_t pinIRQ); + void init(nrf_hal* hal, uint8_t pinIRQ); void loop(); void setPALevel(const rf24_pa_dbm_e paLevel); @@ -32,7 +33,7 @@ class HoymilesRadio_NRF : public HoymilesRadio { void sendEsbPacket(CommandAbstract& cmd); - std::unique_ptr _spiPtr; + std::unique_ptr _hal; std::unique_ptr _radio; uint8_t _rxChLst[5] = { 3, 23, 40, 61, 75 }; uint8_t _rxChIdx = 0; @@ -43,4 +44,4 @@ class HoymilesRadio_NRF : public HoymilesRadio { volatile bool _packetReceived = false; std::queue _rxBuffer; -}; \ No newline at end of file +}; diff --git a/lib/Hoymiles/src/nrf_hal.cpp b/lib/Hoymiles/src/nrf_hal.cpp new file mode 100644 index 000000000..4034ba4a7 --- /dev/null +++ b/lib/Hoymiles/src/nrf_hal.cpp @@ -0,0 +1,213 @@ +#include "nrf_hal.h" + +#define NRF_MAX_TRANSFER_SZ 64 + +nrf_hal::nrf_hal(gpio_num_t pin_mosi, gpio_num_t pin_miso, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_en) : + pin_mosi(pin_mosi), + pin_miso(pin_miso), + pin_clk(pin_clk), + pin_cs(pin_cs), + pin_en(pin_en) +{ + +} + +void nrf_hal::patch(spi_host_device_t host_device) +{ + gpio_hold_en(pin_cs); + + gpio_reset_pin(pin_cs); + + spi_bus_config_t buscfg = { + .mosi_io_num = pin_mosi, + .miso_io_num = pin_miso, + .sclk_io_num = pin_clk, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + .max_transfer_sz = NRF_MAX_TRANSFER_SZ, + .flags = 0, + .intr_flags = 0 + }; + ESP_ERROR_CHECK(spi_bus_initialize(host_device, &buscfg, SPI_DMA_DISABLED)); + + spi_device_interface_config_t devcfg = { + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .mode = 0, + .duty_cycle_pos = 0, + .cs_ena_pretrans = 1, + .cs_ena_posttrans = 1, + .clock_speed_hz = 10000000, + .input_delay_ns = 0, + .spics_io_num = pin_cs, + .flags = 0, + .queue_size = 1, + .pre_cb = NULL, + .post_cb = NULL + }; + ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg, &spi)); + + gpio_hold_dis(pin_cs); +} + +void nrf_hal::unpatch(spi_host_device_t host_device) +{ + gpio_hold_en(pin_cs); + + ESP_ERROR_CHECK(spi_bus_remove_device(spi)); + ESP_ERROR_CHECK(spi_bus_free(host_device)); + + gpio_reset_pin(pin_cs); + gpio_set_direction(pin_cs, GPIO_MODE_OUTPUT); + gpio_set_level(pin_cs, 1); + + gpio_hold_dis(pin_cs); +} + +bool nrf_hal::begin() +{ + gpio_reset_pin(pin_cs); + gpio_set_direction(pin_cs, GPIO_MODE_OUTPUT); + gpio_set_level(pin_cs, 1); + + gpio_reset_pin(pin_en); + gpio_set_direction(pin_en, GPIO_MODE_OUTPUT); + gpio_set_level(pin_en, 0); + + return true; +} + +void nrf_hal::end() +{ + +} + +void nrf_hal::ce(bool level) +{ + gpio_set_level(pin_en, level); +} + +uint8_t nrf_hal::write(uint8_t cmd, const uint8_t* buf, uint8_t len) +{ + uint8_t data[NRF_MAX_TRANSFER_SZ]; + data[0] = cmd; + for (size_t i = 0; i < len; ++i) { + data[i + 1] = buf[i]; + } + + request_spi(); + + spi_transaction_t t = { + .flags = 0, + .cmd = 0, + .addr = 0, + .length = ((size_t)len + 1u) << 3, + .rxlength = ((size_t)len + 1u) << 3, + .user = NULL, + .tx_buffer = data, + .rx_buffer = data + }; + ESP_ERROR_CHECK(spi_device_polling_transmit(spi, &t)); + + release_spi(); + + return data[0]; // status +} + +uint8_t nrf_hal::write(uint8_t cmd, const uint8_t* buf, uint8_t data_len, uint8_t blank_len) +{ + uint8_t data[NRF_MAX_TRANSFER_SZ]; + data[0] = cmd; + for (size_t i = 0; i < data_len; ++i) { + data[i + 1u] = buf[i]; + } + for (size_t i = 0; i < blank_len; ++i) { + data[i + data_len + 1u] = 0; + } + + request_spi(); + + spi_transaction_t t = { + .flags = 0, + .cmd = 0, + .addr = 0, + .length = ((size_t)data_len + blank_len + 1u) << 3, + .rxlength = ((size_t)data_len + blank_len + 1u) << 3, + .user = NULL, + .tx_buffer = data, + .rx_buffer = data + }; + ESP_ERROR_CHECK(spi_device_polling_transmit(spi, &t)); + + release_spi(); + + return data[0]; // status +} + +uint8_t nrf_hal::read(uint8_t cmd, uint8_t* buf, uint8_t len) +{ + uint8_t data[NRF_MAX_TRANSFER_SZ]; + data[0] = cmd; + for (size_t i = 0; i < len; ++i) { + data[i + 1u] = 0xff; + } + + request_spi(); + + spi_transaction_t t = { + .flags = 0, + .cmd = 0, + .addr = 0, + .length = ((size_t)len + 1u) << 3, + .rxlength = ((size_t)len + 1u) << 3, + .user = NULL, + .tx_buffer = data, + .rx_buffer = data + }; + ESP_ERROR_CHECK(spi_device_polling_transmit(spi, &t)); + + release_spi(); + + for (size_t i = 0; i < len; ++i) { + buf[i] = data[i + 1u]; + } + return data[0]; // status +} + +uint8_t nrf_hal::read(uint8_t cmd, uint8_t* buf, uint8_t data_len, uint8_t blank_len) +{ + uint8_t data[NRF_MAX_TRANSFER_SZ]; + data[0] = cmd; + for (size_t i = 0; i < data_len; ++i) { + data[i + 1u] = 0xff; + } + for (size_t i = 0; i < blank_len; ++i) { + data[i + data_len + 1u] = 0xff; + } + + request_spi(); + + spi_transaction_t t = { + .flags = 0, + .cmd = 0, + .addr = 0, + .length = ((size_t)data_len + blank_len + 1u) << 3, + .rxlength = ((size_t)data_len + blank_len + 1u) << 3, + .user = NULL, + .tx_buffer = data, + .rx_buffer = data + }; + ESP_ERROR_CHECK(spi_device_polling_transmit(spi, &t)); + + release_spi(); + + for (size_t i = 0; i < data_len; ++i) { + buf[i] = data[i + 1u]; + } + return data[0]; // status +} diff --git a/lib/Hoymiles/src/nrf_hal.h b/lib/Hoymiles/src/nrf_hal.h new file mode 100644 index 000000000..ac46a1109 --- /dev/null +++ b/lib/Hoymiles/src/nrf_hal.h @@ -0,0 +1,43 @@ +#pragma once + +#include "spi_patcher.h" + +#include +#include + +class nrf_hal : public RF24_hal, public spi_patcher_handle +{ +public: + nrf_hal(gpio_num_t pin_mosi, gpio_num_t pin_miso, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_en); + + void patch(spi_host_device_t host_device) override; + void unpatch(spi_host_device_t host_device) override; + + inline void request_spi() + { + spi_patcher_inst.request(this); + } + + inline void release_spi() + { + spi_patcher_inst.release(); + } + + bool begin() override; + void end() override; + + void ce(bool level) override; + uint8_t write(uint8_t cmd, const uint8_t* buf, uint8_t len) override; + uint8_t write(uint8_t cmd, const uint8_t* buf, uint8_t data_len, uint8_t blank_len) override; + uint8_t read(uint8_t cmd, uint8_t* buf, uint8_t len) override; + uint8_t read(uint8_t cmd, uint8_t* buf, uint8_t data_len, uint8_t blank_len) override; + +private: + const gpio_num_t pin_mosi; + const gpio_num_t pin_miso; + const gpio_num_t pin_clk; + const gpio_num_t pin_cs; + const gpio_num_t pin_en; + + spi_device_handle_t spi; +}; diff --git a/lib/Hoymiles/src/spi_patcher.cpp b/lib/Hoymiles/src/spi_patcher.cpp new file mode 100644 index 000000000..2bc6a19a7 --- /dev/null +++ b/lib/Hoymiles/src/spi_patcher.cpp @@ -0,0 +1,17 @@ +#include "spi_patcher.h" + +spi_patcher spi_patcher_inst(SPI2_HOST); + +spi_patcher::spi_patcher(spi_host_device_t host_device) : + host_device(host_device), + cur_handle(nullptr) +{ + // Use binary semaphore instead of mutex for performance reasons + mutex = xSemaphoreCreateBinaryStatic(&mutex_buffer); + xSemaphoreGive(mutex); +} + +spi_patcher::~spi_patcher() +{ + vSemaphoreDelete(mutex); +} diff --git a/lib/Hoymiles/src/spi_patcher.h b/lib/Hoymiles/src/spi_patcher.h new file mode 100644 index 000000000..daca0d34a --- /dev/null +++ b/lib/Hoymiles/src/spi_patcher.h @@ -0,0 +1,43 @@ +#pragma once + +#include "spi_patcher_handle.h" + +#include + +#include + +class spi_patcher +{ +public: + spi_patcher(spi_host_device_t host_device); + ~spi_patcher(); + + inline void request(spi_patcher_handle* handle) + { + xSemaphoreTake(mutex, portMAX_DELAY); + + if (cur_handle != handle) { + if (cur_handle) { + cur_handle->unpatch(host_device); + } + cur_handle = handle; + if (cur_handle) { + cur_handle->patch(host_device); + } + } + } + + inline void release() + { + xSemaphoreGive(mutex); + } + +private: + const spi_host_device_t host_device; + spi_patcher_handle* cur_handle; + + SemaphoreHandle_t mutex; + StaticSemaphore_t mutex_buffer; +}; + +extern spi_patcher spi_patcher_inst; diff --git a/lib/Hoymiles/src/spi_patcher_handle.cpp b/lib/Hoymiles/src/spi_patcher_handle.cpp new file mode 100644 index 000000000..de59c858c --- /dev/null +++ b/lib/Hoymiles/src/spi_patcher_handle.cpp @@ -0,0 +1,11 @@ +#include "spi_patcher_handle.h" + +spi_patcher_handle::spi_patcher_handle() +{ + +} + +spi_patcher_handle::~spi_patcher_handle() +{ + +} diff --git a/lib/Hoymiles/src/spi_patcher_handle.h b/lib/Hoymiles/src/spi_patcher_handle.h new file mode 100644 index 000000000..09c284d43 --- /dev/null +++ b/lib/Hoymiles/src/spi_patcher_handle.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +class spi_patcher_handle +{ +public: + spi_patcher_handle(); + virtual ~spi_patcher_handle(); + + virtual void patch(spi_host_device_t host_device) = 0; + virtual void unpatch(spi_host_device_t host_device) = 0; +}; diff --git a/platformio.ini b/platformio.ini index 019ee67cd..99139f06f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -38,7 +38,7 @@ lib_deps = https://github.com/yubox-node-org/ESPAsyncWebServer bblanchon/ArduinoJson @ ^6.21.4 https://github.com/bertmelis/espMqttClient.git#v1.5.0 - nrf24/RF24 @ ^1.4.8 + https://github.com/LennartF22/RF24.git#f59f649 olikraus/U8g2 @ ^2.35.9 buelowp/sunset @ ^1.1.7 https://github.com/arkhipenko/TaskScheduler#testing @@ -233,4 +233,4 @@ build_flags = ${env.build_flags} -DCMT_GPIO3=8 -DCMT_SDIO=5 -DARDUINO_USB_MODE=1 - -DARDUINO_USB_CDC_ON_BOOT=1 \ No newline at end of file + -DARDUINO_USB_CDC_ON_BOOT=1 diff --git a/src/InverterSettings.cpp b/src/InverterSettings.cpp index 506adacc9..41e6cd748 100644 --- a/src/InverterSettings.cpp +++ b/src/InverterSettings.cpp @@ -38,9 +38,14 @@ void InverterSettingsClass::init(Scheduler& scheduler) if (PinMapping.isValidNrf24Config() || PinMapping.isValidCmt2300Config()) { if (PinMapping.isValidNrf24Config()) { - SPIClass* spiClass = new SPIClass(SPI_NRF); - spiClass->begin(pin.nrf24_clk, pin.nrf24_miso, pin.nrf24_mosi, pin.nrf24_cs); - Hoymiles.initNRF(spiClass, pin.nrf24_en, pin.nrf24_irq); + nrf_hal* hal = new nrf_hal( + static_cast(pin.nrf24_mosi), + static_cast(pin.nrf24_miso), + static_cast(pin.nrf24_clk), + static_cast(pin.nrf24_cs), + static_cast(pin.nrf24_en) + ); + Hoymiles.initNRF(hal, pin.nrf24_irq); } if (PinMapping.isValidCmt2300Config()) { From 81063432e9429b815a26c233e50480e1b20c52f4 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Sat, 8 Jul 2023 22:39:08 +0200 Subject: [PATCH 03/11] Rewrite CMT HAL --- .../{cmt2300a_hal.c => cmt2300a_hal.cpp} | 159 ++++++------- lib/CMT2300a/cmt_hal.cpp | 209 ++++++++++++++++++ lib/CMT2300a/cmt_hal.h | 41 ++++ lib/CMT2300a/cmt_spi3.c | 136 ------------ lib/CMT2300a/cmt_spi3.h | 30 --- lib/CMT2300a/cmt_spi_patcher_handle.cpp | 27 --- lib/CMT2300a/cmt_spi_patcher_handle.h | 25 --- lib/Hoymiles/src/nrf_hal.h | 23 +- lib/Hoymiles/src/spi_patcher.cpp | 4 +- lib/Hoymiles/src/spi_patcher.h | 2 - 10 files changed, 347 insertions(+), 309 deletions(-) rename lib/CMT2300a/{cmt2300a_hal.c => cmt2300a_hal.cpp} (86%) create mode 100644 lib/CMT2300a/cmt_hal.cpp create mode 100644 lib/CMT2300a/cmt_hal.h delete mode 100644 lib/CMT2300a/cmt_spi3.c delete mode 100644 lib/CMT2300a/cmt_spi3.h delete mode 100644 lib/CMT2300a/cmt_spi_patcher_handle.cpp delete mode 100644 lib/CMT2300a/cmt_spi_patcher_handle.h diff --git a/lib/CMT2300a/cmt2300a_hal.c b/lib/CMT2300a/cmt2300a_hal.cpp similarity index 86% rename from lib/CMT2300a/cmt2300a_hal.c rename to lib/CMT2300a/cmt2300a_hal.cpp index 7bf1b60ff..52fd2bd98 100644 --- a/lib/CMT2300a/cmt2300a_hal.c +++ b/lib/CMT2300a/cmt2300a_hal.cpp @@ -1,76 +1,83 @@ -/* - * THE FOLLOWING FIRMWARE IS PROVIDED: (1) "AS IS" WITH NO WARRANTY; AND - * (2)TO ENABLE ACCESS TO CODING INFORMATION TO GUIDE AND FACILITATE CUSTOMER. - * CONSEQUENTLY, CMOSTEK SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR - * CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT - * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION - * CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - * Copyright (C) CMOSTEK SZ. - */ - -/*! - * @file cmt2300a_hal.c - * @brief CMT2300A hardware abstraction layer - * - * @version 1.2 - * @date Jul 17 2017 - * @author CMOSTEK R@D - */ - -#include "cmt2300a_hal.h" -#include "cmt_spi3.h" -#include - -/*! ******************************************************** - * @name CMT2300A_InitSpi - * @desc Initializes the CMT2300A SPI interface. - * *********************************************************/ -void CMT2300A_InitSpi(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed) -{ - cmt_spi3_init(pin_sdio, pin_clk, pin_cs, pin_fcs, spi_speed); -} - -/*! ******************************************************** - * @name CMT2300A_ReadReg - * @desc Read the CMT2300A register at the specified address. - * @param addr: register address - * @return Register value - * *********************************************************/ -uint8_t CMT2300A_ReadReg(uint8_t addr) -{ - return cmt_spi3_read(addr); -} - -/*! ******************************************************** - * @name CMT2300A_WriteReg - * @desc Write the CMT2300A register at the specified address. - * @param addr: register address - * dat: register value - * *********************************************************/ -void CMT2300A_WriteReg(uint8_t addr, uint8_t dat) -{ - cmt_spi3_write(addr, dat); -} - -/*! ******************************************************** - * @name CMT2300A_ReadFifo - * @desc Reads the contents of the CMT2300A FIFO. - * @param buf: buffer where to copy the FIFO read data - * len: number of bytes to be read from the FIFO - * *********************************************************/ -void CMT2300A_ReadFifo(uint8_t buf[], uint16_t len) -{ - cmt_spi3_read_fifo(buf, len); -} - -/*! ******************************************************** - * @name CMT2300A_WriteFifo - * @desc Writes the buffer contents to the CMT2300A FIFO. - * @param buf: buffer containing data to be put on the FIFO - * len: number of bytes to be written to the FIFO - * *********************************************************/ -void CMT2300A_WriteFifo(const uint8_t buf[], uint16_t len) -{ - cmt_spi3_write_fifo(buf, len); -} +/* + * THE FOLLOWING FIRMWARE IS PROVIDED: (1) "AS IS" WITH NO WARRANTY; AND + * (2)TO ENABLE ACCESS TO CODING INFORMATION TO GUIDE AND FACILITATE CUSTOMER. + * CONSEQUENTLY, CMOSTEK SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR + * CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT + * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION + * CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + * Copyright (C) CMOSTEK SZ. + */ + +/*! + * @file cmt2300a_hal.c + * @brief CMT2300A hardware abstraction layer + * + * @version 1.2 + * @date Jul 17 2017 + * @author CMOSTEK R@D + */ + +#include "cmt2300a_hal.h" +#include "cmt_hal.h" + +static cmt_hal hal; + +/*! ******************************************************** + * @name CMT2300A_InitSpi + * @desc Initializes the CMT2300A SPI interface. + * *********************************************************/ +void CMT2300A_InitSpi(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed) +{ + hal.init( + static_cast(pin_sdio), + static_cast(pin_clk), + static_cast(pin_cs), + static_cast(pin_fcs), + spi_speed + ); +} + +/*! ******************************************************** + * @name CMT2300A_ReadReg + * @desc Read the CMT2300A register at the specified address. + * @param addr: register address + * @return Register value + * *********************************************************/ +uint8_t CMT2300A_ReadReg(uint8_t addr) +{ + return hal.read_reg(addr); +} + +/*! ******************************************************** + * @name CMT2300A_WriteReg + * @desc Write the CMT2300A register at the specified address. + * @param addr: register address + * dat: register value + * *********************************************************/ +void CMT2300A_WriteReg(uint8_t addr, uint8_t dat) +{ + hal.write_reg(addr, dat); +} + +/*! ******************************************************** + * @name CMT2300A_ReadFifo + * @desc Reads the contents of the CMT2300A FIFO. + * @param buf: buffer where to copy the FIFO read data + * len: number of bytes to be read from the FIFO + * *********************************************************/ +void CMT2300A_ReadFifo(uint8_t buf[], uint16_t len) +{ + hal.read_fifo(buf, len); +} + +/*! ******************************************************** + * @name CMT2300A_WriteFifo + * @desc Writes the buffer contents to the CMT2300A FIFO. + * @param buf: buffer containing data to be put on the FIFO + * len: number of bytes to be written to the FIFO + * *********************************************************/ +void CMT2300A_WriteFifo(const uint8_t buf[], uint16_t len) +{ + hal.write_fifo(buf, len); +} diff --git a/lib/CMT2300a/cmt_hal.cpp b/lib/CMT2300a/cmt_hal.cpp new file mode 100644 index 000000000..367c349c3 --- /dev/null +++ b/lib/CMT2300a/cmt_hal.cpp @@ -0,0 +1,209 @@ +#include "cmt_hal.h" + +#include + +#define CMT_MAX_TRANSFER_SZ 32 + +cmt_hal::cmt_hal() : + pin_sdio(GPIO_NUM_NC), + pin_clk(GPIO_NUM_NC), + pin_cs(GPIO_NUM_NC), + pin_fcs(GPIO_NUM_NC), + spi_speed(1000000) +{ + +} + +void cmt_hal::patch(spi_host_device_t host_device) +{ + gpio_hold_en(pin_cs); + gpio_hold_en(pin_fcs); + + gpio_reset_pin(pin_cs); + gpio_reset_pin(pin_fcs); + + spi_bus_config_t buscfg = { + .mosi_io_num = pin_sdio, + .miso_io_num = -1, // Single wire MOSI/MISO + .sclk_io_num = pin_clk, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + .max_transfer_sz = CMT_MAX_TRANSFER_SZ, + .flags = 0, + .intr_flags = 0 + }; + ESP_ERROR_CHECK(spi_bus_initialize(host_device, &buscfg, SPI_DMA_DISABLED)); + + spi_device_interface_config_t devcfg_reg = { + .command_bits = 1, + .address_bits = 7, + .dummy_bits = 0, + .mode = 0, // SPI mode 0 + .duty_cycle_pos = 0, + .cs_ena_pretrans = 1, + .cs_ena_posttrans = 1, + .clock_speed_hz = spi_speed, + .input_delay_ns = 0, + .spics_io_num = pin_cs, + .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE, + .queue_size = 1, + .pre_cb = NULL, + .post_cb = NULL + }; + ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg_reg, &spi_reg)); + + spi_device_interface_config_t devcfg_fifo = { + .command_bits = 0, + .address_bits = 0, + .dummy_bits = 0, + .mode = 0, // SPI mode 0 + .duty_cycle_pos = 0, + .cs_ena_pretrans = 2, + .cs_ena_posttrans = (uint8_t)(1 / (spi_speed * 10e6 * 2) + 2), // >2 us + .clock_speed_hz = spi_speed, + .input_delay_ns = 0, + .spics_io_num = pin_fcs, + .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE, + .queue_size = 1, + .pre_cb = NULL, + .post_cb = NULL + }; + ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg_fifo, &spi_fifo)); + + gpio_hold_dis(pin_cs); + gpio_hold_dis(pin_fcs); +} + +void cmt_hal::unpatch(spi_host_device_t host_device) +{ + gpio_hold_en(pin_cs); + gpio_hold_en(pin_fcs); + + spi_bus_remove_device(spi_reg); + spi_bus_remove_device(spi_fifo); + spi_bus_free(host_device); + + gpio_reset_pin(pin_cs); + gpio_set_direction(pin_cs, GPIO_MODE_OUTPUT); + gpio_set_level(pin_cs, 1); + + gpio_reset_pin(pin_fcs); + gpio_set_direction(pin_fcs, GPIO_MODE_OUTPUT); + gpio_set_level(pin_fcs, 1); + + gpio_hold_dis(pin_cs); + gpio_hold_dis(pin_fcs); +} + +void cmt_hal::init(gpio_num_t _pin_sdio, gpio_num_t _pin_clk, gpio_num_t _pin_cs, gpio_num_t _pin_fcs, int32_t _spi_speed) +{ + pin_sdio = _pin_sdio; + pin_clk = _pin_clk; + pin_cs = _pin_cs; + pin_fcs = _pin_fcs; + spi_speed = _spi_speed; + + gpio_reset_pin(pin_cs); + gpio_set_direction(pin_cs, GPIO_MODE_OUTPUT); + gpio_set_level(pin_cs, 1); + + gpio_reset_pin(pin_fcs); + gpio_set_direction(pin_fcs, GPIO_MODE_OUTPUT); + gpio_set_level(pin_fcs, 1); +} + +uint8_t cmt_hal::read_reg(uint8_t addr) +{ + uint8_t data; + + request_spi(); + + spi_transaction_t t = { + .flags = 0, + .cmd = 1, + .addr = addr, + .length = 0, + .rxlength = 8, + .user = NULL, + .tx_buffer = NULL, + .rx_buffer = &data + }; + ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); + + release_spi(); + + delayMicroseconds(100); + + return data; +} + +void cmt_hal::write_reg(uint8_t addr, uint8_t data) +{ + request_spi(); + + spi_transaction_t t = { + .flags = 0, + .cmd = 0, + .addr = addr, + .length = 8, + .rxlength = 0, + .user = NULL, + .tx_buffer = &data, + .rx_buffer = NULL + }; + ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); + + release_spi(); + + delayMicroseconds(100); +} + +void cmt_hal::read_fifo(uint8_t* buf, uint16_t len) +{ + request_spi(); + + spi_transaction_t t = { + .flags = 0, + .cmd = 0, + .addr = 0, + .length = 0, + .rxlength = 8, + .user = NULL, + .tx_buffer = NULL, + .rx_buffer = NULL + }; + for (uint16_t i = 0; i < len; i++) { + t.rx_buffer = buf + i; + ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); + delayMicroseconds(4); // > 4 us + } + + release_spi(); +} + +void cmt_hal::write_fifo(const uint8_t* buf, uint16_t len) +{ + request_spi(); + + spi_transaction_t t = { + .flags = 0, + .cmd = 0, + .addr = 0, + .length = 8, + .rxlength = 0, + .user = NULL, + .tx_buffer = NULL, + .rx_buffer = NULL + }; + for (uint16_t i = 0; i < len; i++) { + t.tx_buffer = buf + i; + ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); + delayMicroseconds(4); // > 4 us + } + + release_spi(); +} diff --git a/lib/CMT2300a/cmt_hal.h b/lib/CMT2300a/cmt_hal.h new file mode 100644 index 000000000..756b08f43 --- /dev/null +++ b/lib/CMT2300a/cmt_hal.h @@ -0,0 +1,41 @@ +#pragma once + +#include "spi_patcher.h" + +#include + +class cmt_hal : public spi_patcher_handle +{ +public: + cmt_hal(); + + void patch(spi_host_device_t host_device) override; + void unpatch(spi_host_device_t host_device) override; + + void init(gpio_num_t pin_sdio, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_fcs, int32_t spi_speed); + + uint8_t read_reg(uint8_t addr); + void write_reg(uint8_t addr, uint8_t data); + void read_fifo(uint8_t* buf, uint16_t len); + void write_fifo(const uint8_t* buf, uint16_t len); + +private: + inline void request_spi() + { + spi_patcher_inst.request(this); + } + + inline void release_spi() + { + spi_patcher_inst.release(); + } + + gpio_num_t pin_sdio; + gpio_num_t pin_clk; + gpio_num_t pin_cs; + gpio_num_t pin_fcs; + int32_t spi_speed; + + spi_device_handle_t spi_reg; + spi_device_handle_t spi_fifo; +}; diff --git a/lib/CMT2300a/cmt_spi3.c b/lib/CMT2300a/cmt_spi3.c deleted file mode 100644 index 4adcfcc3d..000000000 --- a/lib/CMT2300a/cmt_spi3.c +++ /dev/null @@ -1,136 +0,0 @@ -#include "cmt_spi3.h" -#include "cmt_spi_patcher_handle.h" -#include - -spi_device_handle_t spi_reg, spi_fifo; - -int8_t m_pin_sdio, m_pin_clk, m_pin_cs, m_pin_fcs; -uint32_t m_spi_speed; - -void cmt_patch_spi(spi_host_device_t host_device) -{ - spi_bus_config_t buscfg = { - .mosi_io_num = m_pin_sdio, - .miso_io_num = -1, // single wire MOSI/MISO - .sclk_io_num = m_pin_clk, - .quadwp_io_num = -1, - .quadhd_io_num = -1, - .max_transfer_sz = 32, - }; - - ESP_ERROR_CHECK(spi_bus_initialize(host_device, &buscfg, SPI_DMA_DISABLED)); - - spi_device_interface_config_t devcfg = { - .command_bits = 1, - .address_bits = 7, - .dummy_bits = 0, - .mode = 0, // SPI mode 0 - .cs_ena_pretrans = 1, - .cs_ena_posttrans = 1, - .clock_speed_hz = (int)m_spi_speed, - .spics_io_num = m_pin_cs, - .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE, - .queue_size = 1, - .pre_cb = NULL, - .post_cb = NULL, - }; - - ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg, &spi_reg)); - - // FiFo - spi_device_interface_config_t devcfg2 = { - .command_bits = 0, - .address_bits = 0, - .dummy_bits = 0, - .mode = 0, // SPI mode 0 - .cs_ena_pretrans = 2, - .cs_ena_posttrans = (uint8_t)(1 / (m_spi_speed * 10e6 * 2) + 2), // >2 us - .clock_speed_hz = (int)m_spi_speed, - .spics_io_num = m_pin_fcs, - .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE, - .queue_size = 1, - .pre_cb = NULL, - .post_cb = NULL, - }; - ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg2, &spi_fifo)); -} - -void cmt_unpatch_spi(spi_host_device_t host_device) -{ - spi_bus_remove_device(spi_reg); - spi_bus_remove_device(spi_fifo); - spi_bus_free(host_device); -} - -void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed) -{ - m_pin_sdio = pin_sdio; - m_pin_clk = pin_clk; - m_pin_cs = pin_cs; - m_pin_fcs = pin_fcs; - m_spi_speed = spi_speed; -} - -void cmt_spi3_write(uint8_t addr, uint8_t data) -{ - spi_transaction_t t = { - .cmd = 0, - .addr = addr, - .length = 8, - .tx_buffer = &data, - .rx_buffer = NULL - }; - cmt_request_spi(); - ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); - cmt_release_spi(); - delayMicroseconds(100); -} - -uint8_t cmt_spi3_read(uint8_t addr) -{ - uint8_t rx_data; - spi_transaction_t t = { - .cmd = 1, - .addr = addr, - .rxlength = 8, - .tx_buffer = NULL, - .rx_buffer = &rx_data - }; - cmt_request_spi(); - ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); - cmt_release_spi(); - delayMicroseconds(100); - return rx_data; -} - -void cmt_spi3_write_fifo(const uint8_t* buf, uint16_t len) -{ - spi_transaction_t t = { - .length = 8, - .rx_buffer = NULL - }; - - cmt_request_spi(); - for (uint8_t i = 0; i < len; i++) { - t.tx_buffer = buf + i; - ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); - delayMicroseconds(4); // > 4 us - } - cmt_release_spi(); -} - -void cmt_spi3_read_fifo(uint8_t* buf, uint16_t len) -{ - spi_transaction_t t = { - .rxlength = 8, - .tx_buffer = NULL - }; - - cmt_request_spi(); - for (uint8_t i = 0; i < len; i++) { - t.rx_buffer = buf + i; - ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); - delayMicroseconds(4); // > 4 us - } - cmt_release_spi(); -} diff --git a/lib/CMT2300a/cmt_spi3.h b/lib/CMT2300a/cmt_spi3.h deleted file mode 100644 index 5064c8368..000000000 --- a/lib/CMT2300a/cmt_spi3.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __CMT_SPI3_H -#define __CMT_SPI3_H - -#include - -#ifdef __cplusplus - -extern "C" -{ - void cmt_patch_spi(spi_host_device_t host_device); - void cmt_unpatch_spi(spi_host_device_t host_device); -} - -#else - -void cmt_patch_spi(spi_host_device_t host_device); -void cmt_unpatch_spi(spi_host_device_t host_device); - -void cmt_spi3_init(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed); - -void cmt_spi3_write(uint8_t addr, uint8_t dat); -uint8_t cmt_spi3_read(uint8_t addr); - -void cmt_spi3_write_fifo(const uint8_t* p_buf, uint16_t len); -void cmt_spi3_read_fifo(uint8_t* p_buf, uint16_t len); - - -#endif - -#endif diff --git a/lib/CMT2300a/cmt_spi_patcher_handle.cpp b/lib/CMT2300a/cmt_spi_patcher_handle.cpp deleted file mode 100644 index f1fe875e4..000000000 --- a/lib/CMT2300a/cmt_spi_patcher_handle.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "cmt_spi_patcher_handle.h" - -#include "cmt_spi3.h" - -#include "spi_patcher.h" - -cmt_spi_patcher_handle cmt_spi_patcher_handle_inst; - -void cmt_spi_patcher_handle::patch(spi_host_device_t host_device) -{ - cmt_patch_spi(host_device); -} - -void cmt_spi_patcher_handle::unpatch(spi_host_device_t host_device) -{ - cmt_unpatch_spi(host_device); -} - -void cmt_request_spi() -{ - spi_patcher_inst.request(&cmt_spi_patcher_handle_inst); -} - -void cmt_release_spi() -{ - spi_patcher_inst.release(); -} diff --git a/lib/CMT2300a/cmt_spi_patcher_handle.h b/lib/CMT2300a/cmt_spi_patcher_handle.h deleted file mode 100644 index c64901185..000000000 --- a/lib/CMT2300a/cmt_spi_patcher_handle.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#ifdef __cplusplus - -#include "spi_patcher_handle.h" - -class cmt_spi_patcher_handle : public spi_patcher_handle -{ -public: - void patch(spi_host_device_t host_device) override; - void unpatch(spi_host_device_t host_device) override; -}; - -extern "C" -{ - void cmt_request_spi(); - void cmt_release_spi(); -} - -#else - -void cmt_request_spi(void); -void cmt_release_spi(void); - -#endif diff --git a/lib/Hoymiles/src/nrf_hal.h b/lib/Hoymiles/src/nrf_hal.h index ac46a1109..430d5708c 100644 --- a/lib/Hoymiles/src/nrf_hal.h +++ b/lib/Hoymiles/src/nrf_hal.h @@ -3,7 +3,6 @@ #include "spi_patcher.h" #include -#include class nrf_hal : public RF24_hal, public spi_patcher_handle { @@ -13,16 +12,6 @@ class nrf_hal : public RF24_hal, public spi_patcher_handle void patch(spi_host_device_t host_device) override; void unpatch(spi_host_device_t host_device) override; - inline void request_spi() - { - spi_patcher_inst.request(this); - } - - inline void release_spi() - { - spi_patcher_inst.release(); - } - bool begin() override; void end() override; @@ -33,11 +22,21 @@ class nrf_hal : public RF24_hal, public spi_patcher_handle uint8_t read(uint8_t cmd, uint8_t* buf, uint8_t data_len, uint8_t blank_len) override; private: + inline void request_spi() + { + spi_patcher_inst.request(this); + } + + inline void release_spi() + { + spi_patcher_inst.release(); + } + const gpio_num_t pin_mosi; const gpio_num_t pin_miso; const gpio_num_t pin_clk; const gpio_num_t pin_cs; const gpio_num_t pin_en; - + spi_device_handle_t spi; }; diff --git a/lib/Hoymiles/src/spi_patcher.cpp b/lib/Hoymiles/src/spi_patcher.cpp index 2bc6a19a7..fea7bd9f9 100644 --- a/lib/Hoymiles/src/spi_patcher.cpp +++ b/lib/Hoymiles/src/spi_patcher.cpp @@ -1,6 +1,8 @@ #include "spi_patcher.h" -spi_patcher spi_patcher_inst(SPI2_HOST); +#define HOST_DEVICE SPI2_HOST + +spi_patcher spi_patcher_inst(HOST_DEVICE); spi_patcher::spi_patcher(spi_host_device_t host_device) : host_device(host_device), diff --git a/lib/Hoymiles/src/spi_patcher.h b/lib/Hoymiles/src/spi_patcher.h index daca0d34a..7d83a6e52 100644 --- a/lib/Hoymiles/src/spi_patcher.h +++ b/lib/Hoymiles/src/spi_patcher.h @@ -4,8 +4,6 @@ #include -#include - class spi_patcher { public: From 16d6c6be7df4ad5b40cabd08b385ee74fdb11345 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Sat, 8 Jul 2023 23:53:21 +0200 Subject: [PATCH 04/11] Remove unnecessary delays --- lib/CMT2300a/cmt_hal.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/CMT2300a/cmt_hal.cpp b/lib/CMT2300a/cmt_hal.cpp index 367c349c3..e5eb4ad92 100644 --- a/lib/CMT2300a/cmt_hal.cpp +++ b/lib/CMT2300a/cmt_hal.cpp @@ -1,7 +1,5 @@ #include "cmt_hal.h" -#include - #define CMT_MAX_TRANSFER_SZ 32 cmt_hal::cmt_hal() : @@ -136,8 +134,6 @@ uint8_t cmt_hal::read_reg(uint8_t addr) release_spi(); - delayMicroseconds(100); - return data; } @@ -158,8 +154,6 @@ void cmt_hal::write_reg(uint8_t addr, uint8_t data) ESP_ERROR_CHECK(spi_device_polling_transmit(spi_reg, &t)); release_spi(); - - delayMicroseconds(100); } void cmt_hal::read_fifo(uint8_t* buf, uint16_t len) @@ -179,7 +173,6 @@ void cmt_hal::read_fifo(uint8_t* buf, uint16_t len) for (uint16_t i = 0; i < len; i++) { t.rx_buffer = buf + i; ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); - delayMicroseconds(4); // > 4 us } release_spi(); @@ -202,7 +195,6 @@ void cmt_hal::write_fifo(const uint8_t* buf, uint16_t len) for (uint16_t i = 0; i < len; i++) { t.tx_buffer = buf + i; ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t)); - delayMicroseconds(4); // > 4 us } release_spi(); From 9f6f1b2ca0a65e68719a46072f998c6768817545 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Sat, 8 Jul 2023 23:56:32 +0200 Subject: [PATCH 05/11] Fix cs_ena_posttrans calculation --- lib/CMT2300a/cmt_hal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/CMT2300a/cmt_hal.cpp b/lib/CMT2300a/cmt_hal.cpp index e5eb4ad92..e3faac781 100644 --- a/lib/CMT2300a/cmt_hal.cpp +++ b/lib/CMT2300a/cmt_hal.cpp @@ -61,7 +61,7 @@ void cmt_hal::patch(spi_host_device_t host_device) .mode = 0, // SPI mode 0 .duty_cycle_pos = 0, .cs_ena_pretrans = 2, - .cs_ena_posttrans = (uint8_t)(1 / (spi_speed * 10e6 * 2) + 2), // >2 us + .cs_ena_posttrans = static_cast(2 * spi_speed / 1000000), // >2 us .clock_speed_hz = spi_speed, .input_delay_ns = 0, .spics_io_num = pin_fcs, From ab8bf73701bc9942e83ee5503b5f49b18b169003 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Wed, 2 Aug 2023 03:03:46 +0200 Subject: [PATCH 06/11] Improve SPI switching performance by only reconfiguring signal --- lib/CMT2300a/cmt_hal.cpp | 105 ++++++++++---------------- lib/CMT2300a/cmt_hal.h | 5 +- lib/Hoymiles/src/nrf_hal.cpp | 73 ++++++++---------- lib/Hoymiles/src/nrf_hal.h | 5 +- lib/Hoymiles/src/spi_patcher.cpp | 26 +++++++ lib/Hoymiles/src/spi_patcher.h | 10 ++- lib/Hoymiles/src/spi_patcher_handle.h | 4 +- 7 files changed, 109 insertions(+), 119 deletions(-) diff --git a/lib/CMT2300a/cmt_hal.cpp b/lib/CMT2300a/cmt_hal.cpp index e3faac781..6a695dd84 100644 --- a/lib/CMT2300a/cmt_hal.cpp +++ b/lib/CMT2300a/cmt_hal.cpp @@ -1,5 +1,7 @@ #include "cmt_hal.h" +#include + #define CMT_MAX_TRANSFER_SZ 32 cmt_hal::cmt_hal() : @@ -12,35 +14,44 @@ cmt_hal::cmt_hal() : } -void cmt_hal::patch(spi_host_device_t host_device) +void cmt_hal::patch() { - gpio_hold_en(pin_cs); - gpio_hold_en(pin_fcs); + esp_rom_gpio_connect_out_signal(pin_sdio, spi_periph_signal[host_device].spid_out, false, false); + esp_rom_gpio_connect_in_signal(pin_sdio, spi_periph_signal[host_device].spid_in, false); + esp_rom_gpio_connect_out_signal(pin_clk, spi_periph_signal[host_device].spiclk_out, false, false); +} - gpio_reset_pin(pin_cs); - gpio_reset_pin(pin_fcs); +void cmt_hal::unpatch() +{ + esp_rom_gpio_connect_out_signal(pin_sdio, SIG_GPIO_OUT_IDX, false, false); + esp_rom_gpio_connect_in_signal(pin_sdio, GPIO_MATRIX_CONST_ZERO_INPUT, false); + esp_rom_gpio_connect_out_signal(pin_clk, SIG_GPIO_OUT_IDX, false, false); +} - spi_bus_config_t buscfg = { - .mosi_io_num = pin_sdio, - .miso_io_num = -1, // Single wire MOSI/MISO - .sclk_io_num = pin_clk, - .quadwp_io_num = -1, - .quadhd_io_num = -1, - .data4_io_num = -1, - .data5_io_num = -1, - .data6_io_num = -1, - .data7_io_num = -1, - .max_transfer_sz = CMT_MAX_TRANSFER_SZ, - .flags = 0, - .intr_flags = 0 - }; - ESP_ERROR_CHECK(spi_bus_initialize(host_device, &buscfg, SPI_DMA_DISABLED)); +void cmt_hal::init(gpio_num_t _pin_sdio, gpio_num_t _pin_clk, gpio_num_t _pin_cs, gpio_num_t _pin_fcs, int32_t _spi_speed) +{ + pin_sdio = _pin_sdio; + pin_clk = _pin_clk; + pin_cs = _pin_cs; + pin_fcs = _pin_fcs; + spi_speed = _spi_speed; + + host_device = spi_patcher_inst.init(); + + gpio_reset_pin(pin_sdio); + gpio_set_direction(pin_sdio, GPIO_MODE_INPUT_OUTPUT); + gpio_set_level(pin_sdio, 1); + gpio_reset_pin(pin_clk); + gpio_set_direction(pin_clk, GPIO_MODE_OUTPUT); + gpio_set_level(pin_clk, 0); + + gpio_reset_pin(pin_cs); spi_device_interface_config_t devcfg_reg = { .command_bits = 1, .address_bits = 7, .dummy_bits = 0, - .mode = 0, // SPI mode 0 + .mode = 0, .duty_cycle_pos = 0, .cs_ena_pretrans = 1, .cs_ena_posttrans = 1, @@ -49,16 +60,17 @@ void cmt_hal::patch(spi_host_device_t host_device) .spics_io_num = pin_cs, .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE, .queue_size = 1, - .pre_cb = NULL, - .post_cb = NULL + .pre_cb = nullptr, + .post_cb = nullptr }; ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg_reg, &spi_reg)); + gpio_reset_pin(pin_fcs); spi_device_interface_config_t devcfg_fifo = { .command_bits = 0, .address_bits = 0, .dummy_bits = 0, - .mode = 0, // SPI mode 0 + .mode = 0, .duty_cycle_pos = 0, .cs_ena_pretrans = 2, .cs_ena_posttrans = static_cast(2 * spi_speed / 1000000), // >2 us @@ -67,51 +79,10 @@ void cmt_hal::patch(spi_host_device_t host_device) .spics_io_num = pin_fcs, .flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_3WIRE, .queue_size = 1, - .pre_cb = NULL, - .post_cb = NULL + .pre_cb = nullptr, + .post_cb = nullptr }; ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg_fifo, &spi_fifo)); - - gpio_hold_dis(pin_cs); - gpio_hold_dis(pin_fcs); -} - -void cmt_hal::unpatch(spi_host_device_t host_device) -{ - gpio_hold_en(pin_cs); - gpio_hold_en(pin_fcs); - - spi_bus_remove_device(spi_reg); - spi_bus_remove_device(spi_fifo); - spi_bus_free(host_device); - - gpio_reset_pin(pin_cs); - gpio_set_direction(pin_cs, GPIO_MODE_OUTPUT); - gpio_set_level(pin_cs, 1); - - gpio_reset_pin(pin_fcs); - gpio_set_direction(pin_fcs, GPIO_MODE_OUTPUT); - gpio_set_level(pin_fcs, 1); - - gpio_hold_dis(pin_cs); - gpio_hold_dis(pin_fcs); -} - -void cmt_hal::init(gpio_num_t _pin_sdio, gpio_num_t _pin_clk, gpio_num_t _pin_cs, gpio_num_t _pin_fcs, int32_t _spi_speed) -{ - pin_sdio = _pin_sdio; - pin_clk = _pin_clk; - pin_cs = _pin_cs; - pin_fcs = _pin_fcs; - spi_speed = _spi_speed; - - gpio_reset_pin(pin_cs); - gpio_set_direction(pin_cs, GPIO_MODE_OUTPUT); - gpio_set_level(pin_cs, 1); - - gpio_reset_pin(pin_fcs); - gpio_set_direction(pin_fcs, GPIO_MODE_OUTPUT); - gpio_set_level(pin_fcs, 1); } uint8_t cmt_hal::read_reg(uint8_t addr) diff --git a/lib/CMT2300a/cmt_hal.h b/lib/CMT2300a/cmt_hal.h index 756b08f43..5496543c6 100644 --- a/lib/CMT2300a/cmt_hal.h +++ b/lib/CMT2300a/cmt_hal.h @@ -9,8 +9,8 @@ class cmt_hal : public spi_patcher_handle public: cmt_hal(); - void patch(spi_host_device_t host_device) override; - void unpatch(spi_host_device_t host_device) override; + void patch() override; + void unpatch() override; void init(gpio_num_t pin_sdio, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_fcs, int32_t spi_speed); @@ -36,6 +36,7 @@ class cmt_hal : public spi_patcher_handle gpio_num_t pin_fcs; int32_t spi_speed; + spi_host_device_t host_device; spi_device_handle_t spi_reg; spi_device_handle_t spi_fifo; }; diff --git a/lib/Hoymiles/src/nrf_hal.cpp b/lib/Hoymiles/src/nrf_hal.cpp index 4034ba4a7..90cbf5288 100644 --- a/lib/Hoymiles/src/nrf_hal.cpp +++ b/lib/Hoymiles/src/nrf_hal.cpp @@ -1,5 +1,7 @@ #include "nrf_hal.h" +#include + #define NRF_MAX_TRANSFER_SZ 64 nrf_hal::nrf_hal(gpio_num_t pin_mosi, gpio_num_t pin_miso, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_en) : @@ -12,28 +14,36 @@ nrf_hal::nrf_hal(gpio_num_t pin_mosi, gpio_num_t pin_miso, gpio_num_t pin_clk, g } -void nrf_hal::patch(spi_host_device_t host_device) +void nrf_hal::patch() { - gpio_hold_en(pin_cs); + esp_rom_gpio_connect_out_signal(pin_mosi, spi_periph_signal[host_device].spid_out, false, false); + esp_rom_gpio_connect_in_signal(pin_miso, spi_periph_signal[host_device].spiq_in, false); + esp_rom_gpio_connect_out_signal(pin_clk, spi_periph_signal[host_device].spiclk_out, false, false); +} - gpio_reset_pin(pin_cs); +void nrf_hal::unpatch() +{ + esp_rom_gpio_connect_out_signal(pin_mosi, SIG_GPIO_OUT_IDX, false, false); + esp_rom_gpio_connect_in_signal(pin_miso, GPIO_MATRIX_CONST_ZERO_INPUT, false); + esp_rom_gpio_connect_out_signal(pin_clk, SIG_GPIO_OUT_IDX, false, false); +} - spi_bus_config_t buscfg = { - .mosi_io_num = pin_mosi, - .miso_io_num = pin_miso, - .sclk_io_num = pin_clk, - .quadwp_io_num = -1, - .quadhd_io_num = -1, - .data4_io_num = -1, - .data5_io_num = -1, - .data6_io_num = -1, - .data7_io_num = -1, - .max_transfer_sz = NRF_MAX_TRANSFER_SZ, - .flags = 0, - .intr_flags = 0 - }; - ESP_ERROR_CHECK(spi_bus_initialize(host_device, &buscfg, SPI_DMA_DISABLED)); +bool nrf_hal::begin() +{ + host_device = spi_patcher_inst.init(); + + gpio_reset_pin(pin_mosi); + gpio_set_direction(pin_mosi, GPIO_MODE_OUTPUT); + gpio_set_level(pin_mosi, 1); + gpio_reset_pin(pin_miso); + gpio_set_direction(pin_miso, GPIO_MODE_INPUT); + + gpio_reset_pin(pin_clk); + gpio_set_direction(pin_clk, GPIO_MODE_OUTPUT); + gpio_set_level(pin_clk, 0); + + gpio_reset_pin(pin_cs); spi_device_interface_config_t devcfg = { .command_bits = 0, .address_bits = 0, @@ -47,34 +57,11 @@ void nrf_hal::patch(spi_host_device_t host_device) .spics_io_num = pin_cs, .flags = 0, .queue_size = 1, - .pre_cb = NULL, - .post_cb = NULL + .pre_cb = nullptr, + .post_cb = nullptr }; ESP_ERROR_CHECK(spi_bus_add_device(host_device, &devcfg, &spi)); - gpio_hold_dis(pin_cs); -} - -void nrf_hal::unpatch(spi_host_device_t host_device) -{ - gpio_hold_en(pin_cs); - - ESP_ERROR_CHECK(spi_bus_remove_device(spi)); - ESP_ERROR_CHECK(spi_bus_free(host_device)); - - gpio_reset_pin(pin_cs); - gpio_set_direction(pin_cs, GPIO_MODE_OUTPUT); - gpio_set_level(pin_cs, 1); - - gpio_hold_dis(pin_cs); -} - -bool nrf_hal::begin() -{ - gpio_reset_pin(pin_cs); - gpio_set_direction(pin_cs, GPIO_MODE_OUTPUT); - gpio_set_level(pin_cs, 1); - gpio_reset_pin(pin_en); gpio_set_direction(pin_en, GPIO_MODE_OUTPUT); gpio_set_level(pin_en, 0); diff --git a/lib/Hoymiles/src/nrf_hal.h b/lib/Hoymiles/src/nrf_hal.h index 430d5708c..3f28d8da4 100644 --- a/lib/Hoymiles/src/nrf_hal.h +++ b/lib/Hoymiles/src/nrf_hal.h @@ -9,8 +9,8 @@ class nrf_hal : public RF24_hal, public spi_patcher_handle public: nrf_hal(gpio_num_t pin_mosi, gpio_num_t pin_miso, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_en); - void patch(spi_host_device_t host_device) override; - void unpatch(spi_host_device_t host_device) override; + void patch() override; + void unpatch() override; bool begin() override; void end() override; @@ -38,5 +38,6 @@ class nrf_hal : public RF24_hal, public spi_patcher_handle const gpio_num_t pin_cs; const gpio_num_t pin_en; + spi_host_device_t host_device; spi_device_handle_t spi; }; diff --git a/lib/Hoymiles/src/spi_patcher.cpp b/lib/Hoymiles/src/spi_patcher.cpp index fea7bd9f9..c1654175d 100644 --- a/lib/Hoymiles/src/spi_patcher.cpp +++ b/lib/Hoymiles/src/spi_patcher.cpp @@ -6,6 +6,7 @@ spi_patcher spi_patcher_inst(HOST_DEVICE); spi_patcher::spi_patcher(spi_host_device_t host_device) : host_device(host_device), + initialized(false), cur_handle(nullptr) { // Use binary semaphore instead of mutex for performance reasons @@ -17,3 +18,28 @@ spi_patcher::~spi_patcher() { vSemaphoreDelete(mutex); } + +spi_host_device_t spi_patcher::init() +{ + if (!initialized) { + initialized = true; + + spi_bus_config_t buscfg = { + .mosi_io_num = -1, + .miso_io_num = -1, + .sclk_io_num = -1, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + .max_transfer_sz = SOC_SPI_MAXIMUM_BUFFER_SIZE, + .flags = 0, + .intr_flags = 0 + }; + ESP_ERROR_CHECK(spi_bus_initialize(host_device, &buscfg, SPI_DMA_DISABLED)); + } + + return host_device; +} diff --git a/lib/Hoymiles/src/spi_patcher.h b/lib/Hoymiles/src/spi_patcher.h index 7d83a6e52..8cc19a0cf 100644 --- a/lib/Hoymiles/src/spi_patcher.h +++ b/lib/Hoymiles/src/spi_patcher.h @@ -7,20 +7,22 @@ class spi_patcher { public: - spi_patcher(spi_host_device_t host_device); + explicit spi_patcher(spi_host_device_t host_device); ~spi_patcher(); + spi_host_device_t init(); + inline void request(spi_patcher_handle* handle) { xSemaphoreTake(mutex, portMAX_DELAY); if (cur_handle != handle) { if (cur_handle) { - cur_handle->unpatch(host_device); + cur_handle->unpatch(); } cur_handle = handle; if (cur_handle) { - cur_handle->patch(host_device); + cur_handle->patch(); } } } @@ -32,6 +34,8 @@ class spi_patcher private: const spi_host_device_t host_device; + bool initialized; + spi_patcher_handle* cur_handle; SemaphoreHandle_t mutex; diff --git a/lib/Hoymiles/src/spi_patcher_handle.h b/lib/Hoymiles/src/spi_patcher_handle.h index 09c284d43..8e7e324a5 100644 --- a/lib/Hoymiles/src/spi_patcher_handle.h +++ b/lib/Hoymiles/src/spi_patcher_handle.h @@ -8,6 +8,6 @@ class spi_patcher_handle spi_patcher_handle(); virtual ~spi_patcher_handle(); - virtual void patch(spi_host_device_t host_device) = 0; - virtual void unpatch(spi_host_device_t host_device) = 0; + virtual void patch() = 0; + virtual void unpatch() = 0; }; From bf5587970829faa60b463b15f17f42da53ed1886 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Wed, 2 Aug 2023 13:37:37 +0200 Subject: [PATCH 07/11] Restructure SPI-Patcher classes --- lib/CMT2300a/cmt2300a_hal.cpp | 5 +-- lib/CMT2300a/cmt2300a_hal.h | 2 +- lib/CMT2300a/cmt2300wrapper.cpp | 5 +-- lib/CMT2300a/cmt2300wrapper.h | 4 +- lib/CMT2300a/cmt_hal.cpp | 10 +++-- lib/CMT2300a/cmt_hal.h | 10 ++--- lib/Hoymiles/src/Hoymiles.cpp | 4 +- lib/Hoymiles/src/Hoymiles.h | 2 +- lib/Hoymiles/src/HoymilesRadio_NRF.cpp | 14 +++++-- lib/Hoymiles/src/HoymilesRadio_NRF.h | 4 +- .../src/{spi_patcher.cpp => SpiPatcher.cpp} | 12 +++--- .../src/{spi_patcher.h => SpiPatcher.h} | 15 +++---- lib/Hoymiles/src/SpiPatcherHandle.cpp | 11 +++++ lib/Hoymiles/src/SpiPatcherHandle.h | 11 +++++ lib/Hoymiles/src/nrf_hal.cpp | 41 +++++++++++++------ lib/Hoymiles/src/nrf_hal.h | 23 ++++++----- lib/Hoymiles/src/spi_patcher_handle.cpp | 11 ----- lib/Hoymiles/src/spi_patcher_handle.h | 13 ------ src/InverterSettings.cpp | 9 +--- 19 files changed, 111 insertions(+), 95 deletions(-) rename lib/Hoymiles/src/{spi_patcher.cpp => SpiPatcher.cpp} (79%) rename lib/Hoymiles/src/{spi_patcher.h => SpiPatcher.h} (68%) create mode 100644 lib/Hoymiles/src/SpiPatcherHandle.cpp create mode 100644 lib/Hoymiles/src/SpiPatcherHandle.h delete mode 100644 lib/Hoymiles/src/spi_patcher_handle.cpp delete mode 100644 lib/Hoymiles/src/spi_patcher_handle.h diff --git a/lib/CMT2300a/cmt2300a_hal.cpp b/lib/CMT2300a/cmt2300a_hal.cpp index 52fd2bd98..275512dd0 100644 --- a/lib/CMT2300a/cmt2300a_hal.cpp +++ b/lib/CMT2300a/cmt2300a_hal.cpp @@ -27,14 +27,13 @@ static cmt_hal hal; * @name CMT2300A_InitSpi * @desc Initializes the CMT2300A SPI interface. * *********************************************************/ -void CMT2300A_InitSpi(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed) +void CMT2300A_InitSpi(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs) { hal.init( static_cast(pin_sdio), static_cast(pin_clk), static_cast(pin_cs), - static_cast(pin_fcs), - spi_speed + static_cast(pin_fcs) ); } diff --git a/lib/CMT2300a/cmt2300a_hal.h b/lib/CMT2300a/cmt2300a_hal.h index 1d6e1f4f3..8a27251fd 100644 --- a/lib/CMT2300a/cmt2300a_hal.h +++ b/lib/CMT2300a/cmt2300a_hal.h @@ -36,7 +36,7 @@ extern "C" { #define CMT2300A_GetTickCount() millis() /* ************************************************************************ */ -void CMT2300A_InitSpi(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, uint32_t spi_speed); +void CMT2300A_InitSpi(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs); uint8_t CMT2300A_ReadReg(uint8_t addr); void CMT2300A_WriteReg(uint8_t addr, uint8_t dat); diff --git a/lib/CMT2300a/cmt2300wrapper.cpp b/lib/CMT2300a/cmt2300wrapper.cpp index 21265f50a..e19cc17a3 100644 --- a/lib/CMT2300a/cmt2300wrapper.cpp +++ b/lib/CMT2300a/cmt2300wrapper.cpp @@ -6,13 +6,12 @@ #include "cmt2300a.h" #include "cmt2300a_params.h" -CMT2300A::CMT2300A(uint8_t pin_sdio, uint8_t pin_clk, uint8_t pin_cs, uint8_t pin_fcs, uint32_t spi_speed) +CMT2300A::CMT2300A(uint8_t pin_sdio, uint8_t pin_clk, uint8_t pin_cs, uint8_t pin_fcs) { _pin_sdio = pin_sdio; _pin_clk = pin_clk; _pin_cs = pin_cs; _pin_fcs = pin_fcs; - _spi_speed = spi_speed; } bool CMT2300A::begin(void) @@ -249,7 +248,7 @@ void CMT2300A::flush_rx(void) bool CMT2300A::_init_pins() { - CMT2300A_InitSpi(_pin_sdio, _pin_clk, _pin_cs, _pin_fcs, _spi_speed); + CMT2300A_InitSpi(_pin_sdio, _pin_clk, _pin_cs, _pin_fcs); return true; // assuming pins are connected properly } diff --git a/lib/CMT2300a/cmt2300wrapper.h b/lib/CMT2300a/cmt2300wrapper.h index 5f76b06f2..deb8f9bd2 100644 --- a/lib/CMT2300a/cmt2300wrapper.h +++ b/lib/CMT2300a/cmt2300wrapper.h @@ -6,11 +6,10 @@ #define CMT2300A_ONE_STEP_SIZE 2500 // frequency channel step size for fast frequency hopping operation: One step size is 2.5 kHz. #define CMT_BASE_FREQ 860000000 // from Frequency Bank in cmt2300a_params.h #define FH_OFFSET 100 // value * CMT2300A_ONE_STEP_SIZE = channel frequency offset -#define CMT_SPI_SPEED 4000000 // 4 MHz class CMT2300A { public: - CMT2300A(uint8_t pin_sdio, uint8_t pin_clk, uint8_t pin_cs, uint8_t pin_fcs, uint32_t _spi_speed = CMT_SPI_SPEED); + CMT2300A(uint8_t pin_sdio, uint8_t pin_clk, uint8_t pin_cs, uint8_t pin_fcs); bool begin(void); @@ -108,5 +107,4 @@ class CMT2300A { int8_t _pin_clk; int8_t _pin_cs; int8_t _pin_fcs; - uint32_t _spi_speed; }; \ No newline at end of file diff --git a/lib/CMT2300a/cmt_hal.cpp b/lib/CMT2300a/cmt_hal.cpp index 6a695dd84..833f205cc 100644 --- a/lib/CMT2300a/cmt_hal.cpp +++ b/lib/CMT2300a/cmt_hal.cpp @@ -3,13 +3,14 @@ #include #define CMT_MAX_TRANSFER_SZ 32 +#define CMT_DEFAULT_SPI_SPEED 4000000 // 4 MHz cmt_hal::cmt_hal() : pin_sdio(GPIO_NUM_NC), pin_clk(GPIO_NUM_NC), pin_cs(GPIO_NUM_NC), pin_fcs(GPIO_NUM_NC), - spi_speed(1000000) + spi_speed(CMT_DEFAULT_SPI_SPEED) { } @@ -34,9 +35,12 @@ void cmt_hal::init(gpio_num_t _pin_sdio, gpio_num_t _pin_clk, gpio_num_t _pin_cs pin_clk = _pin_clk; pin_cs = _pin_cs; pin_fcs = _pin_fcs; - spi_speed = _spi_speed; - host_device = spi_patcher_inst.init(); + if (_spi_speed > 0) { + spi_speed = _spi_speed; + } + + host_device = HoymilesSpiPatcher.init(); gpio_reset_pin(pin_sdio); gpio_set_direction(pin_sdio, GPIO_MODE_INPUT_OUTPUT); diff --git a/lib/CMT2300a/cmt_hal.h b/lib/CMT2300a/cmt_hal.h index 5496543c6..5af231c19 100644 --- a/lib/CMT2300a/cmt_hal.h +++ b/lib/CMT2300a/cmt_hal.h @@ -1,10 +1,10 @@ #pragma once -#include "spi_patcher.h" +#include "SpiPatcher.h" #include -class cmt_hal : public spi_patcher_handle +class cmt_hal : public SpiPatcherHandle { public: cmt_hal(); @@ -12,7 +12,7 @@ class cmt_hal : public spi_patcher_handle void patch() override; void unpatch() override; - void init(gpio_num_t pin_sdio, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_fcs, int32_t spi_speed); + void init(gpio_num_t pin_sdio, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_fcs, int32_t spi_speed = 0); uint8_t read_reg(uint8_t addr); void write_reg(uint8_t addr, uint8_t data); @@ -22,12 +22,12 @@ class cmt_hal : public spi_patcher_handle private: inline void request_spi() { - spi_patcher_inst.request(this); + HoymilesSpiPatcher.request(this); } inline void release_spi() { - spi_patcher_inst.release(); + HoymilesSpiPatcher.release(); } gpio_num_t pin_sdio; diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index 03e55d92c..6cebabccf 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -24,9 +24,9 @@ void HoymilesClass::init() _radioCmt.reset(new HoymilesRadio_CMT()); } -void HoymilesClass::initNRF(nrf_hal* hal, uint8_t pinIRQ) +void HoymilesClass::initNRF(int8_t pin_mosi, int8_t pin_miso, int8_t pin_clk, int8_t pin_cs, int8_t pin_en, int8_t pin_irq) { - _radioNrf->init(hal, pinIRQ); + _radioNrf->init(pin_mosi, pin_miso, pin_clk, pin_cs, pin_en, pin_irq); } void HoymilesClass::initCMT(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3) diff --git a/lib/Hoymiles/src/Hoymiles.h b/lib/Hoymiles/src/Hoymiles.h index 6c6d11d69..96c1d273f 100644 --- a/lib/Hoymiles/src/Hoymiles.h +++ b/lib/Hoymiles/src/Hoymiles.h @@ -16,7 +16,7 @@ class HoymilesClass { public: void init(); - void initNRF(nrf_hal* hal, uint8_t pinIRQ); + void initNRF(int8_t pin_mosi, int8_t pin_miso, int8_t pin_clk, int8_t pin_cs, int8_t pin_en, int8_t pin_irq); void initCMT(int8_t pin_sdio, int8_t pin_clk, int8_t pin_cs, int8_t pin_fcs, int8_t pin_gpio2, int8_t pin_gpio3); void loop(); diff --git a/lib/Hoymiles/src/HoymilesRadio_NRF.cpp b/lib/Hoymiles/src/HoymilesRadio_NRF.cpp index 60d9a0f99..f7cbe0a0d 100644 --- a/lib/Hoymiles/src/HoymilesRadio_NRF.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_NRF.cpp @@ -8,12 +8,18 @@ #include #include -void HoymilesRadio_NRF::init(nrf_hal* hal, uint8_t pinIRQ) +void HoymilesRadio_NRF::init(int8_t pin_mosi, int8_t pin_miso, int8_t pin_clk, int8_t pin_cs, int8_t pin_en, int8_t pin_irq) { _dtuSerial.u64 = 0; - _hal.reset(hal); - _radio.reset(new RF24(hal)); + _hal.init( + static_cast(pin_mosi), + static_cast(pin_miso), + static_cast(pin_clk), + static_cast(pin_cs), + static_cast(pin_en) + ); + _radio.reset(new RF24(&_hal)); _radio->begin(); @@ -29,7 +35,7 @@ void HoymilesRadio_NRF::init(nrf_hal* hal, uint8_t pinIRQ) } Hoymiles.getMessageOutput()->println("NRF: Connection successful"); - attachInterrupt(digitalPinToInterrupt(pinIRQ), std::bind(&HoymilesRadio_NRF::handleIntr, this), FALLING); + attachInterrupt(digitalPinToInterrupt(pin_irq), std::bind(&HoymilesRadio_NRF::handleIntr, this), FALLING); openReadingPipe(); _radio->startListening(); diff --git a/lib/Hoymiles/src/HoymilesRadio_NRF.h b/lib/Hoymiles/src/HoymilesRadio_NRF.h index bac4086e6..745a7e4c6 100644 --- a/lib/Hoymiles/src/HoymilesRadio_NRF.h +++ b/lib/Hoymiles/src/HoymilesRadio_NRF.h @@ -14,7 +14,7 @@ class HoymilesRadio_NRF : public HoymilesRadio { public: - void init(nrf_hal* hal, uint8_t pinIRQ); + void init(int8_t pin_mosi, int8_t pin_miso, int8_t pin_clk, int8_t pin_cs, int8_t pin_en, int8_t pin_irq); void loop(); void setPALevel(const rf24_pa_dbm_e paLevel); @@ -33,7 +33,7 @@ class HoymilesRadio_NRF : public HoymilesRadio { void sendEsbPacket(CommandAbstract& cmd); - std::unique_ptr _hal; + nrf_hal _hal; std::unique_ptr _radio; uint8_t _rxChLst[5] = { 3, 23, 40, 61, 75 }; uint8_t _rxChIdx = 0; diff --git a/lib/Hoymiles/src/spi_patcher.cpp b/lib/Hoymiles/src/SpiPatcher.cpp similarity index 79% rename from lib/Hoymiles/src/spi_patcher.cpp rename to lib/Hoymiles/src/SpiPatcher.cpp index c1654175d..0095c400d 100644 --- a/lib/Hoymiles/src/spi_patcher.cpp +++ b/lib/Hoymiles/src/SpiPatcher.cpp @@ -1,10 +1,10 @@ -#include "spi_patcher.h" +#include "SpiPatcher.h" -#define HOST_DEVICE SPI2_HOST +#define HOYMILES_HOST_DEVICE SPI2_HOST -spi_patcher spi_patcher_inst(HOST_DEVICE); +SpiPatcher HoymilesSpiPatcher(HOYMILES_HOST_DEVICE); -spi_patcher::spi_patcher(spi_host_device_t host_device) : +SpiPatcher::SpiPatcher(spi_host_device_t host_device) : host_device(host_device), initialized(false), cur_handle(nullptr) @@ -14,12 +14,12 @@ spi_patcher::spi_patcher(spi_host_device_t host_device) : xSemaphoreGive(mutex); } -spi_patcher::~spi_patcher() +SpiPatcher::~SpiPatcher() { vSemaphoreDelete(mutex); } -spi_host_device_t spi_patcher::init() +spi_host_device_t SpiPatcher::init() { if (!initialized) { initialized = true; diff --git a/lib/Hoymiles/src/spi_patcher.h b/lib/Hoymiles/src/SpiPatcher.h similarity index 68% rename from lib/Hoymiles/src/spi_patcher.h rename to lib/Hoymiles/src/SpiPatcher.h index 8cc19a0cf..4c27b1c2d 100644 --- a/lib/Hoymiles/src/spi_patcher.h +++ b/lib/Hoymiles/src/SpiPatcher.h @@ -1,18 +1,19 @@ #pragma once -#include "spi_patcher_handle.h" +#include "SpiPatcherHandle.h" +#include #include -class spi_patcher +class SpiPatcher { public: - explicit spi_patcher(spi_host_device_t host_device); - ~spi_patcher(); + explicit SpiPatcher(spi_host_device_t host_device); + ~SpiPatcher(); spi_host_device_t init(); - inline void request(spi_patcher_handle* handle) + inline void request(SpiPatcherHandle* handle) { xSemaphoreTake(mutex, portMAX_DELAY); @@ -36,10 +37,10 @@ class spi_patcher const spi_host_device_t host_device; bool initialized; - spi_patcher_handle* cur_handle; + SpiPatcherHandle* cur_handle; SemaphoreHandle_t mutex; StaticSemaphore_t mutex_buffer; }; -extern spi_patcher spi_patcher_inst; +extern SpiPatcher HoymilesSpiPatcher; diff --git a/lib/Hoymiles/src/SpiPatcherHandle.cpp b/lib/Hoymiles/src/SpiPatcherHandle.cpp new file mode 100644 index 000000000..c0e2b53f5 --- /dev/null +++ b/lib/Hoymiles/src/SpiPatcherHandle.cpp @@ -0,0 +1,11 @@ +#include "SpiPatcherHandle.h" + +SpiPatcherHandle::SpiPatcherHandle() +{ + +} + +SpiPatcherHandle::~SpiPatcherHandle() +{ + +} diff --git a/lib/Hoymiles/src/SpiPatcherHandle.h b/lib/Hoymiles/src/SpiPatcherHandle.h new file mode 100644 index 000000000..ec1b3b7c8 --- /dev/null +++ b/lib/Hoymiles/src/SpiPatcherHandle.h @@ -0,0 +1,11 @@ +#pragma once + +class SpiPatcherHandle +{ +public: + SpiPatcherHandle(); + virtual ~SpiPatcherHandle(); + + virtual void patch() = 0; + virtual void unpatch() = 0; +}; diff --git a/lib/Hoymiles/src/nrf_hal.cpp b/lib/Hoymiles/src/nrf_hal.cpp index 90cbf5288..346a3b395 100644 --- a/lib/Hoymiles/src/nrf_hal.cpp +++ b/lib/Hoymiles/src/nrf_hal.cpp @@ -3,15 +3,17 @@ #include #define NRF_MAX_TRANSFER_SZ 64 - -nrf_hal::nrf_hal(gpio_num_t pin_mosi, gpio_num_t pin_miso, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_en) : - pin_mosi(pin_mosi), - pin_miso(pin_miso), - pin_clk(pin_clk), - pin_cs(pin_cs), - pin_en(pin_en) +#define NRF_DEFAULT_SPI_SPEED 10000000 // 10 MHz + +nrf_hal::nrf_hal() : + pin_mosi(GPIO_NUM_NC), + pin_miso(GPIO_NUM_NC), + pin_clk(GPIO_NUM_NC), + pin_cs(GPIO_NUM_NC), + pin_en(GPIO_NUM_NC), + spi_speed(NRF_DEFAULT_SPI_SPEED) { - + } void nrf_hal::patch() @@ -28,9 +30,19 @@ void nrf_hal::unpatch() esp_rom_gpio_connect_out_signal(pin_clk, SIG_GPIO_OUT_IDX, false, false); } -bool nrf_hal::begin() +void nrf_hal::init(gpio_num_t _pin_mosi, gpio_num_t _pin_miso, gpio_num_t _pin_clk, gpio_num_t _pin_cs, gpio_num_t _pin_en, int32_t _spi_speed) { - host_device = spi_patcher_inst.init(); + pin_mosi = _pin_mosi; + pin_miso = _pin_miso; + pin_clk = _pin_clk; + pin_cs = _pin_cs; + pin_en = _pin_en; + + if (_spi_speed > 0) { + spi_speed = _spi_speed; + } + + host_device = HoymilesSpiPatcher.init(); gpio_reset_pin(pin_mosi); gpio_set_direction(pin_mosi, GPIO_MODE_OUTPUT); @@ -50,9 +62,9 @@ bool nrf_hal::begin() .dummy_bits = 0, .mode = 0, .duty_cycle_pos = 0, - .cs_ena_pretrans = 1, - .cs_ena_posttrans = 1, - .clock_speed_hz = 10000000, + .cs_ena_pretrans = 0, + .cs_ena_posttrans = 0, + .clock_speed_hz = spi_speed, .input_delay_ns = 0, .spics_io_num = pin_cs, .flags = 0, @@ -65,7 +77,10 @@ bool nrf_hal::begin() gpio_reset_pin(pin_en); gpio_set_direction(pin_en, GPIO_MODE_OUTPUT); gpio_set_level(pin_en, 0); +} +bool nrf_hal::begin() +{ return true; } diff --git a/lib/Hoymiles/src/nrf_hal.h b/lib/Hoymiles/src/nrf_hal.h index 3f28d8da4..ba5073517 100644 --- a/lib/Hoymiles/src/nrf_hal.h +++ b/lib/Hoymiles/src/nrf_hal.h @@ -1,17 +1,19 @@ #pragma once -#include "spi_patcher.h" +#include "SpiPatcher.h" #include -class nrf_hal : public RF24_hal, public spi_patcher_handle +class nrf_hal : public RF24_hal, public SpiPatcherHandle { public: - nrf_hal(gpio_num_t pin_mosi, gpio_num_t pin_miso, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_en); + nrf_hal(); void patch() override; void unpatch() override; + void init(gpio_num_t pin_mosi, gpio_num_t pin_miso, gpio_num_t pin_clk, gpio_num_t pin_cs, gpio_num_t pin_en, int32_t spi_speed = 0); + bool begin() override; void end() override; @@ -24,19 +26,20 @@ class nrf_hal : public RF24_hal, public spi_patcher_handle private: inline void request_spi() { - spi_patcher_inst.request(this); + HoymilesSpiPatcher.request(this); } inline void release_spi() { - spi_patcher_inst.release(); + HoymilesSpiPatcher.release(); } - const gpio_num_t pin_mosi; - const gpio_num_t pin_miso; - const gpio_num_t pin_clk; - const gpio_num_t pin_cs; - const gpio_num_t pin_en; + gpio_num_t pin_mosi; + gpio_num_t pin_miso; + gpio_num_t pin_clk; + gpio_num_t pin_cs; + gpio_num_t pin_en; + int32_t spi_speed; spi_host_device_t host_device; spi_device_handle_t spi; diff --git a/lib/Hoymiles/src/spi_patcher_handle.cpp b/lib/Hoymiles/src/spi_patcher_handle.cpp deleted file mode 100644 index de59c858c..000000000 --- a/lib/Hoymiles/src/spi_patcher_handle.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "spi_patcher_handle.h" - -spi_patcher_handle::spi_patcher_handle() -{ - -} - -spi_patcher_handle::~spi_patcher_handle() -{ - -} diff --git a/lib/Hoymiles/src/spi_patcher_handle.h b/lib/Hoymiles/src/spi_patcher_handle.h deleted file mode 100644 index 8e7e324a5..000000000 --- a/lib/Hoymiles/src/spi_patcher_handle.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include - -class spi_patcher_handle -{ -public: - spi_patcher_handle(); - virtual ~spi_patcher_handle(); - - virtual void patch() = 0; - virtual void unpatch() = 0; -}; diff --git a/src/InverterSettings.cpp b/src/InverterSettings.cpp index 41e6cd748..62368f720 100644 --- a/src/InverterSettings.cpp +++ b/src/InverterSettings.cpp @@ -38,14 +38,7 @@ void InverterSettingsClass::init(Scheduler& scheduler) if (PinMapping.isValidNrf24Config() || PinMapping.isValidCmt2300Config()) { if (PinMapping.isValidNrf24Config()) { - nrf_hal* hal = new nrf_hal( - static_cast(pin.nrf24_mosi), - static_cast(pin.nrf24_miso), - static_cast(pin.nrf24_clk), - static_cast(pin.nrf24_cs), - static_cast(pin.nrf24_en) - ); - Hoymiles.initNRF(hal, pin.nrf24_irq); + Hoymiles.initNRF(pin.nrf24_mosi, pin.nrf24_miso, pin.nrf24_clk, pin.nrf24_cs, pin.nrf24_en, pin.nrf24_irq); } if (PinMapping.isValidCmt2300Config()) { From 688b0aa77e85feb0f072b1c470b6db8c4a6d8995 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Fri, 21 Jul 2023 16:57:00 +0200 Subject: [PATCH 08/11] Implement W5500 support --- include/ETHSPI.h | 19 ++++++ include/NetworkSettings.h | 3 +- include/PinMapping.h | 10 ++- platformio.ini | 30 +++++++++ src/ETHSPI.cpp | 126 ++++++++++++++++++++++++++++++++++++++ src/NetworkSettings.cpp | 12 +++- src/PinMapping.cpp | 50 ++++++++++++++- src/WebApi_device.cpp | 8 +++ src/main.cpp | 2 + 9 files changed, 256 insertions(+), 4 deletions(-) create mode 100644 include/ETHSPI.h create mode 100644 src/ETHSPI.cpp diff --git a/include/ETHSPI.h b/include/ETHSPI.h new file mode 100644 index 000000000..405ab8eee --- /dev/null +++ b/include/ETHSPI.h @@ -0,0 +1,19 @@ +#pragma once + +#include +//#include + +class ETHSPIClass +{ +private: + esp_eth_handle_t eth_handle; + esp_netif_t *eth_netif; + +public: + ETHSPIClass(); + + void begin(int8_t pin_sclk, int8_t pin_mosi, int8_t pin_miso, int8_t pin_cs, int8_t pin_int, int8_t pin_rst); + String macAddress(); +}; + +extern ETHSPIClass ETHSPI; diff --git a/include/NetworkSettings.h b/include/NetworkSettings.h index 40ddc914d..0f4c24db3 100644 --- a/include/NetworkSettings.h +++ b/include/NetworkSettings.h @@ -83,6 +83,7 @@ class NetworkSettingsClass { bool _ethConnected = false; std::vector _cbEventList; bool _lastMdnsEnabled = false; + bool _spiEth = false; }; -extern NetworkSettingsClass NetworkSettings; \ No newline at end of file +extern NetworkSettingsClass NetworkSettings; diff --git a/include/PinMapping.h b/include/PinMapping.h index e0db88b6f..e0c6384d2 100644 --- a/include/PinMapping.h +++ b/include/PinMapping.h @@ -26,6 +26,13 @@ struct PinMapping_t { int8_t cmt_gpio3; int8_t cmt_sdio; + int8_t w5500_sclk; + int8_t w5500_mosi; + int8_t w5500_miso; + int8_t w5500_cs; + int8_t w5500_int; + int8_t w5500_rst; + int8_t eth_phy_addr; bool eth_enabled; int eth_power; @@ -49,10 +56,11 @@ class PinMappingClass { bool isValidNrf24Config() const; bool isValidCmt2300Config() const; + bool isValidW5500Config() const; bool isValidEthConfig() const; private: PinMapping_t _pinMapping; }; -extern PinMappingClass PinMapping; \ No newline at end of file +extern PinMappingClass PinMapping; diff --git a/platformio.ini b/platformio.ini index 99139f06f..df6c2a39d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -211,6 +211,7 @@ build_flags = ${env.build_flags} -DLED0=17 -DLED1=18 -DARDUINO_USB_MODE=1 + -DARDUINO_USB_CDC_ON_BOOT=1 [env:opendtufusionv2] board = esp32-s3-devkitc-1 @@ -234,3 +235,32 @@ build_flags = ${env.build_flags} -DCMT_SDIO=5 -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 + +[env:opendtufusionv2_shield] +board = esp32-s3-devkitc-1 +upload_protocol = esp-builtin +debug_tool = esp-builtin +debug_speed = 12000 +build_flags = ${env.build_flags} + -DHOYMILES_PIN_MISO=48 + -DHOYMILES_PIN_MOSI=35 + -DHOYMILES_PIN_SCLK=36 + -DHOYMILES_PIN_IRQ=47 + -DHOYMILES_PIN_CE=38 + -DHOYMILES_PIN_CS=37 + -DLED0=17 + -DLED1=18 + -DCMT_CLK=6 + -DCMT_CS=4 + -DCMT_FCS=21 + -DCMT_GPIO2=3 + -DCMT_GPIO3=8 + -DCMT_SDIO=5 + -DW5500_SCLK=39 + -DW5500_MOSI=40 + -DW5500_MISO=41 + -DW5500_CS=42 + -DW5500_INT=44 + -DW5500_RST=43 + -DARDUINO_USB_MODE=1 + -DARDUINO_USB_CDC_ON_BOOT=1 diff --git a/src/ETHSPI.cpp b/src/ETHSPI.cpp new file mode 100644 index 000000000..9c09ebe45 --- /dev/null +++ b/src/ETHSPI.cpp @@ -0,0 +1,126 @@ +#include "ETHSPI.h" + +#include +#include +#include +#include +#include +#include +#include "MessageOutput.h" + +extern void tcpipInit(); +extern void add_esp_interface_netif(esp_interface_t interface, esp_netif_t* esp_netif); /* from WiFiGeneric */ + +ETHSPIClass::ETHSPIClass() : + eth_handle(nullptr), + eth_netif(nullptr) +{ + +} + +void ETHSPIClass::begin(int8_t pin_sclk, int8_t pin_mosi, int8_t pin_miso, int8_t pin_cs, int8_t pin_int, int8_t pin_rst) +{ + gpio_reset_pin(static_cast(pin_rst)); + gpio_set_direction(static_cast(pin_rst), GPIO_MODE_OUTPUT); + gpio_set_level(static_cast(pin_rst), 0); + + gpio_reset_pin(static_cast(pin_sclk)); + gpio_reset_pin(static_cast(pin_mosi)); + gpio_reset_pin(static_cast(pin_miso)); + gpio_reset_pin(static_cast(pin_cs)); + gpio_set_pull_mode(static_cast(pin_miso), GPIO_PULLUP_ONLY); + + // Workaround, because calling gpio_install_isr_service directly causes issues with attachInterrupt later + attachInterrupt(digitalPinToInterrupt(pin_int), nullptr, CHANGE); + detachInterrupt(digitalPinToInterrupt(pin_int)); + gpio_reset_pin(static_cast(pin_int)); + gpio_set_pull_mode(static_cast(pin_int), GPIO_PULLUP_ONLY); + + spi_bus_config_t buscfg = { + .mosi_io_num = pin_mosi, + .miso_io_num = pin_miso, + .sclk_io_num = pin_sclk, + .quadwp_io_num = -1, + .quadhd_io_num = -1, + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + .max_transfer_sz = 0, // uses default value internally + .flags = 0, + .intr_flags = 0 + }; + + ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO)); + + spi_device_interface_config_t devcfg = { + .command_bits = 16, // actually address phase + .address_bits = 8, // actually command phase + .dummy_bits = 0, + .mode = 0, + .duty_cycle_pos = 0, + .cs_ena_pretrans = 0, // only 0 supported + .cs_ena_posttrans = 0, // only 0 supported + .clock_speed_hz = 20000000, // TODO: check stability + .input_delay_ns = 0, + .spics_io_num = pin_cs, + .flags = 0, + .queue_size = 20, + .pre_cb = nullptr, + .post_cb = nullptr + }; + + spi_device_handle_t spi; + ESP_ERROR_CHECK(spi_bus_add_device(SPI3_HOST, &devcfg, &spi)); + + // Reset sequence + delayMicroseconds(500); + gpio_set_level(static_cast(pin_rst), 1); + delayMicroseconds(1000); + + // Arduino function to start networking stack if not already started + tcpipInit(); + + ESP_ERROR_CHECK(tcpip_adapter_set_default_eth_handlers()); // ? + + eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(spi); + w5500_config.int_gpio_num = pin_int; + + eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG(); + mac_config.rx_task_stack_size = 4096; + esp_eth_mac_t *mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config); + + eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG(); + phy_config.reset_gpio_num = -1; + esp_eth_phy_t *phy = esp_eth_phy_new_w5500(&phy_config); + + esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy); + ESP_ERROR_CHECK(esp_eth_driver_install(ð_config, ð_handle)); + + // Configure MAC address + uint8_t mac_addr[6]; + esp_base_mac_addr_get(mac_addr); + mac_addr[5] |= 0x03; // derive ethernet MAC address from base MAC address + ESP_ERROR_CHECK(esp_eth_ioctl(eth_handle, ETH_CMD_S_MAC_ADDR, mac_addr)); + + esp_netif_config_t netif_config = ESP_NETIF_DEFAULT_ETH(); + eth_netif = esp_netif_new(&netif_config); + + ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle))); + + // Add to Arduino + add_esp_interface_netif(ESP_IF_ETH, eth_netif); + + ESP_ERROR_CHECK(esp_eth_start(eth_handle)); +} + +String ETHSPIClass::macAddress() +{ + uint8_t mac_addr[6] = {0, 0, 0, 0, 0, 0}; + esp_eth_ioctl(eth_handle, ETH_CMD_G_MAC_ADDR, mac_addr); + char mac_addr_str[18]; + sprintf(mac_addr_str, "%02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + return String(mac_addr_str); +} + +ETHSPIClass ETHSPI; diff --git a/src/NetworkSettings.cpp b/src/NetworkSettings.cpp index 92a3156dc..4af545c54 100644 --- a/src/NetworkSettings.cpp +++ b/src/NetworkSettings.cpp @@ -9,6 +9,7 @@ #include "Utils.h" #include "defaults.h" #include +#include "ETHSPI.h" #include NetworkSettingsClass::NetworkSettingsClass() @@ -165,7 +166,14 @@ void NetworkSettingsClass::setupMode() } } - if (PinMapping.isValidEthConfig()) { + if (PinMapping.isValidW5500Config()) { + if (!_spiEth) { + _spiEth = true; + + PinMapping_t& pin = PinMapping.get(); + ETHSPI.begin(pin.w5500_sclk, pin.w5500_mosi, pin.w5500_miso, pin.w5500_cs, pin.w5500_int, pin.w5500_rst); + } + } else if (PinMapping.isValidEthConfig()) { PinMapping_t& pin = PinMapping.get(); ETH.begin(pin.eth_phy_addr, pin.eth_power, pin.eth_mdc, pin.eth_mdio, pin.eth_type, pin.eth_clk_mode); } @@ -395,6 +403,8 @@ String NetworkSettingsClass::macAddress() const { switch (_networkMode) { case network_mode::Ethernet: + if (_spiEth) + return ETHSPI.macAddress(); return ETH.macAddress(); break; case network_mode::WiFi: diff --git a/src/PinMapping.cpp b/src/PinMapping.cpp index 8d7062b01..4a2777cd6 100644 --- a/src/PinMapping.cpp +++ b/src/PinMapping.cpp @@ -86,6 +86,30 @@ #define CMT_SDIO -1 #endif +#ifndef W5500_SCLK +#define W5500_SCLK -1 +#endif + +#ifndef W5500_MOSI +#define W5500_MOSI -1 +#endif + +#ifndef W5500_MISO +#define W5500_MISO -1 +#endif + +#ifndef W5500_CS +#define W5500_CS -1 +#endif + +#ifndef W5500_INT +#define W5500_INT -1 +#endif + +#ifndef W5500_RST +#define W5500_RST -1 +#endif + PinMappingClass PinMapping; PinMappingClass::PinMappingClass() @@ -105,6 +129,13 @@ PinMappingClass::PinMappingClass() _pinMapping.cmt_gpio3 = CMT_GPIO3; _pinMapping.cmt_sdio = CMT_SDIO; + _pinMapping.w5500_sclk = W5500_SCLK; + _pinMapping.w5500_mosi = W5500_MOSI; + _pinMapping.w5500_miso = W5500_MISO; + _pinMapping.w5500_cs = W5500_CS; + _pinMapping.w5500_int = W5500_INT; + _pinMapping.w5500_rst = W5500_RST; + #ifdef OPENDTU_ETHERNET _pinMapping.eth_enabled = true; #else @@ -166,6 +197,13 @@ bool PinMappingClass::init(const String& deviceMapping) _pinMapping.cmt_gpio3 = doc[i]["cmt"]["gpio3"] | CMT_GPIO3; _pinMapping.cmt_sdio = doc[i]["cmt"]["sdio"] | CMT_SDIO; + _pinMapping.w5500_sclk = doc[i]["w5500"]["sclk"] | W5500_SCLK; + _pinMapping.w5500_mosi = doc[i]["w5500"]["mosi"] | W5500_MOSI; + _pinMapping.w5500_miso = doc[i]["w5500"]["miso"] | W5500_MISO; + _pinMapping.w5500_cs = doc[i]["w5500"]["cs"] | W5500_CS; + _pinMapping.w5500_int = doc[i]["w5500"]["int"] | W5500_INT; + _pinMapping.w5500_rst = doc[i]["w5500"]["rst"] | W5500_RST; + #ifdef OPENDTU_ETHERNET _pinMapping.eth_enabled = doc[i]["eth"]["enabled"] | true; #else @@ -213,7 +251,17 @@ bool PinMappingClass::isValidCmt2300Config() const && _pinMapping.cmt_sdio >= 0; } +bool PinMappingClass::isValidW5500Config() const +{ + return _pinMapping.w5500_sclk >= 0 + && _pinMapping.w5500_mosi >= 0 + && _pinMapping.w5500_miso >= 0 + && _pinMapping.w5500_cs >= 0 + && _pinMapping.w5500_int >= 0 + && _pinMapping.w5500_rst >= 0; +} + bool PinMappingClass::isValidEthConfig() const { return _pinMapping.eth_enabled; -} \ No newline at end of file +} diff --git a/src/WebApi_device.cpp b/src/WebApi_device.cpp index f8f93d9cc..c708c2646 100644 --- a/src/WebApi_device.cpp +++ b/src/WebApi_device.cpp @@ -56,6 +56,14 @@ void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request) cmtPinObj["gpio2"] = pin.cmt_gpio2; cmtPinObj["gpio3"] = pin.cmt_gpio3; + JsonObject w5500PinObj = curPin.createNestedObject("w5500"); + w5500PinObj["sclk"] = pin.w5500_sclk; + w5500PinObj["mosi"] = pin.w5500_mosi; + w5500PinObj["miso"] = pin.w5500_miso; + w5500PinObj["cs"] = pin.w5500_cs; + w5500PinObj["int"] = pin.w5500_int; + w5500PinObj["rst"] = pin.w5500_rst; + JsonObject ethPinObj = curPin.createNestedObject("eth"); ethPinObj["enabled"] = pin.eth_enabled; ethPinObj["phy_addr"] = pin.eth_phy_addr; diff --git a/src/main.cpp b/src/main.cpp index 7157a9df3..4bff9f196 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,6 +25,8 @@ #include #include +#include + void setup() { // Initialize serial output From 2178ffc88a6289f60109b9fca1bf4c9ffa4be08b Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Wed, 2 Aug 2023 17:36:19 +0200 Subject: [PATCH 09/11] Relocate ethernet setup routine --- src/ETHSPI.cpp | 7 ++++--- src/NetworkSettings.cpp | 23 +++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/ETHSPI.cpp b/src/ETHSPI.cpp index 9c09ebe45..4c78dc3ac 100644 --- a/src/ETHSPI.cpp +++ b/src/ETHSPI.cpp @@ -8,8 +8,9 @@ #include #include "MessageOutput.h" -extern void tcpipInit(); -extern void add_esp_interface_netif(esp_interface_t interface, esp_netif_t* esp_netif); /* from WiFiGeneric */ +// Functions from WiFiGeneric +void tcpipInit(); +void add_esp_interface_netif(esp_interface_t interface, esp_netif_t* esp_netif); ETHSPIClass::ETHSPIClass() : eth_handle(nullptr), @@ -99,7 +100,7 @@ void ETHSPIClass::begin(int8_t pin_sclk, int8_t pin_mosi, int8_t pin_miso, int8_ // Configure MAC address uint8_t mac_addr[6]; - esp_base_mac_addr_get(mac_addr); + ESP_ERROR_CHECK(esp_efuse_mac_get_default(mac_addr)); mac_addr[5] |= 0x03; // derive ethernet MAC address from base MAC address ESP_ERROR_CHECK(esp_eth_ioctl(eth_handle, ETH_CMD_S_MAC_ADDR, mac_addr)); diff --git a/src/NetworkSettings.cpp b/src/NetworkSettings.cpp index 4af545c54..fc5ac067b 100644 --- a/src/NetworkSettings.cpp +++ b/src/NetworkSettings.cpp @@ -27,6 +27,17 @@ void NetworkSettingsClass::init(Scheduler& scheduler) WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); WiFi.onEvent(std::bind(&NetworkSettingsClass::NetworkEvent, this, _1)); + + if (PinMapping.isValidW5500Config()) { + _spiEth = true; + + PinMapping_t& pin = PinMapping.get(); + ETHSPI.begin(pin.w5500_sclk, pin.w5500_mosi, pin.w5500_miso, pin.w5500_cs, pin.w5500_int, pin.w5500_rst); + } else if (PinMapping.isValidEthConfig()) { + PinMapping_t& pin = PinMapping.get(); + ETH.begin(pin.eth_phy_addr, pin.eth_power, pin.eth_mdc, pin.eth_mdio, pin.eth_type, pin.eth_clk_mode); + } + setupMode(); scheduler.addTask(_loopTask); @@ -165,18 +176,6 @@ void NetworkSettingsClass::setupMode() WiFi.mode(WIFI_MODE_NULL); } } - - if (PinMapping.isValidW5500Config()) { - if (!_spiEth) { - _spiEth = true; - - PinMapping_t& pin = PinMapping.get(); - ETHSPI.begin(pin.w5500_sclk, pin.w5500_mosi, pin.w5500_miso, pin.w5500_cs, pin.w5500_int, pin.w5500_rst); - } - } else if (PinMapping.isValidEthConfig()) { - PinMapping_t& pin = PinMapping.get(); - ETH.begin(pin.eth_phy_addr, pin.eth_power, pin.eth_mdc, pin.eth_mdio, pin.eth_type, pin.eth_clk_mode); - } } void NetworkSettingsClass::enableAdminMode() From ea1854de9bb7c14bb29b4fafd608fecb7bad4240 Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Wed, 2 Aug 2023 23:42:17 +0200 Subject: [PATCH 10/11] Fix cpplint complaints --- lib/Hoymiles/src/nrf_hal.cpp | 16 ++++++++-------- src/ETHSPI.cpp | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/Hoymiles/src/nrf_hal.cpp b/lib/Hoymiles/src/nrf_hal.cpp index 346a3b395..dd6fef119 100644 --- a/lib/Hoymiles/src/nrf_hal.cpp +++ b/lib/Hoymiles/src/nrf_hal.cpp @@ -108,8 +108,8 @@ uint8_t nrf_hal::write(uint8_t cmd, const uint8_t* buf, uint8_t len) .flags = 0, .cmd = 0, .addr = 0, - .length = ((size_t)len + 1u) << 3, - .rxlength = ((size_t)len + 1u) << 3, + .length = (static_cast(len) + 1u) << 3, + .rxlength = (static_cast(len) + 1u) << 3, .user = NULL, .tx_buffer = data, .rx_buffer = data @@ -138,8 +138,8 @@ uint8_t nrf_hal::write(uint8_t cmd, const uint8_t* buf, uint8_t data_len, uint8_ .flags = 0, .cmd = 0, .addr = 0, - .length = ((size_t)data_len + blank_len + 1u) << 3, - .rxlength = ((size_t)data_len + blank_len + 1u) << 3, + .length = (static_cast(data_len) + static_cast(blank_len) + 1u) << 3, + .rxlength = (static_cast(data_len) + static_cast(blank_len) + 1u) << 3, .user = NULL, .tx_buffer = data, .rx_buffer = data @@ -165,8 +165,8 @@ uint8_t nrf_hal::read(uint8_t cmd, uint8_t* buf, uint8_t len) .flags = 0, .cmd = 0, .addr = 0, - .length = ((size_t)len + 1u) << 3, - .rxlength = ((size_t)len + 1u) << 3, + .length = (static_cast(len) + 1u) << 3, + .rxlength = (static_cast(len) + 1u) << 3, .user = NULL, .tx_buffer = data, .rx_buffer = data @@ -198,8 +198,8 @@ uint8_t nrf_hal::read(uint8_t cmd, uint8_t* buf, uint8_t data_len, uint8_t blank .flags = 0, .cmd = 0, .addr = 0, - .length = ((size_t)data_len + blank_len + 1u) << 3, - .rxlength = ((size_t)data_len + blank_len + 1u) << 3, + .length = (static_cast(data_len) + static_cast(blank_len) + 1u) << 3, + .rxlength = (static_cast(data_len) + static_cast(blank_len) + 1u) << 3, .user = NULL, .tx_buffer = data, .rx_buffer = data diff --git a/src/ETHSPI.cpp b/src/ETHSPI.cpp index 4c78dc3ac..a3299fb2c 100644 --- a/src/ETHSPI.cpp +++ b/src/ETHSPI.cpp @@ -62,7 +62,7 @@ void ETHSPIClass::begin(int8_t pin_sclk, int8_t pin_mosi, int8_t pin_miso, int8_ .duty_cycle_pos = 0, .cs_ena_pretrans = 0, // only 0 supported .cs_ena_posttrans = 0, // only 0 supported - .clock_speed_hz = 20000000, // TODO: check stability + .clock_speed_hz = 20000000, // stable with on OpenDTU Fusion Shield .input_delay_ns = 0, .spics_io_num = pin_cs, .flags = 0, @@ -119,8 +119,8 @@ String ETHSPIClass::macAddress() { uint8_t mac_addr[6] = {0, 0, 0, 0, 0, 0}; esp_eth_ioctl(eth_handle, ETH_CMD_G_MAC_ADDR, mac_addr); - char mac_addr_str[18]; - sprintf(mac_addr_str, "%02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + char mac_addr_str[24]; + snprintf(mac_addr_str, sizeof(mac_addr_str), "%02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); return String(mac_addr_str); } From cb0481c6334b7a0b0ffd0f3bc8a1635a984e3e9d Mon Sep 17 00:00:00 2001 From: LennartF22 <18723691+LennartF22@users.noreply.github.com> Date: Wed, 2 Aug 2023 23:54:51 +0200 Subject: [PATCH 11/11] Remove unnecessary includes to fix include errors on some platforms --- include/ETHSPI.h | 2 +- src/ETHSPI.cpp | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/include/ETHSPI.h b/include/ETHSPI.h index 405ab8eee..18044d5bd 100644 --- a/include/ETHSPI.h +++ b/include/ETHSPI.h @@ -1,7 +1,7 @@ #pragma once #include -//#include +#include class ETHSPIClass { diff --git a/src/ETHSPI.cpp b/src/ETHSPI.cpp index a3299fb2c..1944eec76 100644 --- a/src/ETHSPI.cpp +++ b/src/ETHSPI.cpp @@ -1,12 +1,6 @@ #include "ETHSPI.h" -#include -#include -#include -#include #include -#include -#include "MessageOutput.h" // Functions from WiFiGeneric void tcpipInit();