Пример из CORE предлагает использование по одному устройству на каждой из шин, а если надо несколько устройств на одной из шин.
Есть у кого положительный опыт?
Ты випил уже или как? Вроде ещё не вечер а мысли уже не стройно вытекают.
других нет )))
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
тебе никто не запрещает использовать
так это понятно что каждому свой, я и спрашиваю - как (в коде), а на HSPI у меня дисплей )))
Так каждому и назначай
пример можешь привести?
И как это ограничивает количество устройств? Или у дисплея CS отсутствует?
оставим в покое HSPI он работает, мне надо несколько различных устройств на vspi и не только выбор SS но и установка параметров SPI пока споткнулся на выборе нужного девайса, пример этого не предоставлят, а в вашем лживом С++ я мало что понимаю
установку параметров SPI для каждого отдельно.
И если параметры разные - придется заново устанавливать при каждом переключении от устройства к устройству
Гугли про SPI Transaction
в принципе разобрался, заработало )))
Вопрос остался как к этому прилепить ардуиновские библиотеки, они понятия не имеют о твоих инстанцах
для большинства плат ардуино есть тип 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 заюзать, для начала
ну значит и
есть
Не факт, смотреть нужно