120
120
#define SD_DBG 0
121
121
122
122
SDFileSystem::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 ) {
124
124
_cs = 1 ;
125
+
126
+ // Set default to 100kHz for initialisation and 1MHz for data transfer
127
+ _init_sck = 100000 ;
128
+ _transfer_sck = 1000000 ;
125
129
}
126
130
127
131
#define R1_IDLE_STATE (1 << 0 )
@@ -143,8 +147,8 @@ SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs,
143
147
#define SDCARD_V2HC 3
144
148
145
149
int 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 );
148
152
_cs = 1 ;
149
153
for (int i = 0 ; i < 16 ; i++) {
150
154
_spi.write (0xFF );
@@ -200,21 +204,30 @@ int SDFileSystem::initialise_card_v2() {
200
204
}
201
205
202
206
int 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);
205
213
_sectors = _sd_sectors ();
206
214
207
215
// Set block length to 512 (CMD16)
208
216
if (_cmd (16 , 512 ) != 0 ) {
209
217
debug (" Set 512-byte block timed out\n " );
210
218
return 1 ;
211
219
}
212
-
213
- _spi.frequency (1000000 ); // Set to 1MHz for data transfer
220
+
221
+ // Set SCK for data transfer
222
+ _spi.frequency (_transfer_sck);
214
223
return 0 ;
215
224
}
216
225
217
226
int SDFileSystem::disk_write (const uint8_t *buffer, uint64_t block_number) {
227
+ if (!_is_initialized) {
228
+ return -1 ;
229
+ }
230
+
218
231
// set write address for single block (CMD24)
219
232
if (_cmd (24 , block_number * cdv) != 0 ) {
220
233
return 1 ;
@@ -226,6 +239,10 @@ int SDFileSystem::disk_write(const uint8_t *buffer, uint64_t block_number) {
226
239
}
227
240
228
241
int SDFileSystem::disk_read (uint8_t *buffer, uint64_t block_number) {
242
+ if (!_is_initialized) {
243
+ return -1 ;
244
+ }
245
+
229
246
// set read address for single block (CMD17)
230
247
if (_cmd (17 , block_number * cdv) != 0 ) {
231
248
return 1 ;
@@ -236,7 +253,15 @@ int SDFileSystem::disk_read(uint8_t *buffer, uint64_t block_number) {
236
253
return 0 ;
237
254
}
238
255
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
+
240
265
int SDFileSystem::disk_sync () { return 0 ; }
241
266
uint64_t SDFileSystem::disk_sectors () { return _sectors; }
242
267
0 commit comments