| 
									
										
										
										
											2018-05-02 23:22:56 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 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 <SPI.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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
 | 
					
						
							| 
									
										
										
										
											2018-05-28 13:44:49 +02:00
										 |  |  |   //hspi->begin(0, 2, 4, 33); //SCLK, MISO, MOSI, SS
 | 
					
						
							| 
									
										
										
										
											2018-05-02 23:22:56 +10:00
										 |  |  |    | 
					
						
							|  |  |  |   //initialise hspi with default pins
 | 
					
						
							|  |  |  |   //SCLK = 14, MISO = 12, MOSI = 13, SS = 15
 | 
					
						
							|  |  |  |   hspi->begin();  | 
					
						
							|  |  |  |   //alternatively route through GPIO pins
 | 
					
						
							| 
									
										
										
										
											2018-05-28 13:44:49 +02:00
										 |  |  |   //hspi->begin(25, 26, 27, 32); //SCLK, MISO, MOSI, SS
 | 
					
						
							| 
									
										
										
										
											2018-05-02 23:22:56 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |   //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(); | 
					
						
							|  |  |  | } |