22
22
#include " SPI.h"
23
23
#include " HardwareSerial.h"
24
24
25
+ #define SPI_PINS_HSPI 0 // Normal HSPI mode (MISO = GPIO12, MOSI = GPIO13, SCLK = GPIO14);
26
+ #define SPI_PINS_HSPI_OVERLAP 1 // HSPI Overllaped in spi0 pins (MISO = SD0, MOSI = SDD1, SCLK = CLK);
27
+
28
+ #define SPI_OVERLAP_SS 0
29
+
30
+
25
31
typedef union {
26
32
uint32_t regValue;
27
33
struct {
@@ -35,12 +41,43 @@ typedef union {
35
41
36
42
SPIClass::SPIClass () {
37
43
useHwCs = false ;
44
+ pinSet = SPI_PINS_HSPI;
45
+ }
46
+
47
+ bool SPIClass::pins (int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
48
+ {
49
+ if (sck == 6 &&
50
+ miso == 7 &&
51
+ mosi == 8 &&
52
+ ss == 0 ) {
53
+ pinSet = SPI_PINS_HSPI_OVERLAP;
54
+ } else if (sck == 14 &&
55
+ miso == 12 &&
56
+ mosi == 13 ) {
57
+ pinSet = SPI_PINS_HSPI;
58
+ } else {
59
+ return false ;
60
+ }
61
+
62
+ return true ;
38
63
}
39
64
40
65
void SPIClass::begin () {
41
- pinMode (SCK, SPECIAL); // /< GPIO14
42
- pinMode (MISO, SPECIAL); // /< GPIO12
43
- pinMode (MOSI, SPECIAL); // /< GPIO13
66
+ switch (pinSet) {
67
+ case SPI_PINS_HSPI_OVERLAP:
68
+ IOSWAP |= (1 << IOSWAP2CS);
69
+ // SPI0E3 |= 0x1; This is in the MP3_DECODER example, but makes the WD kick in here.
70
+ SPI1E3 |= 0x3 ;
71
+
72
+ setHwCs (true );
73
+ break ;
74
+ case SPI_PINS_HSPI:
75
+ default :
76
+ pinMode (SCK, SPECIAL); // /< GPIO14
77
+ pinMode (MISO, SPECIAL); // /< GPIO12
78
+ pinMode (MOSI, SPECIAL); // /< GPIO13
79
+ break ;
80
+ }
44
81
45
82
SPI1C = 0 ;
46
83
setFrequency (1000000 ); // /< 1MHz
@@ -50,24 +87,55 @@ void SPIClass::begin() {
50
87
}
51
88
52
89
void SPIClass::end () {
53
- pinMode (SCK, INPUT);
54
- pinMode (MISO, INPUT);
55
- pinMode (MOSI, INPUT);
56
- if (useHwCs) {
57
- pinMode (SS, INPUT);
90
+ switch (pinSet) {
91
+ case SPI_PINS_HSPI:
92
+ pinMode (SCK, INPUT);
93
+ pinMode (MISO, INPUT);
94
+ pinMode (MOSI, INPUT);
95
+ if (useHwCs) {
96
+ pinMode (SS, INPUT);
97
+ }
98
+ break ;
99
+ case SPI_PINS_HSPI_OVERLAP:
100
+ IOSWAP &= ~(1 << IOSWAP2CS);
101
+ if (useHwCs) {
102
+ SPI1P |= SPIPCS1DIS | SPIPCS0DIS | SPIPCS2DIS;
103
+ pinMode (SPI_OVERLAP_SS, INPUT);
104
+ }
105
+ break ;
58
106
}
59
107
}
60
108
61
109
void SPIClass::setHwCs (bool use) {
62
- if (use) {
63
- pinMode (SS, SPECIAL); // /< GPIO15
64
- SPI1U |= (SPIUCSSETUP | SPIUCSHOLD);
110
+ switch (pinSet) {
111
+ case SPI_PINS_HSPI:
112
+ if (use) {
113
+ pinMode (SS, SPECIAL); // /< GPIO15
114
+ SPI1U |= (SPIUCSSETUP | SPIUCSHOLD);
65
115
} else {
66
- if (useHwCs) {
67
- pinMode (SS, INPUT);
116
+ if (useHwCs) {
117
+ pinMode (SS, INPUT);
68
118
SPI1U &= ~(SPIUCSSETUP | SPIUCSHOLD);
119
+ }
120
+ }
121
+ break ;
122
+ case SPI_PINS_HSPI_OVERLAP:
123
+ if (use) {
124
+ pinMode (SPI_OVERLAP_SS, FUNCTION_1); // GPI0 to SPICS2 mode
125
+ SPI1P &= ~SPIPCS2DIS;
126
+ SPI1P |= SPIPCS1DIS | SPIPCS0DIS;
127
+ SPI1U |= (SPIUCSSETUP | SPIUCSHOLD);
69
128
}
129
+ else {
130
+ if (useHwCs) {
131
+ pinMode (SPI_OVERLAP_SS, INPUT);
132
+ SPI1P |= SPIPCS1DIS | SPIPCS0DIS | SPIPCS2DIS;
133
+ SPI1U &= ~(SPIUCSSETUP | SPIUCSHOLD);
134
+ }
135
+ }
136
+ break ;
70
137
}
138
+
71
139
useHwCs = use;
72
140
}
73
141
@@ -306,7 +374,7 @@ void SPIClass::write32(uint32_t data, bool msb) {
306
374
SPI1W0 = data;
307
375
SPI1CMD |= SPIBUSY;
308
376
}
309
- while (SPI1CMD & SPIBUSY) {}
377
+ while (SPI1CMD & SPIBUSY) {}
310
378
}
311
379
312
380
/* *
0 commit comments