579e04be25
* Utilize prepoc symbols for SPI pins * Adjusts for GPIO pins when ALTERNATE_PINS is set
108 lines
2.9 KiB
C++
108 lines
2.9 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
|
|
|
|
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_SS, OUTPUT); //VSPI SS
|
|
pinMode(HSPI_SS, OUTPUT); //HSPI SS
|
|
|
|
}
|
|
|
|
// the loop function runs over and over again until power down or reset
|
|
void loop() {
|
|
//use the SPI buses
|
|
vspiCommand();
|
|
hspiCommand();
|
|
delay(100);
|
|
}
|
|
|
|
void vspiCommand() {
|
|
byte data = 0b01010101; // junk data to illustrate usage
|
|
|
|
//use it as you would the regular arduino SPI API
|
|
vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
|
|
digitalWrite(VSPI_SS, LOW); //pull SS slow to prep other end for transfer
|
|
vspi->transfer(data);
|
|
digitalWrite(VSPI_SS, HIGH); //pull ss high to signify end of data transfer
|
|
vspi->endTransaction();
|
|
}
|
|
|
|
void hspiCommand() {
|
|
byte stuff = 0b11001100;
|
|
|
|
hspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
|
|
digitalWrite(HSPI_SS, LOW);
|
|
hspi->transfer(stuff);
|
|
digitalWrite(HSPI_SS, HIGH);
|
|
hspi->endTransaction();
|
|
}
|