24
24
#ifndef SOFTWARE_SPI
25
25
#ifdef USE_SPI_LIB
26
26
#include < SPI.h>
27
+ static SPISettings settings;
27
28
#endif
28
29
// functions for hardware SPI
29
30
/* * Send a byte to the card */
@@ -158,9 +159,15 @@ uint32_t Sd2Card::cardSize(void) {
158
159
// ------------------------------------------------------------------------------
159
160
void Sd2Card::chipSelectHigh (void ) {
160
161
digitalWrite (chipSelectPin_, HIGH);
162
+ #ifdef USE_SPI_LIB
163
+ SPI.endTransaction ();
164
+ #endif
161
165
}
162
166
// ------------------------------------------------------------------------------
163
167
void Sd2Card::chipSelectLow (void ) {
168
+ #ifdef USE_SPI_LIB
169
+ SPI.beginTransaction (settings);
170
+ #endif
164
171
digitalWrite (chipSelectPin_, LOW);
165
172
}
166
173
// ------------------------------------------------------------------------------
@@ -233,7 +240,7 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
233
240
234
241
// set pin modes
235
242
pinMode (chipSelectPin_, OUTPUT);
236
- chipSelectHigh ( );
243
+ digitalWrite (chipSelectPin_, HIGH );
237
244
#ifndef USE_SPI_LIB
238
245
pinMode (SPI_MISO_PIN, INPUT);
239
246
pinMode (SPI_MOSI_PIN, OUTPUT);
@@ -251,16 +258,18 @@ uint8_t Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
251
258
SPSR &= ~(1 << SPI2X);
252
259
#else // USE_SPI_LIB
253
260
SPI.begin ();
254
- #ifdef SPI_CLOCK_DIV128
255
- SPI.setClockDivider (SPI_CLOCK_DIV128);
256
- #else
257
- SPI.setClockDivider (255 );
258
- #endif
261
+ settings = SPISettings (250000 , MSBFIRST, SPI_MODE0);
259
262
#endif // USE_SPI_LIB
260
263
#endif // SOFTWARE_SPI
261
264
262
265
// must supply min of 74 clock cycles with CS high.
266
+ #ifdef USE_SPI_LIB
267
+ SPI.beginTransaction (settings);
268
+ #endif
263
269
for (uint8_t i = 0 ; i < 10 ; i++) spiSend (0XFF );
270
+ #ifdef USE_SPI_LIB
271
+ SPI.endTransaction ();
272
+ #endif
264
273
265
274
chipSelectLow ();
266
275
@@ -497,21 +506,15 @@ uint8_t Sd2Card::setSckRate(uint8_t sckRateID) {
497
506
SPCR |= (sckRateID & 4 ? (1 << SPR1) : 0 )
498
507
| (sckRateID & 2 ? (1 << SPR0) : 0 );
499
508
#else // USE_SPI_LIB
500
- int v;
501
- #ifdef SPI_CLOCK_DIV128
502
509
switch (sckRateID) {
503
- case 0 : v=SPI_CLOCK_DIV2; break ;
504
- case 1 : v=SPI_CLOCK_DIV4; break ;
505
- case 2 : v=SPI_CLOCK_DIV8; break ;
506
- case 3 : v=SPI_CLOCK_DIV16; break ;
507
- case 4 : v=SPI_CLOCK_DIV32; break ;
508
- case 5 : v=SPI_CLOCK_DIV64; break ;
509
- case 6 : v=SPI_CLOCK_DIV128; break ;
510
- }
511
- #else // SPI_CLOCK_DIV128
512
- v = 2 << sckRateID;
513
- #endif // SPI_CLOCK_DIV128
514
- SPI.setClockDivider (v);
510
+ case 0 : settings = SPISettings (25000000 , MSBFIRST, SPI_MODE0); break ;
511
+ case 1 : settings = SPISettings (4000000 , MSBFIRST, SPI_MODE0); break ;
512
+ case 2 : settings = SPISettings (2000000 , MSBFIRST, SPI_MODE0); break ;
513
+ case 3 : settings = SPISettings (1000000 , MSBFIRST, SPI_MODE0); break ;
514
+ case 4 : settings = SPISettings (500000 , MSBFIRST, SPI_MODE0); break ;
515
+ case 5 : settings = SPISettings (250000 , MSBFIRST, SPI_MODE0); break ;
516
+ default : settings = SPISettings (125000 , MSBFIRST, SPI_MODE0);
517
+ }
515
518
#endif // USE_SPI_LIB
516
519
return true ;
517
520
}
0 commit comments