@@ -417,10 +417,32 @@ unsigned long sdGetSectorsCount(uint8_t pdrv)
417
417
}
418
418
419
419
420
+ namespace
421
+ {
420
422
423
+ struct AcquireSPI
424
+ {
425
+ ardu_sdcard_t *card;
426
+ explicit AcquireSPI (ardu_sdcard_t * card)
427
+ : card(card)
428
+ {
429
+ card->spi ->beginTransaction (SPISettings (card->frequency , MSBFIRST, SPI_MODE0));
430
+ }
431
+ AcquireSPI (ardu_sdcard_t * card, int frequency)
432
+ : card(card)
433
+ {
434
+ card->spi ->beginTransaction (SPISettings (frequency, MSBFIRST, SPI_MODE0));
435
+ }
436
+ ~AcquireSPI ()
437
+ {
438
+ card->spi ->endTransaction ();
439
+ }
440
+ private:
441
+ AcquireSPI (AcquireSPI const &);
442
+ AcquireSPI& operator =(AcquireSPI const &);
443
+ };
421
444
422
-
423
-
445
+ }
424
446
425
447
426
448
/*
@@ -438,7 +460,7 @@ DSTATUS ff_sd_initialize(uint8_t pdrv)
438
460
return card->status ;
439
461
}
440
462
441
- card-> spi -> beginTransaction ( SPISettings ( 400000 , MSBFIRST, SPI_MODE0) );
463
+ AcquireSPI card_locked (card, 400000 );
442
464
443
465
digitalWrite (card->ssPin , HIGH);
444
466
for (uint8_t i = 0 ; i < 20 ; i++) {
@@ -538,13 +560,10 @@ DSTATUS ff_sd_initialize(uint8_t pdrv)
538
560
card->frequency = 25000000 ;
539
561
}
540
562
541
- card->spi ->endTransaction ();
542
-
543
563
card->status &= ~STA_NOINIT;
544
564
return card->status ;
545
565
546
566
unknown_card:
547
- card->spi ->endTransaction ();
548
567
card->type = CARD_UNKNOWN;
549
568
return card->status ;
550
569
}
@@ -562,15 +581,13 @@ DRESULT ff_sd_read(uint8_t pdrv, uint8_t* buffer, DWORD sector, UINT count)
562
581
}
563
582
DRESULT res = RES_OK;
564
583
565
- card-> spi -> beginTransaction ( SPISettings ( card-> frequency , MSBFIRST, SPI_MODE0) );
584
+ AcquireSPI lock ( card);
566
585
567
586
if (count > 1 ) {
568
587
res = sdReadSectors (pdrv, (char *)buffer, sector, count) ? RES_OK : RES_ERROR;
569
588
} else {
570
589
res = sdReadSector (pdrv, (char *)buffer, sector) ? RES_OK : RES_ERROR;
571
590
}
572
-
573
- card->spi ->endTransaction ();
574
591
return res;
575
592
}
576
593
@@ -586,24 +603,25 @@ DRESULT ff_sd_write(uint8_t pdrv, const uint8_t* buffer, DWORD sector, UINT coun
586
603
}
587
604
DRESULT res = RES_OK;
588
605
589
- card-> spi -> beginTransaction ( SPISettings ( card-> frequency , MSBFIRST, SPI_MODE0) );
606
+ AcquireSPI lock ( card);
590
607
591
608
if (count > 1 ) {
592
609
res = sdWriteSectors (pdrv, (const char *)buffer, sector, count) ? RES_OK : RES_ERROR;
593
610
}
594
611
res = sdWriteSector (pdrv, (const char *)buffer, sector) ? RES_OK : RES_ERROR;
595
-
596
- card->spi ->endTransaction ();
597
612
return res;
598
613
}
599
614
600
615
DRESULT ff_sd_ioctl (uint8_t pdrv, uint8_t cmd, void * buff)
601
616
{
602
617
switch (cmd) {
603
618
case CTRL_SYNC:
604
- if (sdSelectCard (pdrv)) {
605
- sdDeselectCard (pdrv);
606
- return RES_OK;
619
+ {
620
+ AcquireSPI lock (s_cards[pdrv]);
621
+ if (sdSelectCard (pdrv)) {
622
+ sdDeselectCard (pdrv);
623
+ return RES_OK;
624
+ }
607
625
}
608
626
return RES_ERROR;
609
627
case GET_SECTOR_COUNT:
@@ -722,6 +740,7 @@ bool sdcard_mount(uint8_t pdrv, const char* path)
722
740
esp_vfs_fat_unregister_path (path);
723
741
return false ;
724
742
}
743
+ AcquireSPI lock (card);
725
744
card->sectors = sdGetSectorsCount (pdrv);
726
745
return true ;
727
746
}
0 commit comments