@@ -177,36 +177,65 @@ static spi_t _spi_bus_array[] = {
177
177
static bool spiDetachBus (void * bus ){
178
178
uint8_t spi_num = (int )bus - 1 ;
179
179
spi_t * spi = & _spi_bus_array [spi_num ];
180
- if (spi -> dev -> clock .val != 0 ){
181
- log_d ("Stopping SPI BUS" );
180
+
181
+ if (spi -> dev -> clock .val == 0 ){
182
+ log_d ("SPI bus already stopped" );
183
+ return true;
184
+ }
185
+ else if (spi -> sck == -1 || (spi -> miso == -1 && spi -> mosi == -1 )){
186
+ log_d ("Stopping SPI bus" );
182
187
spiStopBus (spi );
188
+
189
+ spiDetachSCK (spi );
190
+ spiDetachMISO (spi );
191
+ spiDetachMOSI (spi );
192
+ spiDetachSS (spi );
193
+ spi = NULL ;
194
+ return true;
183
195
}
196
+ return true;
197
+ }
198
+
199
+ static bool spiDetachBus_SCK (void * bus ){
200
+ uint8_t spi_num = (int )bus - 1 ;
201
+ spi_t * spi = & _spi_bus_array [spi_num ];
184
202
if (spi -> sck != -1 ){
185
- log_d ( "SPI detach SCK pin %d" , spi -> sck );
186
- spiDetachSCK ( spi , spi -> sck );
203
+ spiDetachSCK ( spi );
204
+ spiDetachBus ( bus );
187
205
}
206
+ return true;
207
+ }
208
+
209
+ static bool spiDetachBus_MISO (void * bus ){
210
+ uint8_t spi_num = (int )bus - 1 ;
211
+ spi_t * spi = & _spi_bus_array [spi_num ];
188
212
if (spi -> miso != -1 ){
189
- log_d ( "SPI detach MISO pin %d" , spi -> miso );
190
- spiDetachMISO ( spi , spi -> miso );
213
+ spiDetachMISO ( spi );
214
+ spiDetachBus ( bus );
191
215
}
216
+ return true;
217
+ }
218
+
219
+ static bool spiDetachBus_MOSI (void * bus ){
220
+ uint8_t spi_num = (int )bus - 1 ;
221
+ spi_t * spi = & _spi_bus_array [spi_num ];
192
222
if (spi -> mosi != -1 ){
193
- log_d ( "SPI detach MOSI pin %d" , spi -> mosi );
194
- spiDetachMOSI ( spi , spi -> mosi );
223
+ spiDetachMOSI ( spi );
224
+ spiDetachBus ( bus );
195
225
}
226
+ return true;
227
+ }
228
+
229
+ static bool spiDetachBus_SS (void * bus ){
230
+ uint8_t spi_num = (int )bus - 1 ;
231
+ spi_t * spi = & _spi_bus_array [spi_num ];
196
232
if (spi -> ss != -1 ){
197
- log_d ( "SPI detach SS pin %d" , spi -> ss );
198
- spiDetachSS ( spi , spi -> ss );
233
+ spiDetachSS ( spi );
234
+ spiDetachBus ( bus );
199
235
}
200
- //set SPI to NULL, as all pins are already detached
201
- if (spi -> sck == -1 && spi -> miso == -1 && spi -> mosi == -1 && spi -> ss == -1 ){
202
- log_d ("Set spi handle to NULL" );
203
- spi = NULL ;
204
- return true;
205
- }
206
- return false;
236
+ return true;
207
237
}
208
238
209
-
210
239
bool spiAttachSCK (spi_t * spi , int8_t sck )
211
240
{
212
241
if (!spi || sck < 0 ) {
@@ -220,7 +249,7 @@ bool spiAttachSCK(spi_t * spi, int8_t sck)
220
249
pinMatrixOutAttach (sck , SPI_CLK_IDX (spi -> num ), false, false);
221
250
spi -> sck = sck ;
222
251
if (!perimanSetPinBus (sck , ESP32_BUS_TYPE_SPI_MASTER_SCK , (void * )(spi -> num + 1 ), spi -> num , -1 )){
223
- spiDetachBus ((void * )(spi -> num + 1 ));
252
+ spiDetachBus_SCK ((void * )(spi -> num + 1 ));
224
253
log_e ("Failed to set pin bus to SPI for pin %d" , sck );
225
254
return false;
226
255
}
@@ -236,13 +265,11 @@ bool spiAttachMISO(spi_t * spi, int8_t miso)
236
265
if (bus != NULL && !perimanClearPinBus (miso )){
237
266
return false;
238
267
}
239
- SPI_MUTEX_LOCK ();
240
268
pinMode (miso , INPUT );
241
269
pinMatrixInAttach (miso , SPI_MISO_IDX (spi -> num ), false);
242
270
spi -> miso = miso ;
243
- SPI_MUTEX_UNLOCK ();
244
271
if (!perimanSetPinBus (miso , ESP32_BUS_TYPE_SPI_MASTER_MISO , (void * )(spi -> num + 1 ), spi -> num , -1 )){
245
- spiDetachBus ((void * )(spi -> num + 1 ));
272
+ spiDetachBus_MISO ((void * )(spi -> num + 1 ));
246
273
log_e ("Failed to set pin bus to SPI for pin %d" , miso );
247
274
return false;
248
275
}
@@ -262,102 +289,114 @@ bool spiAttachMOSI(spi_t * spi, int8_t mosi)
262
289
pinMatrixOutAttach (mosi , SPI_MOSI_IDX (spi -> num ), false, false);
263
290
spi -> mosi = mosi ;
264
291
if (!perimanSetPinBus (mosi , ESP32_BUS_TYPE_SPI_MASTER_MOSI , (void * )(spi -> num + 1 ), spi -> num , -1 )){
265
- spiDetachBus ((void * )(spi -> num + 1 ));
292
+ spiDetachBus_MOSI ((void * )(spi -> num + 1 ));
266
293
log_e ("Failed to set pin bus to SPI for pin %d" , mosi );
267
294
return false;
268
295
}
269
296
return true;
270
297
}
271
298
272
- bool spiDetachSCK (spi_t * spi , int8_t sck )
299
+ bool spiDetachSCK (spi_t * spi )
273
300
{
274
- if (!spi || sck < 0 ) {
301
+ if (!spi ) {
275
302
return false;
276
303
}
277
- pinMatrixOutDetach (sck , false, false);
278
- spi -> sck = -1 ;
279
- perimanClearPinBus (sck );
304
+ int8_t sck = spi -> sck ;
305
+ if (sck != -1 ) {
306
+ pinMatrixOutDetach (sck , false, false);
307
+ spi -> sck = -1 ;
308
+ perimanClearPinBus (sck );
309
+ }
280
310
return true;
281
311
}
282
312
283
- bool spiDetachMISO (spi_t * spi , int8_t miso )
313
+ bool spiDetachMISO (spi_t * spi )
284
314
{
285
- if (!spi || miso < 0 ) {
315
+ if (!spi ) {
286
316
return false;
287
317
}
288
- pinMatrixInDetach (SPI_MISO_IDX (spi -> num ), false, false);
289
- spi -> miso = -1 ;
290
- perimanClearPinBus (miso );
318
+ int8_t miso = spi -> miso ;
319
+ if (miso != -1 ) {
320
+ pinMatrixInDetach (SPI_MISO_IDX (spi -> num ), false, false);
321
+ spi -> miso = -1 ;
322
+ perimanClearPinBus (miso );
323
+ }
291
324
return true;
292
325
}
293
326
294
- bool spiDetachMOSI (spi_t * spi , int8_t mosi )
327
+ bool spiDetachMOSI (spi_t * spi )
295
328
{
296
- if (!spi || mosi < 0 ) {
329
+ if (!spi ) {
297
330
return false;
298
331
}
299
- pinMatrixOutDetach (mosi , false, false);
300
- spi -> mosi = -1 ;
301
- perimanClearPinBus (mosi );
332
+ int8_t mosi = spi -> mosi ;
333
+ if (mosi != -1 ) {
334
+ pinMatrixOutDetach (mosi , false, false);
335
+ spi -> mosi = -1 ;
336
+ perimanClearPinBus (mosi );
337
+ }
302
338
return true;
303
339
}
304
340
305
- bool spiAttachSS (spi_t * spi , uint8_t cs_num , int8_t ss )
341
+ bool spiAttachSS (spi_t * spi , uint8_t ss_num , int8_t ss )
306
342
{
307
- if (!spi || ss < 0 || cs_num > 2 ) {
343
+ if (!spi || ss < 0 || ss_num > 2 ) {
308
344
return false;
309
345
}
310
- void * bus = perimanGetPinBus (ss , ESP32_BUS_TYPE_SPI_MASTER_CS );
346
+ void * bus = perimanGetPinBus (ss , ESP32_BUS_TYPE_SPI_MASTER_SS );
311
347
if (bus != NULL && !perimanClearPinBus (ss )){
312
348
return false;
313
349
}
314
350
pinMode (ss , OUTPUT );
315
- pinMatrixOutAttach (ss , SPI_SS_IDX (spi -> num , cs_num ), false, false);
316
- spiEnableSSPins (spi , (1 << cs_num ));
351
+ pinMatrixOutAttach (ss , SPI_SS_IDX (spi -> num , ss_num ), false, false);
352
+ spiEnableSSPins (spi , (1 << ss_num ));
317
353
spi -> ss = ss ;
318
- if (!perimanSetPinBus (ss , ESP32_BUS_TYPE_SPI_MASTER_CS , (void * )(spi -> num + 1 ), spi -> num , -1 )){
319
- spiDetachBus ((void * )(spi -> num + 1 ));
354
+ if (!perimanSetPinBus (ss , ESP32_BUS_TYPE_SPI_MASTER_SS , (void * )(spi -> num + 1 ), spi -> num , -1 )){
355
+ spiDetachBus_SS ((void * )(spi -> num + 1 ));
320
356
log_e ("Failed to set pin bus to SPI for pin %d" , ss );
321
357
return false;
322
358
}
323
359
return true;
324
360
}
325
361
326
- bool spiDetachSS (spi_t * spi , int8_t ss )
362
+ bool spiDetachSS (spi_t * spi )
327
363
{
328
- if (!spi || ss < 0 ) {
364
+ if (!spi ) {
329
365
return false;
330
366
}
331
- pinMatrixOutDetach (ss , false, false);
332
- spi -> ss = -1 ;
333
- perimanClearPinBus (ss );
367
+ int8_t ss = spi -> ss ;
368
+ if (ss != -1 ) {
369
+ pinMatrixOutDetach (ss , false, false);
370
+ spi -> ss = -1 ;
371
+ perimanClearPinBus (ss );
372
+ }
334
373
return true;
335
374
}
336
375
337
- void spiEnableSSPins (spi_t * spi , uint8_t cs_mask )
376
+ void spiEnableSSPins (spi_t * spi , uint8_t ss_mask )
338
377
{
339
378
if (!spi ) {
340
379
return ;
341
380
}
342
381
SPI_MUTEX_LOCK ();
343
382
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
344
- spi -> dev -> misc .val &= ~(cs_mask & SPI_CS_MASK_ALL );
383
+ spi -> dev -> misc .val &= ~(ss_mask & SPI_SS_MASK_ALL );
345
384
#else
346
- spi -> dev -> pin .val &= ~(cs_mask & SPI_CS_MASK_ALL );
385
+ spi -> dev -> pin .val &= ~(ss_mask & SPI_SS_MASK_ALL );
347
386
#endif
348
387
SPI_MUTEX_UNLOCK ();
349
388
}
350
389
351
- void spiDisableSSPins (spi_t * spi , uint8_t cs_mask )
390
+ void spiDisableSSPins (spi_t * spi , uint8_t ss_mask )
352
391
{
353
392
if (!spi ) {
354
393
return ;
355
394
}
356
395
SPI_MUTEX_LOCK ();
357
396
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
358
- spi -> dev -> misc .val |= (cs_mask & SPI_CS_MASK_ALL );
397
+ spi -> dev -> misc .val |= (ss_mask & SPI_SS_MASK_ALL );
359
398
#else
360
- spi -> dev -> pin .val |= (cs_mask & SPI_CS_MASK_ALL );
399
+ spi -> dev -> pin .val |= (ss_mask & SPI_SS_MASK_ALL );
361
400
#endif
362
401
SPI_MUTEX_UNLOCK ();
363
402
}
@@ -578,10 +617,10 @@ spi_t * spiStartBus(uint8_t spi_num, uint32_t clockDiv, uint8_t dataMode, uint8_
578
617
return NULL ;
579
618
}
580
619
581
- perimanSetBusDeinit (ESP32_BUS_TYPE_SPI_MASTER_SCK , spiDetachBus );
582
- perimanSetBusDeinit (ESP32_BUS_TYPE_SPI_MASTER_MISO , spiDetachBus );
583
- perimanSetBusDeinit (ESP32_BUS_TYPE_SPI_MASTER_MOSI , spiDetachBus );
584
- perimanSetBusDeinit (ESP32_BUS_TYPE_SPI_MASTER_CS , spiDetachBus );
620
+ perimanSetBusDeinit (ESP32_BUS_TYPE_SPI_MASTER_SCK , spiDetachBus_SCK );
621
+ perimanSetBusDeinit (ESP32_BUS_TYPE_SPI_MASTER_MISO , spiDetachBus_MISO );
622
+ perimanSetBusDeinit (ESP32_BUS_TYPE_SPI_MASTER_MOSI , spiDetachBus_MOSI );
623
+ perimanSetBusDeinit (ESP32_BUS_TYPE_SPI_MASTER_SS , spiDetachBus_SS );
585
624
586
625
spi_t * spi = & _spi_bus_array [spi_num ];
587
626
0 commit comments