120120#define SD_DBG 0
121121
122122SDFileSystem::SDFileSystem (PinName mosi, PinName miso, PinName sclk, PinName cs, const char * name) :
123- FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) {
123+ FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs), _is_initialized( 0 ) {
124124 _cs = 1 ;
125+
126+ // Set default to 100kHz for initialisation and 1MHz for data transfer
127+ _init_sck = 100000 ;
128+ _transfer_sck = 1000000 ;
125129}
126130
127131#define R1_IDLE_STATE (1 << 0 )
@@ -143,8 +147,8 @@ SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs,
143147#define SDCARD_V2HC 3
144148
145149int SDFileSystem::initialise_card () {
146- // Set to 100kHz for initialisation, and clock card with cs = 1
147- _spi.frequency (100000 );
150+ // Set to SCK for initialisation, and clock card with cs = 1
151+ _spi.frequency (_init_sck );
148152 _cs = 1 ;
149153 for (int i = 0 ; i < 16 ; i++) {
150154 _spi.write (0xFF );
@@ -200,21 +204,30 @@ int SDFileSystem::initialise_card_v2() {
200204}
201205
202206int SDFileSystem::disk_initialize () {
203- int i = initialise_card ();
204- debug_if (SD_DBG, " init card = %d\n " , i);
207+ _is_initialized = initialise_card ();
208+ if (_is_initialized == 0 ) {
209+ debug (" Fail to initialize card\n " );
210+ return 1 ;
211+ }
212+ debug_if (SD_DBG, " init card = %d\n " , _is_initialized);
205213 _sectors = _sd_sectors ();
206214
207215 // Set block length to 512 (CMD16)
208216 if (_cmd (16 , 512 ) != 0 ) {
209217 debug (" Set 512-byte block timed out\n " );
210218 return 1 ;
211219 }
212-
213- _spi.frequency (1000000 ); // Set to 1MHz for data transfer
220+
221+ // Set SCK for data transfer
222+ _spi.frequency (_transfer_sck);
214223 return 0 ;
215224}
216225
217226int SDFileSystem::disk_write (const uint8_t *buffer, uint64_t block_number) {
227+ if (!_is_initialized) {
228+ return -1 ;
229+ }
230+
218231 // set write address for single block (CMD24)
219232 if (_cmd (24 , block_number * cdv) != 0 ) {
220233 return 1 ;
@@ -226,6 +239,10 @@ int SDFileSystem::disk_write(const uint8_t *buffer, uint64_t block_number) {
226239}
227240
228241int SDFileSystem::disk_read (uint8_t *buffer, uint64_t block_number) {
242+ if (!_is_initialized) {
243+ return -1 ;
244+ }
245+
229246 // set read address for single block (CMD17)
230247 if (_cmd (17 , block_number * cdv) != 0 ) {
231248 return 1 ;
@@ -236,7 +253,15 @@ int SDFileSystem::disk_read(uint8_t *buffer, uint64_t block_number) {
236253 return 0 ;
237254}
238255
239- int SDFileSystem::disk_status () { return 0 ; }
256+ int SDFileSystem::disk_status () {
257+ // FATFileSystem::disk_status() returns 0 when initialized
258+ if (_is_initialized) {
259+ return 0 ;
260+ } else {
261+ return 1 ;
262+ }
263+ }
264+
240265int SDFileSystem::disk_sync () { return 0 ; }
241266uint64_t SDFileSystem::disk_sectors () { return _sectors; }
242267
0 commit comments