Feature: SPIPortManager allows simultaneous use of CMT2300 and Huawei charger
* backport SPIPortManager from @skippermeister * adapt to support ESP32 and ESP32-S3 and ESP32-C3 * use logic to work with SPI numbering as in the official documentation: start with SPI0 and go up to SPI3 * increase Huawei CAN controller stack size to 2000 * increase startup delay for USB_CDC enabled builds to be able to catch bootlogs over USB
This commit is contained in:
parent
51624669b0
commit
df53f34b51
55
include/SPIPortManager.h
Normal file
55
include/SPIPortManager.h
Normal file
@ -0,0 +1,55 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <driver/spi_master.h>
|
||||
|
||||
/**
|
||||
* SPI# to SPI ID and SPI_HOST mapping
|
||||
*
|
||||
* ESP32
|
||||
* | SPI # | SPI ID | SPI_HOST |
|
||||
* | 2 | 2 | 1 |
|
||||
* | 3 | 3 | 2 |
|
||||
*
|
||||
* ESP32-S3
|
||||
* | SPI # | SPI ID | SPI_HOST |
|
||||
* | 2 | 0 | 1 |
|
||||
* | 3 | 1 | 2 |
|
||||
*
|
||||
* ESP32-C3
|
||||
* | SPI # | SPI ID | SPI_HOST |
|
||||
* | 2 | 0 | 1 |
|
||||
*
|
||||
*/
|
||||
|
||||
class SPIPortManagerClass {
|
||||
public:
|
||||
void init();
|
||||
|
||||
std::optional<uint8_t> allocatePort(std::string const& owner);
|
||||
void freePort(std::string const& owner);
|
||||
spi_host_device_t SPIhostNum(uint8_t spi_num);
|
||||
|
||||
private:
|
||||
// the amount of SPIs available on supported ESP32 chips
|
||||
#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S3
|
||||
static size_t constexpr _num_controllers = 4;
|
||||
#else
|
||||
static size_t constexpr _num_controllers = 3;
|
||||
#endif
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3
|
||||
static int8_t constexpr _offset_spi_num = -2; // FSPI=0, HSPI=1
|
||||
static int8_t constexpr _offset_spi_host = 1; // SPI1_HOST=0 but not usable, SPI2_HOST=1 and SPI3_HOST=2, first usable is SPI2_HOST
|
||||
#else
|
||||
static int8_t constexpr _offset_spi_num = 0; // HSPI=2, VSPI=3
|
||||
static int8_t constexpr _offset_spi_host = -1; // SPI1_HOST=0 but not usable, SPI2_HOST=1 and SPI3_HOST=2, first usable is SPI2_HOST
|
||||
#endif
|
||||
|
||||
std::array<std::string, _num_controllers> _ports = { "" };
|
||||
};
|
||||
|
||||
extern SPIPortManagerClass SPIPortManager;
|
||||
@ -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 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(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);
|
||||
}
|
||||
|
||||
/*! ********************************************************
|
||||
|
||||
@ -23,6 +23,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <Arduino.h>
|
||||
#include <driver/spi_master.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -36,7 +37,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 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);
|
||||
|
||||
@ -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 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;
|
||||
_pin_clk = pin_clk;
|
||||
_pin_cs = pin_cs;
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -18,7 +19,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 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);
|
||||
|
||||
@ -128,6 +129,7 @@ private:
|
||||
*/
|
||||
bool _init_radio();
|
||||
|
||||
spi_host_device_t _spi_host;
|
||||
int8_t _pin_sdio;
|
||||
int8_t _pin_clk;
|
||||
int8_t _pin_cs;
|
||||
|
||||
@ -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;
|
||||
@ -9,14 +8,9 @@ SemaphoreHandle_t paramLock = NULL;
|
||||
} 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(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();
|
||||
|
||||
@ -43,8 +37,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 = {
|
||||
@ -61,9 +55,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);
|
||||
}
|
||||
|
||||
|
||||
@ -2,8 +2,9 @@
|
||||
#define __CMT_SPI3_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <driver/spi_master.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 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);
|
||||
|
||||
@ -31,9 +31,9 @@ void HoymilesClass::initNRF(SPIClass* initialisedSpiBus, const uint8_t pinCE, co
|
||||
_radioNrf->init(initialisedSpiBus, pinCE, 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)
|
||||
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(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);
|
||||
}
|
||||
|
||||
void HoymilesClass::loop()
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include <SPI.h>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <driver/spi_master.h>
|
||||
|
||||
#define HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL (2 * 60 * 1000) // 2 minutes
|
||||
#define HOY_SYSTEM_CONFIG_PARA_POLL_MIN_DURATION (4 * 60 * 1000) // at least 4 minutes between sending limit command and read request. Otherwise eventlog entry
|
||||
@ -17,7 +18,7 @@ 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 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);
|
||||
void loop();
|
||||
|
||||
void setMessageOutput(Print* output);
|
||||
@ -54,4 +55,4 @@ private:
|
||||
Print* _messageOutput = &Serial;
|
||||
};
|
||||
|
||||
extern HoymilesClass Hoymiles;
|
||||
extern HoymilesClass Hoymiles;
|
||||
|
||||
@ -83,11 +83,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 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;
|
||||
|
||||
_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();
|
||||
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include <memory>
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
#include <driver/spi_master.h>
|
||||
|
||||
// number of fragments hold in buffer
|
||||
#define FRAGMENT_BUFFER_SIZE 30
|
||||
@ -41,7 +42,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 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);
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include "PowerLimiter.h"
|
||||
#include "Configuration.h"
|
||||
#include "Battery.h"
|
||||
#include "SPIPortManager.h"
|
||||
#include <SPI.h>
|
||||
#include <mcp_can.h>
|
||||
|
||||
@ -35,7 +36,11 @@ void HuaweiCanCommunicationTask(void* parameter) {
|
||||
|
||||
bool HuaweiCanCommClass::init(uint8_t huawei_miso, uint8_t huawei_mosi, uint8_t huawei_clk,
|
||||
uint8_t huawei_irq, uint8_t huawei_cs, uint32_t frequency) {
|
||||
SPI = new SPIClass(HSPI);
|
||||
|
||||
auto oSPInum = SPIPortManager.allocatePort("Huawei CAN");
|
||||
if (!oSPInum) { return false; }
|
||||
|
||||
SPI = new SPIClass(*oSPInum);
|
||||
SPI->begin(huawei_clk, huawei_miso, huawei_mosi, huawei_cs);
|
||||
pinMode(huawei_cs, OUTPUT);
|
||||
digitalWrite(huawei_cs, HIGH);
|
||||
@ -231,7 +236,7 @@ void HuaweiCanClass::updateSettings(uint8_t huawei_miso, uint8_t huawei_mosi, ui
|
||||
_mode = HUAWEI_MODE_AUTO_INT;
|
||||
}
|
||||
|
||||
xTaskCreate(HuaweiCanCommunicationTask,"HUAWEI_CAN_0",1000,NULL,0,&_HuaweiCanCommunicationTaskHdl);
|
||||
xTaskCreate(HuaweiCanCommunicationTask,"HUAWEI_CAN_0",2000,NULL,0,&_HuaweiCanCommunicationTaskHdl);
|
||||
|
||||
MessageOutput.println("[HuaweiCanClass::init] MCP2515 Initialized Successfully!");
|
||||
_initialized = true;
|
||||
|
||||
@ -7,22 +7,9 @@
|
||||
#include "MessageOutput.h"
|
||||
#include "PinMapping.h"
|
||||
#include "SunPosition.h"
|
||||
#include "SPIPortManager.h"
|
||||
#include <Hoymiles.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
|
||||
// HSPI, as it has shifted places for these chip generations
|
||||
// for all generations, this is equivalent to SPI3_HOST in the lower level driver
|
||||
// For ESP32-C2, the only externally usable HW SPI controller is SPI2, its signal names
|
||||
// being prefixed with FSPI.
|
||||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
||||
#define SPI_NRF HSPI
|
||||
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||
#define SPI_NRF FSPI
|
||||
#else
|
||||
#define SPI_NRF VSPI
|
||||
#endif
|
||||
|
||||
InverterSettingsClass InverterSettings;
|
||||
|
||||
InverterSettingsClass::InverterSettingsClass()
|
||||
@ -37,24 +24,32 @@ void InverterSettingsClass::init(Scheduler& scheduler)
|
||||
const PinMapping_t& pin = PinMapping.get();
|
||||
|
||||
// Initialize inverter communication
|
||||
MessageOutput.print("Initialize Hoymiles interface... ");
|
||||
MessageOutput.println("Initialize Hoymiles interface... ");
|
||||
|
||||
Hoymiles.setMessageOutput(&MessageOutput);
|
||||
Hoymiles.init();
|
||||
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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 country mode... ");
|
||||
Hoymiles.getRadioCmt()->setCountryMode(static_cast<CountryModeId_t>(config.Dtu.Cmt.CountryMode));
|
||||
MessageOutput.println(" Setting CMT target frequency... ");
|
||||
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency);
|
||||
auto oSPInum = SPIPortManager.allocatePort("CMT2300A");
|
||||
|
||||
if (oSPInum) {
|
||||
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 country mode... ");
|
||||
Hoymiles.getRadioCmt()->setCountryMode(static_cast<CountryModeId_t>(config.Dtu.Cmt.CountryMode));
|
||||
MessageOutput.println(" Setting CMT target frequency... ");
|
||||
Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency);
|
||||
}
|
||||
}
|
||||
|
||||
MessageOutput.println(" Setting radio PA level... ");
|
||||
|
||||
46
src/SPIPortManager.cpp
Normal file
46
src/SPIPortManager.cpp
Normal file
@ -0,0 +1,46 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#include "SPIPortManager.h"
|
||||
#include "MessageOutput.h"
|
||||
|
||||
SPIPortManagerClass SPIPortManager;
|
||||
static constexpr char TAG[] = "[SPIPortManager]";
|
||||
|
||||
void SPIPortManagerClass::init() {
|
||||
MessageOutput.printf("%s SPI0 and SPI1 reserved by 'Flash and PSRAM'\r\n", TAG);
|
||||
_ports[0] = "Flash";
|
||||
_ports[1] = "PSRAM";
|
||||
}
|
||||
|
||||
std::optional<uint8_t> SPIPortManagerClass::allocatePort(std::string const& owner)
|
||||
{
|
||||
for (size_t i = 0; i < _ports.size(); ++i) {
|
||||
if (_ports[i] != "") {
|
||||
MessageOutput.printf("%s SPI%d already in use by '%s'\r\n", TAG, i, _ports[i].c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
_ports[i] = owner;
|
||||
|
||||
MessageOutput.printf("%s SPI%d now in use by '%s'\r\n", TAG, i, owner.c_str());
|
||||
|
||||
return i + _offset_spi_num;
|
||||
}
|
||||
|
||||
MessageOutput.printf("%s Cannot assign another SPI port to '%s'\r\n", TAG, owner.c_str());
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
void SPIPortManagerClass::freePort(std::string const& owner)
|
||||
{
|
||||
for (size_t i = 0; i < _ports.size(); ++i) {
|
||||
if (_ports[i] != owner) { continue; }
|
||||
|
||||
MessageOutput.printf("%s Freeing SPI%d, owner was '%s'\r\n", TAG, i + _offset_spi_num, owner.c_str());
|
||||
_ports[i] = "";
|
||||
}
|
||||
}
|
||||
|
||||
spi_host_device_t SPIPortManagerClass::SPIhostNum(uint8_t spi_num)
|
||||
{
|
||||
return (spi_host_device_t)(spi_num + _offset_spi_host);
|
||||
}
|
||||
@ -9,6 +9,7 @@
|
||||
#include "Led_Single.h"
|
||||
#include "MessageOutput.h"
|
||||
#include "SerialPortManager.h"
|
||||
#include "SPIPortManager.h"
|
||||
#include "VictronMppt.h"
|
||||
#include "Battery.h"
|
||||
#include "Huawei_can.h"
|
||||
@ -47,7 +48,7 @@ void setup()
|
||||
Serial.begin(SERIAL_BAUDRATE);
|
||||
#if ARDUINO_USB_CDC_ON_BOOT
|
||||
Serial.setTxTimeoutMs(0);
|
||||
delay(100);
|
||||
delay(200);
|
||||
#else
|
||||
while (!Serial)
|
||||
yield();
|
||||
@ -97,7 +98,9 @@ void setup()
|
||||
const auto& pin = PinMapping.get();
|
||||
MessageOutput.println("done");
|
||||
|
||||
// Initialize PortManagers
|
||||
SerialPortManager.init();
|
||||
SPIPortManager.init();
|
||||
|
||||
// Initialize WiFi
|
||||
MessageOutput.print("Initialize Network... ");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user