esp32_Adafruit_BusIO/Adafruit_SPIDevice.h

110 lines
3.8 KiB
C
Raw Normal View History

#ifndef Adafruit_SPIDevice_h
#define Adafruit_SPIDevice_h
2021-09-28 22:31:23 +01:00
2021-11-20 05:56:35 +00:00
#include <Arduino.h>
2021-07-01 16:40:28 +01:00
#if !defined(SPI_INTERFACES_COUNT) || \
(defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
2021-06-30 21:46:43 +01:00
2019-05-18 04:36:14 +01:00
#include <SPI.h>
2019-05-19 00:34:33 +01:00
// some modern SPI definitions don't have BitOrder enum
#if (defined(__AVR__) && !defined(ARDUINO_ARCH_MEGAAVR)) || \
defined(ESP8266) || defined(TEENSYDUINO) || defined(SPARK) || \
defined(ARDUINO_ARCH_SPRESENSE) || defined(MEGATINYCORE) || \
defined(DXCORE) || defined(ARDUINO_AVR_ATmega4809) || \
defined(ARDUINO_AVR_ATmega4808) || defined(ARDUINO_AVR_ATmega3209) || \
defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \
defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \
2021-07-17 20:54:07 +01:00
defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32)
typedef enum _BitOrder {
SPI_BITORDER_MSBFIRST = MSBFIRST,
SPI_BITORDER_LSBFIRST = LSBFIRST,
2021-07-17 20:54:07 +01:00
} BusIOBitOrder;
#elif defined(ESP32) || defined(__ASR6501__) || defined(__ASR6502__)
// some modern SPI definitions don't have BitOrder enum and have different SPI
// mode defines
typedef enum _BitOrder {
SPI_BITORDER_MSBFIRST = SPI_MSBFIRST,
SPI_BITORDER_LSBFIRST = SPI_LSBFIRST,
2021-07-17 20:54:07 +01:00
} BusIOBitOrder;
#else
// Some platforms have a BitOrder enum but its named MSBFIRST/LSBFIRST
#define SPI_BITORDER_MSBFIRST MSBFIRST
#define SPI_BITORDER_LSBFIRST LSBFIRST
2021-07-17 21:09:09 +01:00
typedef BitOrder BusIOBitOrder;
#endif
2019-05-18 04:36:14 +01:00
2020-07-18 19:18:07 +01:00
#if defined(__AVR__) || defined(TEENSYDUINO)
typedef volatile uint8_t BusIO_PortReg;
typedef uint8_t BusIO_PortMask;
#define BUSIO_USE_FAST_PINIO
#elif defined(ESP8266) || defined(ESP32) || defined(__SAM3X8E__) || \
defined(ARDUINO_ARCH_SAMD)
typedef volatile uint32_t BusIO_PortReg;
typedef uint32_t BusIO_PortMask;
#define BUSIO_USE_FAST_PINIO
#elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \
2021-03-27 21:07:44 +00:00
!defined(ARDUINO_ARCH_MBED) && !defined(ARDUINO_ARCH_RP2040)
2020-07-18 19:18:07 +01:00
typedef volatile uint32_t BusIO_PortReg;
typedef uint32_t BusIO_PortMask;
#if !defined(__ASR6501__) && !defined(__ASR6502__)
2020-07-18 19:18:07 +01:00
#define BUSIO_USE_FAST_PINIO
#endif
2020-07-18 19:18:07 +01:00
#else
#undef BUSIO_USE_FAST_PINIO
#endif
2020-05-31 01:50:06 +01:00
/**! The class which defines how we will talk to this device over SPI **/
2019-05-18 04:36:14 +01:00
class Adafruit_SPIDevice {
public:
Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000,
2021-07-17 20:54:07 +01:00
BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = &SPI);
Adafruit_SPIDevice(int8_t cspin, int8_t sck, int8_t miso, int8_t mosi,
uint32_t freq = 1000000,
2021-07-17 20:54:07 +01:00
BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
uint8_t dataMode = SPI_MODE0);
~Adafruit_SPIDevice();
2019-05-18 04:36:14 +01:00
bool begin(void);
bool read(uint8_t *buffer, size_t len, uint8_t sendvalue = 0xFF);
bool write(const uint8_t *buffer, size_t len, const uint8_t *prefix_buffer = NULL,
size_t prefix_len = 0);
bool write_then_read(const uint8_t *write_buffer, size_t write_len,
uint8_t *read_buffer, size_t read_len,
uint8_t sendvalue = 0xFF);
bool write_and_read(uint8_t *buffer, size_t len);
2019-05-18 04:36:14 +01:00
uint8_t transfer(uint8_t send);
void transfer(uint8_t *buffer, size_t len);
void beginTransaction(void);
void endTransaction(void);
private:
2019-05-18 04:36:14 +01:00
SPIClass *_spi;
SPISettings *_spiSetting;
uint32_t _freq;
2021-07-17 20:54:07 +01:00
BusIOBitOrder _dataOrder;
uint8_t _dataMode;
2022-01-25 00:56:58 +00:00
void setChipSelect(int value);
int8_t _cs, _sck, _mosi, _miso;
2020-07-18 19:18:07 +01:00
#ifdef BUSIO_USE_FAST_PINIO
BusIO_PortReg *mosiPort, *clkPort, *misoPort, *csPort;
BusIO_PortMask mosiPinMask, misoPinMask, clkPinMask, csPinMask;
#endif
2019-05-18 04:36:14 +01:00
bool _begun;
};
2021-06-30 21:46:43 +01:00
#endif // has SPI defined
#endif // Adafruit_SPIDevice_h