|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
-
-
-
- #ifndef SdSpi_h
- #define SdSpi_h
- #include <Arduino.h>
- #include <SdFatConfig.h>
-
- #if !USE_ARDUINO_SPI_LIBRARY
-
- #ifdef __AVR__
- #if AVR_SOFT_SPI
- #define USE_SOFTWARE_SPI 1
- #elif LEONARDO_SOFT_SPI && defined(__AVR_ATmega32U4__) && !defined(CORE_TEENSY)
- #define USE_SOFTWARE_SPI 1
- #elif MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)\
- ||defined(__AVR_ATmega2560__))
- #define USE_SOFTWARE_SPI 1
- #else
- #define USE_NATIVE_AVR_SPI 1
- #endif
- #endif
-
- #if defined(__arm__) && !defined(CORE_TEENSY)
- #if DUE_SOFT_SPI
- #define USE_SOFTWARE_SPI 1
- #else
-
- #define USE_NATIVE_SAM3X_SPI 1
- #endif
- #endif
-
- #if defined(__arm__) && defined(CORE_TEENSY)
- #if TEENSY3_SOFT_SPI
- #define USE_SOFTWARE_SPI 1
- #else
-
- #define USE_NATIVE_TEENSY3_SPI 1
- #endif
- #endif
- #endif
-
- #ifndef USE_SOFTWARE_SPI
- #define USE_SOFTWARE_SPI 0
- #endif
-
- #ifndef USE_NATIVE_AVR_SPI
- #define USE_NATIVE_AVR_SPI 0
- #endif
-
- #ifndef USE_NATIVE_SAM3X_SPI
- #define USE_NATIVE_SAM3X_SPI 0
- #endif
-
- #ifndef USE_NATIVE_TEENSY3_SPI
- #define USE_NATIVE_TEENSY3_SPI 0
- #endif
-
-
-
- #if !USE_SOFTWARE_SPI
-
- uint8_t const SD_CHIP_SELECT_PIN = SS;
- #else
-
- uint8_t const SD_CHIP_SELECT_PIN = SOFT_SPI_CS_PIN;
- #endif
-
-
-
- class SdSpi {
- public:
-
- void begin();
-
-
- void init(uint8_t spiDivisor);
-
-
- uint8_t receive();
-
-
- uint8_t receive(uint8_t* buf, size_t n);
-
-
- void send(uint8_t data);
-
-
- void send(const uint8_t* buf, size_t n);
- };
-
-
-
-
- #define USE_AVR_NATIVE_SPI_INLINE 1
- #if USE_NATIVE_AVR_SPI && USE_AVR_NATIVE_SPI_INLINE
- inline uint8_t SdSpi::receive() {
- SPDR = 0XFF;
- while (!(SPSR & (1 << SPIF))) {}
- return SPDR;
- }
- inline uint8_t SdSpi::receive(uint8_t* buf, size_t n) {
- if (n-- == 0) return 0;
- SPDR = 0XFF;
- for (size_t i = 0; i < n; i++) {
- while (!(SPSR & (1 << SPIF))) {}
- uint8_t b = SPDR;
- SPDR = 0XFF;
- buf[i] = b;
- }
- while (!(SPSR & (1 << SPIF))) {}
- buf[n] = SPDR;
- return 0;
- }
- inline void SdSpi::send(uint8_t data) {
- SPDR = data;
- while (!(SPSR & (1 << SPIF))) {}
- }
- inline void SdSpi::send(const uint8_t* buf , size_t n) {
- if (n == 0) return;
- SPDR = buf[0];
- if (n > 1) {
- uint8_t b = buf[1];
- size_t i = 2;
- while (1) {
- while (!(SPSR & (1 << SPIF))) {}
- SPDR = b;
- if (i == n) break;
- b = buf[i++];
- }
- }
- while (!(SPSR & (1 << SPIF))) {}
- }
- #endif
- #endif
-
|