Skip to content

Commit 9e4b77d

Browse files
committed
update example to detect sd card on the fly
1 parent 44b0910 commit 9e4b77d

File tree

1 file changed

+80
-15
lines changed

1 file changed

+80
-15
lines changed

examples/MassStorage/msc_external_flash_sdcard/msc_external_flash_sdcard.ino

Lines changed: 80 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
#include "Adafruit_SPIFlash.h"
2525
#include "Adafruit_TinyUSB.h"
2626

27+
//--------------------------------------------------------------------+
28+
// External Flash Config
29+
//--------------------------------------------------------------------+
30+
2731
// Uncomment to run example with FRAM
2832
// #define FRAM_CS A5
2933
// #define FRAM_SPI SPI
@@ -55,27 +59,41 @@
5559

5660
Adafruit_SPIFlash flash(&flashTransport);
5761

58-
// File system object on external flash from SdFat
62+
// External Flash File system
5963
FatFileSystem fatfs;
6064

61-
const int chipSelect = 10;
65+
//--------------------------------------------------------------------+
66+
// SDCard Config
67+
//--------------------------------------------------------------------+
6268

63-
// File system on SD Card
69+
#if defined(ARDUINO_PYPORTAL_M4) || defined(ARDUINO_PYPORTAL_M4_TITANO)
70+
// PyPortal has on-board card reader
71+
#define SDCARD_CS 32
72+
#define SDCARD_DETECT 33
73+
#else
74+
#define SDCARD_CS 10
75+
// no detect
76+
#endif
77+
78+
// SDCard File system
6479
SdFat sd;
6580

6681
// USB Mass Storage object
6782
Adafruit_USBD_MSC usb_msc;
6883

6984
// Set to true when PC write to flash
7085
bool sd_changed = false;
86+
bool sd_inited = false;
7187
bool flash_changed = false;
7288

7389
// the setup function runs once when you press reset or power the board
7490
void setup()
7591
{
7692
pinMode(LED_BUILTIN, OUTPUT);
7793

78-
// MSC with 2 Logical Units
94+
Serial.begin(115200);
95+
96+
// MSC with 2 Logical Units: LUN0: External Flash, LUN1: SDCard
7997
usb_msc.setMaxLun(2);
8098

8199
usb_msc.setID(0, "Adafruit", "External Flash", "1.0");
@@ -98,21 +116,43 @@ void setup()
98116
flash_changed = true; // to print contents initially
99117

100118
//------------- Lun 1 for SD card -------------//
101-
if ( sd.begin(chipSelect, SD_SCK_MHZ(50)) )
102-
{
103-
uint32_t block_count = sd.card()->cardSize();
104-
usb_msc.setCapacity(1, block_count, 512);
105-
usb_msc.setReadWriteCallback(1, sdcard_read_cb, sdcard_write_cb, sdcard_flush_cb);
106-
usb_msc.setUnitReady(1, true);
119+
#ifdef SDCARD_DETECT
120+
// DETECT pin is available, detect card present on the fly with test unit ready
121+
pinMode(SDCARD_DETECT, INPUT);
122+
usb_msc.setReadyCallback(1, sdcard_ready_callback);
123+
#else
124+
// no DETECT pin, card must be inserted when powered on
125+
init_sdcard();
126+
sd_inited = true;
127+
usb_msc.setUnitReady(1, true);
128+
#endif
129+
130+
// while ( !Serial ) delay(10); // wait for native usb
131+
Serial.println("Adafruit TinyUSB Mass Storage External Flash + SD Card example");
132+
delay(1000);
133+
}
134+
135+
bool init_sdcard(void)
136+
{
137+
Serial.print("Init SDCard ... ");
107138

108-
sd_changed = true; // to print contents initially
139+
if ( !sd.begin(SDCARD_CS, SD_SCK_MHZ(50)) )
140+
{
141+
Serial.print("Failed");
142+
return false;
109143
}
110144

111-
Serial.begin(115200);
112-
//while ( !Serial ) delay(10); // wait for native usb
145+
uint32_t block_count = sd.card()->cardSize();
146+
usb_msc.setCapacity(1, block_count, 512);
147+
usb_msc.setReadWriteCallback(1, sdcard_read_cb, sdcard_write_cb, sdcard_flush_cb);
113148

114-
Serial.println("Adafruit TinyUSB Mass Storage External Flash + SD Card example");
115-
delay(1000);
149+
sd_changed = true; // to print contents initially
150+
151+
Serial.print("OK, Card size = ");
152+
Serial.print(block_count * 512 / (1024*1024));
153+
Serial.println(" MB");
154+
155+
return true;
116156
}
117157

118158
void print_rootdir(File* rdir)
@@ -204,6 +244,31 @@ void sdcard_flush_cb (void)
204244
digitalWrite(LED_BUILTIN, LOW);
205245
}
206246

247+
#ifdef SDCARD_DETECT
248+
// Invoked when received Test Unit Ready command.
249+
// return true allowing host to read/write this LUN e.g SD card inserted
250+
bool sdcard_ready_callback(void)
251+
{
252+
// Card is inserted
253+
if ( digitalRead(SDCARD_DETECT) == HIGH )
254+
{
255+
// init SD card if not already
256+
if ( !sd_inited )
257+
{
258+
sd_inited = init_sdcard();
259+
}
260+
}else
261+
{
262+
sd_inited = false;
263+
usb_msc.setReadWriteCallback(1, NULL, NULL, NULL);
264+
}
265+
266+
Serial.println(sd_inited);
267+
268+
return sd_inited;
269+
}
270+
#endif
271+
207272
//--------------------------------------------------------------------+
208273
// External Flash callbacks
209274
//--------------------------------------------------------------------+

0 commit comments

Comments
 (0)