forked from espressif/arduino-esp32
* SPI.h add new call to return a SS pin number used. As code example states, the SS pin needs to be explicitly set for output for SPI to work, but the pin number have to be coded in addition to the SPI logic in the library, which means this duplicates code. It is much better to just be able to get the pin number from library itself. * Update SPI_Multiple_Buses.ino to use new pinSS method Simplify the example case, to show usage of pinSS method. This also simplifies the example, removing duplicated code.
100 lines
2.7 KiB
C++
100 lines
2.7 KiB
C++
|
|
|
|
/* The ESP32 has four SPi buses, however as of right now only two of
|
|
* them are available to use, HSPI and VSPI. Simply using the SPI API
|
|
* as illustrated in Arduino examples will use VSPI, leaving HSPI unused.
|
|
*
|
|
* However if we simply intialise two instance of the SPI class for both
|
|
* of these buses both can be used. However when just using these the Arduino
|
|
* way only will actually be outputting at a time.
|
|
*
|
|
* Logic analyser capture is in the same folder as this example as
|
|
* "multiple_bus_output.png"
|
|
*
|
|
* created 30/04/2018 by Alistair Symonds
|
|
*/
|
|
#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
|
|
#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();
|
|
}
|