diff --git a/libraries/SPI/examples/SPI_Multiple_Buses/SPI_Multiple_Buses.ino b/libraries/SPI/examples/SPI_Multiple_Buses/SPI_Multiple_Buses.ino new file mode 100644 index 00000000000..fadb165ddf0 --- /dev/null +++ b/libraries/SPI/examples/SPI_Multiple_Buses/SPI_Multiple_Buses.ino @@ -0,0 +1,77 @@ + + +/* 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 HSPI, leaving VSPI 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 + +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 + + //initialise vspi with default pins + //SCLK = 18, MISO = 19, MOSI = 23, SS = 5 + vspi->begin(); + //alternatively route through GPIO pins of your choice + //hspi->begin(5,6,7,8); //SCLK, MISO, MOSI, SS + + //initialise hspi with default pins + //SCLK = 14, MISO = 12, MOSI = 13, SS = 15 + hspi->begin(); + //alternatively route through GPIO pins + //hspi->begin(1,2,3,4); //SCLK, MISO, MOSI, SS + + //set up slave select pins as outputs as the Arduino API + //doesn't handle automatically pulling SS low + pinMode(5, OUTPUT); //VSPI SS + pinMode(15, 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(5, LOW); //pull SS slow to prep other end for transfer + vspi->transfer(data); + digitalWrite(5, 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(15, LOW); + hspi->transfer(stuff); + digitalWrite(15, HIGH); + hspi->endTransaction(); +} diff --git a/libraries/SPI/examples/SPI_Multiple_Buses/multiple_bus_output.PNG b/libraries/SPI/examples/SPI_Multiple_Buses/multiple_bus_output.PNG new file mode 100644 index 00000000000..02b89f6a001 Binary files /dev/null and b/libraries/SPI/examples/SPI_Multiple_Buses/multiple_bus_output.PNG differ