Skip to content

Commit

Permalink
fix: SPIPortmanager for ESP32S3 more generic (2.Test)
Browse files Browse the repository at this point in the history
  • Loading branch information
skippermeister committed Jul 31, 2024
1 parent a2c91ef commit e00ffa3
Show file tree
Hide file tree
Showing 12 changed files with 41 additions and 19 deletions.
31 changes: 25 additions & 6 deletions include/SPIPortManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,23 @@
#include <array>
#include <optional>
#include <string>
#include <driver/spi_master.h>

/**
* SPI# to SPI ID and SPI_HOST mapping
*
* ESP32-S3
* | SPI # | SPI ID | SPI_HOST |
* | 0 | 0 | 0 |
* | 1 | 1 | 1 |
* | 2 | 3 | 2 |
*
* ESP32
* | SPI # | SPI ID | SPI_HOST |
* | 0 | 1 | 0 |
* | 1 | 2 | 1 |
* | 2 | 3 | 2 |
*/

class SPIPortManagerClass {
public:
Expand All @@ -12,22 +29,24 @@ class SPIPortManagerClass {
std::optional<uint8_t> allocatePort(std::string const& owner);
void freePort(std::string const& owner);

spi_host_device_t SPIhostNum(uint8_t spi_num) { return (spi_host_device_t)(spi_num + _offset_spi_num); }

private:

// the amount of SPIs available on supported ESP32 chips
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
static size_t constexpr _num_controllers = 2;
#else
static size_t constexpr _num_controllers = 1;
#endif
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3
static int8_t constexpr _start_spi_num = 0;
static int8_t constexpr _offset_spi_num = 1;
static int8_t constexpr _start_spi_num = 0; // FSPI=0, HSPI=1
static int8_t constexpr _offset_spi_num = 1; // SPI1_HOST=0 but not usable, SPI2_HOST=1 and SPI3_HOST=2, first usable is SPI2_HOST
#else
static int8_t constexpr _start_spi_num = 2;
static int8_t constexpr _offset_spi_num = -1;
static int8_t constexpr _start_spi_num = 2; // HSPI=2, VSPI=3
static int8_t constexpr _offset_spi_num = -1; // SPI1_HOST=0 but not usable, SPI2_HOST=1 and SPI3_HOST=2, first usable is SPI2_HOST
#endif

private:

std::array<std::string, _num_controllers> _ports = { "" };
};

Expand Down
2 changes: 1 addition & 1 deletion lib/CMT2300a/cmt2300a_hal.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
* @name CMT2300A_InitSpi
* @desc Initializes the CMT2300A SPI interface.
* *********************************************************/
void CMT2300A_InitSpi(const int8_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed)
void CMT2300A_InitSpi(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed)
{
cmt_spi3_init(spi_host, pin_sdio, pin_clk, pin_cs, pin_fcs, spi_speed);
}
Expand Down
3 changes: 2 additions & 1 deletion lib/CMT2300a/cmt2300a_hal.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include <stdint.h>
#include <Arduino.h>
#include <driver/spi_master.h>

#ifdef __cplusplus
extern "C" {
Expand All @@ -36,7 +37,7 @@ extern "C" {
#define CMT2300A_GetTickCount() millis()
/* ************************************************************************ */

void CMT2300A_InitSpi(const int8_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed);
void CMT2300A_InitSpi(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed);

uint8_t CMT2300A_ReadReg(const uint8_t addr);
void CMT2300A_WriteReg(const uint8_t addr, const uint8_t dat);
Expand Down
2 changes: 1 addition & 1 deletion lib/CMT2300a/cmt2300wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include "cmt2300a_params_860.h"
#include "cmt2300a_params_900.h"

CMT2300A::CMT2300A(const int8_t spi_host, const uint8_t pin_sdio, const uint8_t pin_clk, const uint8_t pin_cs, const uint8_t pin_fcs, const uint32_t spi_speed)
CMT2300A::CMT2300A(const spi_host_device_t spi_host, const uint8_t pin_sdio, const uint8_t pin_clk, const uint8_t pin_cs, const uint8_t pin_fcs, const uint32_t spi_speed)
{
_spi_host = spi_host;
_pin_sdio = pin_sdio;
Expand Down
5 changes: 3 additions & 2 deletions lib/CMT2300a/cmt2300wrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#pragma once

#include <stdint.h>
#include <driver/spi_master.h>

#define CMT2300A_ONE_STEP_SIZE 2500 // frequency channel step size for fast frequency hopping operation: One step size is 2.5 kHz.
#define FH_OFFSET 100 // value * CMT2300A_ONE_STEP_SIZE = channel frequency offset
Expand All @@ -18,7 +19,7 @@ enum FrequencyBand_t {

class CMT2300A {
public:
CMT2300A(const int8_t spi_host, const uint8_t pin_sdio, const uint8_t pin_clk, const uint8_t pin_cs, const uint8_t pin_fcs, const uint32_t _spi_speed = CMT_SPI_SPEED);
CMT2300A(const spi_host_device_t spi_host, const uint8_t pin_sdio, const uint8_t pin_clk, const uint8_t pin_cs, const uint8_t pin_fcs, const uint32_t _spi_speed = CMT_SPI_SPEED);

bool begin(void);

Expand Down Expand Up @@ -128,7 +129,7 @@ class CMT2300A {
*/
bool _init_radio();

int8_t _spi_host;
spi_host_device_t _spi_host;
int8_t _pin_sdio;
int8_t _pin_clk;
int8_t _pin_cs;
Expand Down
3 changes: 1 addition & 2 deletions lib/CMT2300a/cmt_spi3.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#include "cmt_spi3.h"
#include <Arduino.h>
#include <driver/spi_master.h>
#include <esp_rom_gpio.h> // for esp_rom_gpio_connect_out_signal

SemaphoreHandle_t paramLock = NULL;
Expand All @@ -16,7 +15,7 @@ SemaphoreHandle_t paramLock = NULL;

spi_device_handle_t spi_reg, spi_fifo;

void cmt_spi3_init(const int8_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed)
void cmt_spi3_init(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed)
{
paramLock = xSemaphoreCreateMutex();

Expand Down
3 changes: 2 additions & 1 deletion lib/CMT2300a/cmt_spi3.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
#define __CMT_SPI3_H

#include <stdint.h>
#include <driver/spi_master.h>

void cmt_spi3_init(const int8_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed);
void cmt_spi3_init(const spi_host_device_t spi_host, const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const uint32_t spi_speed);

void cmt_spi3_write(const uint8_t addr, const uint8_t dat);
uint8_t cmt_spi3_read(const uint8_t addr);
Expand Down
2 changes: 1 addition & 1 deletion lib/Hoymiles/src/Hoymiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ void HoymilesClass::initNRF(SPIClass* initialisedSpiBus, const uint8_t pinCE, co
}

#ifdef USE_RADIO_CMT
void HoymilesClass::initCMT(const int8_t spi_host, 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 HoymilesClass::initCMT(const spi_host_device_t spi_host, 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)
{
_radioCmt->init(spi_host, pin_sdio, pin_clk, pin_cs, pin_fcs, pin_gpio2, pin_gpio3);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Hoymiles/src/Hoymiles.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class HoymilesClass {
void init();
void initNRF(SPIClass* initialisedSpiBus, const uint8_t pinCE, const uint8_t pinIRQ);
#ifdef USE_RADIO_CMT
void initCMT(const int8_t spi_host, 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 initCMT(const spi_host_device_t spi_host, 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);
#endif
void loop();

Expand Down
2 changes: 1 addition & 1 deletion lib/Hoymiles/src/HoymilesRadio_CMT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ bool HoymilesRadio_CMT::cmtSwitchDtuFreq(const uint32_t to_frequency)
return true;
}

void HoymilesRadio_CMT::init(const int8_t spi_host, 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 HoymilesRadio_CMT::init(const spi_host_device_t spi_host, 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)
{
_dtuSerial.u64 = 0;

Expand Down
3 changes: 2 additions & 1 deletion lib/Hoymiles/src/HoymilesRadio_CMT.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "commands/CommandAbstract.h"
#include "types.h"
#include <Arduino.h>
#include <driver/spi_master.h>
#include <cmt2300wrapper.h>
#include <memory>
#include <queue>
Expand Down Expand Up @@ -41,7 +42,7 @@ struct CountryFrequencyList_t {

class HoymilesRadio_CMT : public HoymilesRadio {
public:
void init(const int8_t spi_host, 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 init(const spi_host_device_t spi_host, 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 loop();
void setPALevel(const int8_t paLevel);
void setInverterTargetFrequency(const uint32_t frequency);
Expand Down
2 changes: 1 addition & 1 deletion src/InverterSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ void InverterSettingsClass::init(Scheduler& scheduler)
if (PinMapping.isValidCmt2300Config()) {
auto oSPInum = SPIPortManager.allocatePort("CMT2300A");
if (oSPInum) {
Hoymiles.initCMT(*oSPInum + SPIPortManagerClass::_offset_spi_num, pin.cmt_sdio, pin.cmt_clk, pin.cmt_cs, pin.cmt_fcs, pin.cmt_gpio2, pin.cmt_gpio3);
Hoymiles.initCMT(SPIPortManager.SPIhostNum(*oSPInum), pin.cmt_sdio, pin.cmt_clk, pin.cmt_cs, pin.cmt_fcs, pin.cmt_gpio2, pin.cmt_gpio3);
MessageOutput.println(" Setting CMT target frequency... ");
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency);
}
Expand Down

0 comments on commit e00ffa3

Please sign in to comment.