ESP32 Multiple Buses - как использовать несколько различных устройств на одной из шин

Пример из CORE предлагает использование по одному устройству на каждой из шин, а если надо несколько устройств на одной из шин.
Есть у кого положительный опыт?

Ты випил уже или как? Вроде ещё не вечер а мысли уже не стройно вытекают.

3 лайка

других нет )))

PS а сотня постов в битве над 13 битом тебя не покоробили?

PPS уточню, есть пример, как на vspi посадить SD карточку и еще пяток различных устройств?

#include <SPI.h>

// Define ALTERNATE_PINS to use non-standard GPIO pins for SPI bus

#ifdef ALTERNATE_PINS
  #define VSPI_MISO   2
  #define VSPI_MOSI   4
  #define VSPI_SCLK   0
  #define VSPI_SS     33

  #define HSPI_MISO   26
  #define HSPI_MOSI   27
  #define HSPI_SCLK   25
  #define HSPI_SS     32
#else
  #define VSPI_MISO   MISO
  #define VSPI_MOSI   MOSI
  #define VSPI_SCLK   SCK
  #define VSPI_SS     SS

  #define HSPI_MISO   12
  #define HSPI_MOSI   13
  #define HSPI_SCLK   14
  #define HSPI_SS     15
#endif

#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
#define VSPI FSPI
#endif

static const int spiClk = 1000000; // 1 MHz

//uninitalised pointers to SPI objects
SPIClass * vspi = NULL;
SPIClass * hspi = NULL;

void setup() {
  //initialise two instances of the SPIClass attached to VSPI and HSPI respectively
  vspi = new SPIClass(VSPI);
  hspi = new SPIClass(HSPI);
  
  //clock miso mosi ss

#ifndef ALTERNATE_PINS
  //initialise vspi with default pins
  //SCLK = 18, MISO = 19, MOSI = 23, SS = 5
  vspi->begin();
#else
  //alternatively route through GPIO pins of your choice
  vspi->begin(VSPI_SCLK, VSPI_MISO, VSPI_MOSI, VSPI_SS); //SCLK, MISO, MOSI, SS
#endif

#ifndef ALTERNATE_PINS
  //initialise hspi with default pins
  //SCLK = 14, MISO = 12, MOSI = 13, SS = 15
  hspi->begin();
#else
  //alternatively route through GPIO pins
  hspi->begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_SS); //SCLK, MISO, MOSI, SS
#endif

  //set up slave select pins as outputs as the Arduino API
  //doesn't handle automatically pulling SS low
  pinMode(vspi->pinSS(), OUTPUT); //VSPI SS
  pinMode(hspi->pinSS(), OUTPUT); //HSPI SS

}

// the loop function runs over and over again until power down or reset
void loop() {
  //use the SPI buses
  spiCommand(vspi, 0b01010101); // junk data to illustrate usage
  spiCommand(hspi, 0b11001100);
  delay(100);
}

void spiCommand(SPIClass *spi, byte data) {
  //use it as you would the regular arduino SPI API
  spi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(spi->pinSS(), LOW); //pull SS slow to prep other end for transfer
  spi->transfer(data);
  digitalWrite(spi->pinSS(), HIGH); //pull ss high to signify end of data transfer
  spi->endTransaction();
}

Как обычно. Для каждого устройства свой SS. Да и HSPI тебе никто не запрещает использовать

1 лайк

так это понятно что каждому свой, я и спрашиваю - как (в коде), а на HSPI у меня дисплей )))

Так каждому и назначай

пример можешь привести?

И как это ограничивает количество устройств? Или у дисплея CS отсутствует?

оставим в покое HSPI он работает, мне надо несколько различных устройств на vspi и не только выбор SS но и установка параметров SPI пока споткнулся на выборе нужного девайса, пример этого не предоставлят, а в вашем лживом С++ я мало что понимаю

установку параметров SPI для каждого отдельно.
И если параметры разные - придется заново устанавливать при каждом переключении от устройства к устройству

Гугли про SPI Transaction

1 лайк

в принципе разобрался, заработало )))
Вопрос остался как к этому прилепить ардуиновские библиотеки, они понятия не имеют о твоих инстанцах

для большинства плат ардуино есть тип SPIClass, в котором все это есть
например в СТМ32 это имеется

так в коде оно и есть:

SPIClass * vspi = NULL;
SPIClass * hspi = NULL;

Дописать ))

легко сказать…

А что такого? Ищешь метод, где делается собственно отправка, и вместо (условно)

digitalWrite(csPin, LOW);
_spi->transfer(spidata[i - 1]);
digitalWrite(csPin, HIGH);

пишешь

_spi->beginTransaction(SPISettings(spi_frequensy, MSBFIRST, SPI_MODE0));
digitalWrite(csPin, LOW);
_spi->transfer(spidata[i - 1]);
digitalWrite(csPin, HIGH);
_spi->endTransaction();

Только данные в beginTransaction подставляешь свои

Надо попробовать TFT_eSPI библиотеку через hspi заюзать, для начала

ну значит и

есть

Не факт, смотреть нужно