Skip to content

Commit

Permalink
implement a SPIPortManager like the SerialPortManager
Browse files Browse the repository at this point in the history
  • Loading branch information
skippermeister committed Jul 26, 2024
1 parent b6ae8da commit a642c9d
Show file tree
Hide file tree
Showing 20 changed files with 182 additions and 49 deletions.
2 changes: 1 addition & 1 deletion docs/DeviceProfiles/FusionV2.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"bms_wakeup": -1
},
"charger":{
"can0_rx": 12,
"can0_rx": 13,
"can0_tx": 14
},
"mcp2515":{
Expand Down
62 changes: 52 additions & 10 deletions docs/DeviceProfiles/my_very_special_board.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,8 @@
"mosi":23
},
"cmt":{},
"display":{
"type":5,
"data":13,
"clk":14,
"reset":12
},
"led":{
"rgb":15
},
"display":{},
"led":{},
"victron":{
"rs232_rx":22,
"rs232_tx":21
Expand Down Expand Up @@ -49,6 +42,55 @@
}
},
{
"name":"NRF+CMT+SmartShunt+MPPT",
"nrf24":{
"clk":18,
"cs":5,
"en":2,
"irq":34,
"miso":19,
"mosi":23
},
"cmt":{
"clk": 12,
"cs": 13,
"fcs": 14,
"sdio": 15,
"gpio2":-1,
"gpio3": -1
},
"display":{},
"led":{},
"victron":{
"rs232_rx":22,
"rs232_tx":21
},
"battery":{
"rs232_rx":16,
"rs232_tx":17,
"bms_wakeup":-1
},
"charger":{
"can0_rx":26,
"can0_tx":27
},
"mcp2515":{
"miso":-1,
"mosi":-1,
"clk":-1,
"irq":-1,
"cs":-1
},
"batteryConnectedInverter":{
"pre_charge":32,
"full_power":33
},
"powermeter":{
"sdm_rs485_tx":4,
"sdm_rs485_rx":39
}
},
{
"name":"my_very_special_board Pylontech via RS485 Type1",
"nrf24":{
"clk":18,
Expand Down Expand Up @@ -187,4 +229,4 @@
"sml_rs232_rx":39
}
}
]
]
8 changes: 4 additions & 4 deletions include/MeanWell_can.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,14 +210,14 @@ class MeanWellCanClass {
#endif

enum class NPB_Model_t {
NPB_450_48,
NPB_750_48,
NPB_1200_48,
NPB_1700_48,
NPB_450_24,
NPB_450_48,
NPB_750_24,
NPB_750_48,
NPB_1200_24,
NPB_1200_48,
NPB_1700_24,
NPB_1700_48,
NPB_unknown
};
NPB_Model_t _model = NPB_Model_t::NPB_450_48;
Expand Down
25 changes: 25 additions & 0 deletions include/SPIPortManager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once

#include <array>
#include <optional>
#include <string>

class SPIPortManagerClass {
public:
void init();

std::optional<uint8_t> allocatePort(std::string const& owner);
void freePort(std::string const& owner);

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 = 4;
#else
static size_t constexpr _num_controllers = 3;
#endif
std::array<std::string, _num_controllers> _ports = { "" };
};

extern SPIPortManagerClass SPIPortManager;
4 changes: 2 additions & 2 deletions lib/CMT2300a/cmt2300a_hal.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
* @name CMT2300A_InitSpi
* @desc Initializes the CMT2300A SPI interface.
* *********************************************************/
void CMT2300A_InitSpi(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 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)
{
cmt_spi3_init(pin_sdio, pin_clk, pin_cs, pin_fcs, spi_speed);
cmt_spi3_init(spi_host, pin_sdio, pin_clk, pin_cs, pin_fcs, spi_speed);
}

/*! ********************************************************
Expand Down
2 changes: 1 addition & 1 deletion lib/CMT2300a/cmt2300a_hal.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ extern "C" {
#define CMT2300A_GetTickCount() millis()
/* ************************************************************************ */

void CMT2300A_InitSpi(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 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);

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

CMT2300A::CMT2300A(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 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)
{
_spi_host = spi_host;
_pin_sdio = pin_sdio;
_pin_clk = pin_clk;
_pin_cs = pin_cs;
Expand Down Expand Up @@ -266,7 +267,7 @@ void CMT2300A::flush_rx(void)

bool CMT2300A::_init_pins()
{
CMT2300A_InitSpi(_pin_sdio, _pin_clk, _pin_cs, _pin_fcs, _spi_speed);
CMT2300A_InitSpi(_spi_host, _pin_sdio, _pin_clk, _pin_cs, _pin_fcs, _spi_speed);

return true; // assuming pins are connected properly
}
Expand Down
3 changes: 2 additions & 1 deletion lib/CMT2300a/cmt2300wrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ enum FrequencyBand_t {

class CMT2300A {
public:
CMT2300A(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 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);

bool begin(void);

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

int8_t _spi_host;
int8_t _pin_sdio;
int8_t _pin_clk;
int8_t _pin_cs;
Expand Down
10 changes: 5 additions & 5 deletions lib/CMT2300a/cmt_spi3.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ SemaphoreHandle_t paramLock = NULL;

spi_device_handle_t spi_reg, spi_fifo;

void cmt_spi3_init(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 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)
{
paramLock = xSemaphoreCreateMutex();

Expand All @@ -43,8 +43,8 @@ void cmt_spi3_init(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin
.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_initialize(spi_host, &buscfg, SPI_DMA_DISABLED));
ESP_ERROR_CHECK(spi_bus_add_device(spi_host, &devcfg, &spi_reg));

// FiFo
spi_device_interface_config_t devcfg2 = {
Expand All @@ -61,9 +61,9 @@ void cmt_spi3_init(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin
.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(spi_host, &devcfg2, &spi_fifo));

esp_rom_gpio_connect_out_signal(pin_sdio, spi_periph_signal[SPI_CMT].spid_out, true, false);
esp_rom_gpio_connect_out_signal(pin_sdio, spi_periph_signal[spi_host].spid_out, true, false);
delay(100);
}

Expand Down
2 changes: 1 addition & 1 deletion lib/CMT2300a/cmt_spi3.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <stdint.h>

void cmt_spi3_init(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 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_write(const uint8_t addr, const uint8_t dat);
uint8_t cmt_spi3_read(const uint8_t addr);
Expand Down
4 changes: 2 additions & 2 deletions lib/Hoymiles/src/Hoymiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ void HoymilesClass::initNRF(SPIClass* initialisedSpiBus, const uint8_t pinCE, co
}

#ifdef USE_RADIO_CMT
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)
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)
{
_radioCmt->init(pin_sdio, pin_clk, pin_cs, pin_fcs, pin_gpio2, pin_gpio3);
_radioCmt->init(spi_host, pin_sdio, pin_clk, pin_cs, pin_fcs, pin_gpio2, pin_gpio3);
}
#endif

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 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 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);
#endif
void loop();

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

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

_radio.reset(new CMT2300A(pin_sdio, pin_clk, pin_cs, pin_fcs));
_radio.reset(new CMT2300A(spi_host, pin_sdio, pin_clk, pin_cs, pin_fcs));

_radio->begin();

Expand Down
2 changes: 1 addition & 1 deletion lib/Hoymiles/src/HoymilesRadio_CMT.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ struct CountryFrequencyList_t {

class HoymilesRadio_CMT : public HoymilesRadio {
public:
void init(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 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 loop();
void setPALevel(const int8_t paLevel);
void setInverterTargetFrequency(const uint32_t frequency);
Expand Down
2 changes: 1 addition & 1 deletion platformio_override.ini
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ build_flags = ${env.build_flags}
-DNRF24_PIN_IRQ=34 ; GPIO34 input only
-DNRF24_PIN_CE=2
-DNRF24_PIN_CS=5
; -DUSE_RADIO_CMT=1
-DUSE_RADIO_CMT=1
-DVICTRON_PIN_TX=21 ; HW Serial Pins for Victron (RS232)
-DVICTRON_PIN_RX=22
-DVICTRON_PIN_TX2=-1 ; HW Serial Pins for Victron 2 (RS232)
Expand Down
5 changes: 4 additions & 1 deletion src/BatteryCanReceiver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "MessageOutput.h"
#include "PinMapping.h"
#include <driver/twai.h>
#include "SPIPortManager.h"

bool BatteryCanReceiver::init(char const* providerName)
{
Expand All @@ -26,8 +27,10 @@ bool BatteryCanReceiver::init(char const* providerName)

_mcp2515_irq = pin.mcp2515_irq;

auto oSPInum = SPIPortManager.allocatePort("MCP2515");
if (!oSPInum) { return false; }
MessageOutput.printf(", init SPI... ");
SPI = new SPIClass(HSPI);
SPI = new SPIClass(*oSPInum);
SPI->begin(pin.mcp2515_clk, pin.mcp2515_miso, pin.mcp2515_mosi, pin.mcp2515_cs);
MessageOutput.printf("done");

Expand Down
36 changes: 25 additions & 11 deletions src/InverterSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "PinMapping.h"
#include "SunPosition.h"
#include <Hoymiles.h>
#include "SPIPortManager.h"

// the NRF shall use the second externally usable HW SPI controller
// for ESP32 that is the so-called VSPI, for ESP32-S2/S3 it is now called implicitly
Expand Down Expand Up @@ -42,23 +43,36 @@ void InverterSettingsClass::init(Scheduler& scheduler)
const PinMapping_t& pin = PinMapping.get();

// Initialize inverter communication
MessageOutput.print("Initialize Hoymiles interface... ");
if (PinMapping.isValidNrf24Config()
if (
#ifdef USE_RADIO_NRF
PinMapping.isValidNrf24Config()
#endif
#if defined(USE_RADIO_NRF) && defined(USE_RADIO_CMT)
||
#endif
#ifdef USE_RADIO_CMT
|| PinMapping.isValidCmt2300Config()
PinMapping.isValidCmt2300Config()
#endif
) {
)
{
#ifdef USE_RADIO_NRF
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);
auto oSPInum = SPIPortManager.allocatePort("NRF24");
if (oSPInum) {
SPIClass* spiClass = new SPIClass(*oSPInum);
spiClass->begin(pin.nrf24_clk, pin.nrf24_miso, pin.nrf24_mosi, pin.nrf24_cs);
Hoymiles.initNRF(spiClass, pin.nrf24_en, pin.nrf24_irq);
}
}

#endif
#ifdef USE_RADIO_CMT
if (PinMapping.isValidCmt2300Config()) {
Hoymiles.initCMT(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);
auto oSPInum = SPIPortManager.allocatePort("CMT2300A");
if (oSPInum) { // SPInum_HOST is SPInum-1
Hoymiles.initCMT(*oSPInum - 1, 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);
}
}
#endif
MessageOutput.println(" Setting radio PA level... ");
Expand Down
9 changes: 6 additions & 3 deletions src/MeanWell_can.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <Hoymiles.h>
#include <math.h>
#include <AsyncJson.h>
#include "SPIPortManager.h"

#include <Preferences.h>
Preferences preferences;
Expand Down Expand Up @@ -120,9 +121,11 @@ void MeanWellCanClass::updateSettings()
if (!enable())
return;
#else
MessageOutput.printf("MCP2515 CAN miso = %d, mosi = %d, clk = %d, irq = %d, cs = %d, power_pin = %d. ", pin.mcp2515_miso, pin.mcp2515_mosi, pin.mcp2515_clk, pin.mcp2515_irq, pin.mcp2515_cs;
MessageOutput.printf("MCP2515 CAN: miso = %d, mosi = %d, clk = %d, irq = %d, cs = %d, power_pin = %d. ", pin.mcp2515_miso, pin.mcp2515_mosi, pin.mcp2515_clk, pin.mcp2515_irq, pin.mcp2515_cs;
auto oSPInum = SPIPortManager.allocatePort("MCP2515");
if (!oSPInum) { return; }

spi = new SPIClass(HSPI);
spi = new SPIClass(*oSPInum);
spi->begin(pin.mcp2515_clk, pin.mcp2515_miso, pin.mcp2515_mosi, pin.mcp2515_cs);
pinMode(pin.mcp2515_cs, OUTPUT);
digitalWrite(pin.mcp2515_cs, HIGH);
Expand Down Expand Up @@ -359,7 +362,7 @@ void MeanWellCanClass::onReceive(uint8_t* frame, uint8_t len)

case 0x0050: // READ_VIN 2 bytes Input voltage read value (format: value, F=0.1)
_rp.inputVoltage = scaleValue(readUnsignedInt16(frame + 2), 0.1f);
if (_model == NPB_Model_t::NPB_450_48) _rp.inputVoltage = 230.0;
if (_model < NPB_Model_t::NPB_1200_24) _rp.inputVoltage = 230.0;
_lastUpdate = millis();
#ifdef MEANWELL_DEBUG_ENABLED
if (_verboseLogging) MessageOutput.printf("%s InputVoltage: %.1fV\r\n", TAG, _rp.inputVoltage);
Expand Down
Loading

0 comments on commit a642c9d

Please sign in to comment.