Skip to content

Commit b4c8531

Browse files
committed
optimize SPI
1 parent 33f02ae commit b4c8531

File tree

2 files changed

+33
-23
lines changed

2 files changed

+33
-23
lines changed

libraries/SPI/src/SPI.cpp

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -145,67 +145,77 @@ void sipeed_spi_deinit(spi_device_num_t spi_num)
145145
sysctl_clock_disable( sysctl_clock_t(SYSCTL_CLOCK_SPI0 + spi_num));
146146
}
147147

148+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
149+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
148150

149151

150152
typedef struct{
151153
int8_t pin;
152154
bool used;
153155
} spi_ss_t;
154156

155-
static spi_ss_t g_ss_table[4]={
156-
{.pin = -1, .used = false},
157-
{.pin = -1, .used = false},
158-
{.pin = -1, .used = false},
159-
{.pin = -1, .used = false}
157+
static spi_ss_t g_ss_table[2][4]={
158+
{//SPI0
159+
{.pin = -1, .used = false},
160+
{.pin = -1, .used = false},
161+
{.pin = -1, .used = false},
162+
{.pin = -1, .used = false}
163+
},
164+
{//SPI1
165+
{.pin = -1, .used = false},
166+
{.pin = -1, .used = false},
167+
{.pin = -1, .used = false},
168+
{.pin = -1, .used = false}
169+
}
160170
};
161171

162-
int8_t getSsByPin(int8_t pin)
172+
int8_t getSsByPin(uint8_t spi, int8_t pin)
163173
{
164174
uint8_t i;
165175

166176
if(pin<0)
167177
return -1;
168178
for(i=0; i<4; ++i)
169179
{
170-
if(g_ss_table[i].used && g_ss_table[i].pin == pin)
180+
if(g_ss_table[spi][i].used && g_ss_table[spi][i].pin == pin)
171181
return i;
172182
}
173183
return -1;
174184
}
175185

176-
int8_t getSsNumLast()
186+
int8_t getSsNumLast(uint8_t spi)
177187
{
178188
uint8_t i=0, count=0;
179189
for(i=0; i<4; ++i)
180190
{
181-
if(!g_ss_table[i].used)
191+
if(!g_ss_table[spi][i].used)
182192
++count;
183193
}
184194
return count;
185195
}
186196

187-
bool checkSs(int8_t ss)
197+
bool checkSs(uint8_t spi, int8_t ss)
188198
{
189199
int8_t ssPeriph;
190200
if( ss < 0) // not use ss
191201
return true;
192-
ssPeriph = getSsByPin(ss);
202+
ssPeriph = getSsByPin(spi, ss);
193203
if(ssPeriph >= 0)
194204
return true;
195-
if(getSsNumLast() > 0)
205+
if(getSsNumLast(spi) > 0)
196206
return true;
197207
return false;
198208
}
199209

200-
int8_t setSs(int8_t pin)
210+
int8_t setSs(uint8_t spi, int8_t pin)
201211
{
202212
uint8_t i=0;
203213
for(i=0; i<4; ++i)
204214
{
205-
if(!g_ss_table[i].used)
215+
if(!g_ss_table[spi][i].used)
206216
{
207-
g_ss_table[i].used = true;
208-
g_ss_table[i].pin = pin;
217+
g_ss_table[spi][i].used = true;
218+
g_ss_table[spi][i].pin = pin;
209219
return i;
210220
}
211221
}
@@ -217,9 +227,9 @@ int8_t setSs(int8_t pin)
217227
* @param mosi must >= 0
218228
* @param ss -1: not use hardware ss
219229
*/
220-
bool checkPinParam(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
230+
bool checkPinParam(uint8_t spi, int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
221231
{
222-
if(!checkSs(ss))
232+
if(!checkSs(spi, ss))
223233
return false;
224234
//TODO:
225235
return true;
@@ -275,7 +285,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
275285
mosi = _mosi;
276286
ss = _ss;
277287
}
278-
configASSERT(checkPinParam(sck, miso, mosi, ss));
288+
configASSERT(checkPinParam(_spiNum, sck, miso, mosi, ss));
279289

280290
if(_spiNum == SPI_SOFT)
281291
{
@@ -288,7 +298,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
288298
fpioa_set_function(sck, FUNC_SPI0_SCLK);
289299
if( ss >= 0)
290300
{
291-
fpioa_function_t a = (fpioa_function_t)(FUNC_SPI0_SS0+setSs(ss));
301+
fpioa_function_t a = (fpioa_function_t)(FUNC_SPI0_SS0+setSs(_spiNum, ss));
292302
fpioa_set_function(ss, a);
293303
}
294304
fpioa_set_function(mosi, FUNC_SPI0_D0);
@@ -300,7 +310,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
300310
fpioa_set_function(sck, FUNC_SPI1_SCLK);
301311
if( ss >= 0)
302312
{
303-
fpioa_set_function(ss, (fpioa_function_t)(FUNC_SPI1_SS0+setSs(ss)));
313+
fpioa_set_function(ss, (fpioa_function_t)(FUNC_SPI1_SS0+setSs(_spiNum, ss)));
304314
}
305315
fpioa_set_function(mosi, FUNC_SPI1_D0);
306316
if(miso>=0)
@@ -310,7 +320,7 @@ void SPIClass::begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
310320
_miso = miso;
311321
_sck = sck;
312322
_ss = ss;
313-
_ssPeriph = getSsByPin(ss);
323+
_ssPeriph = getSsByPin(_spiNum, ss);
314324
if(_ssPeriph<0)
315325
_ssPeriph = 0; // default to cs0 TODO: optimize?
316326
spi_init(spi_device_num_t(_spiNum), spi_work_mode_t(_dataMode), SPI_FF_STANDARD, 8, 0);

libraries/Sipeed_ST7789/examples/basic_display/basic_display.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <Sipeed_ST7789.h>
22

3-
SPIClass spi_(SPI0);
3+
SPIClass spi_(SPI0); // MUST be SPI0 for Maix series on board LCD
44
Sipeed_ST7789 lcd(320, 240, spi_);
55

66

0 commit comments

Comments
 (0)