Adafruit_SPIDevice.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include <SPI.h>
  2. #ifndef Adafruit_SPIDevice_h
  3. #define Adafruit_SPIDevice_h
  4. // some modern SPI definitions don't have BitOrder enum
  5. #if (defined(__AVR__) && !defined(ARDUINO_ARCH_MEGAAVR)) || \
  6. defined(ESP8266) || defined(TEENSYDUINO) || defined(SPARK) || \
  7. defined(ARDUINO_ARCH_SPRESENSE) || defined(MEGATINYCORE) || \
  8. defined(DXCORE) || defined(ARDUINO_AVR_ATmega4809) || \
  9. defined(ARDUINO_AVR_ATmega4808) || defined(ARDUINO_AVR_ATmega3209) || \
  10. defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \
  11. defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \
  12. defined(ARDUINO_AVR_ATmega808)
  13. typedef enum _BitOrder {
  14. SPI_BITORDER_MSBFIRST = MSBFIRST,
  15. SPI_BITORDER_LSBFIRST = LSBFIRST,
  16. } BitOrder;
  17. #elif defined(ESP32) || defined(__ASR6501__)
  18. // some modern SPI definitions don't have BitOrder enum and have different SPI
  19. // mode defines
  20. typedef enum _BitOrder {
  21. SPI_BITORDER_MSBFIRST = SPI_MSBFIRST,
  22. SPI_BITORDER_LSBFIRST = SPI_LSBFIRST,
  23. } BitOrder;
  24. #else
  25. // Some platforms have a BitOrder enum but its named MSBFIRST/LSBFIRST
  26. #define SPI_BITORDER_MSBFIRST MSBFIRST
  27. #define SPI_BITORDER_LSBFIRST LSBFIRST
  28. #endif
  29. #if defined(__AVR__) || defined(TEENSYDUINO)
  30. typedef volatile uint8_t BusIO_PortReg;
  31. typedef uint8_t BusIO_PortMask;
  32. #define BUSIO_USE_FAST_PINIO
  33. #elif defined(ESP8266) || defined(ESP32) || defined(__SAM3X8E__) || \
  34. defined(ARDUINO_ARCH_SAMD)
  35. typedef volatile uint32_t BusIO_PortReg;
  36. typedef uint32_t BusIO_PortMask;
  37. #define BUSIO_USE_FAST_PINIO
  38. #elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \
  39. !defined(ARDUINO_ARCH_MBED)
  40. typedef volatile uint32_t BusIO_PortReg;
  41. typedef uint32_t BusIO_PortMask;
  42. #if not defined(__ASR6501__)
  43. #define BUSIO_USE_FAST_PINIO
  44. #endif
  45. #else
  46. #undef BUSIO_USE_FAST_PINIO
  47. #endif
  48. /**! The class which defines how we will talk to this device over SPI **/
  49. class Adafruit_SPIDevice {
  50. public:
  51. Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000,
  52. BitOrder dataOrder = SPI_BITORDER_MSBFIRST,
  53. uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = &SPI);
  54. Adafruit_SPIDevice(int8_t cspin, int8_t sck, int8_t miso, int8_t mosi,
  55. uint32_t freq = 1000000,
  56. BitOrder dataOrder = SPI_BITORDER_MSBFIRST,
  57. uint8_t dataMode = SPI_MODE0);
  58. bool begin(void);
  59. bool read(uint8_t *buffer, size_t len, uint8_t sendvalue = 0xFF);
  60. bool write(uint8_t *buffer, size_t len, uint8_t *prefix_buffer = NULL,
  61. size_t prefix_len = 0);
  62. bool write_then_read(uint8_t *write_buffer, size_t write_len,
  63. uint8_t *read_buffer, size_t read_len,
  64. uint8_t sendvalue = 0xFF);
  65. uint8_t transfer(uint8_t send);
  66. void transfer(uint8_t *buffer, size_t len);
  67. void beginTransaction(void);
  68. void endTransaction(void);
  69. private:
  70. SPIClass *_spi;
  71. SPISettings *_spiSetting;
  72. uint32_t _freq;
  73. BitOrder _dataOrder;
  74. uint8_t _dataMode;
  75. int8_t _cs, _sck, _mosi, _miso;
  76. #ifdef BUSIO_USE_FAST_PINIO
  77. BusIO_PortReg *mosiPort, *clkPort, *misoPort, *csPort;
  78. BusIO_PortMask mosiPinMask, misoPinMask, clkPinMask, csPinMask;
  79. #endif
  80. bool _begun;
  81. };
  82. #endif // Adafruit_SPIDevice_h