Krolyxon
Commit 1d55752

Branches

Tags

Refs →

orion-rf.piolibdepsesp32-s3-n16r8Adafruit BusIOAdafruit_SPIDevice.h

149 lines · 5.4 KB · Objective-C

1#ifndef Adafruit_SPIDevice_h
2#define Adafruit_SPIDevice_h
3
4#include <Arduino.h>
5
6#if !defined(SPI_INTERFACES_COUNT) || \
7 (defined(SPI_INTERFACES_COUNT) && (SPI_INTERFACES_COUNT > 0))
8// HW SPI available
9#include <SPI.h>
10#define BUSIO_HAS_HW_SPI
11#else
12// SW SPI ONLY
13enum { SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3 };
14typedef uint8_t SPIClass;
15#endif
16
17// some modern SPI definitions don't have BitOrder enum
18#if (defined(__AVR__) && !defined(ARDUINO_ARCH_MEGAAVR)) || \
19 defined(ESP8266) || defined(TEENSYDUINO) || defined(SPARK) || \
20 defined(ARDUINO_ARCH_SPRESENSE) || defined(MEGATINYCORE) || \
21 defined(DXCORE) || defined(ARDUINO_AVR_ATmega4809) || \
22 defined(ARDUINO_AVR_ATmega4808) || defined(ARDUINO_AVR_ATmega3209) || \
23 defined(ARDUINO_AVR_ATmega3208) || defined(ARDUINO_AVR_ATmega1609) || \
24 defined(ARDUINO_AVR_ATmega1608) || defined(ARDUINO_AVR_ATmega809) || \
25 defined(ARDUINO_AVR_ATmega808) || defined(ARDUINO_ARCH_ARC32) || \
26 defined(ARDUINO_ARCH_XMC)
27
28typedef enum _BitOrder {
29 SPI_BITORDER_MSBFIRST = MSBFIRST,
30 SPI_BITORDER_LSBFIRST = LSBFIRST,
31} BusIOBitOrder;
32
33#elif defined(ESP32) || defined(__ASR6501__) || defined(__ASR6502__)
34
35// some modern SPI definitions don't have BitOrder enum and have different SPI
36// mode defines
37typedef enum _BitOrder {
38 SPI_BITORDER_MSBFIRST = SPI_MSBFIRST,
39 SPI_BITORDER_LSBFIRST = SPI_LSBFIRST,
40} BusIOBitOrder;
41
42#else
43// Some platforms have a BitOrder enum but its named MSBFIRST/LSBFIRST
44#define SPI_BITORDER_MSBFIRST MSBFIRST
45#define SPI_BITORDER_LSBFIRST LSBFIRST
46typedef BitOrder BusIOBitOrder;
47#endif
48
49#if defined(__IMXRT1062__) // Teensy 4.x
50// *Warning* I disabled the usage of FAST_PINIO as the set/clear operations
51// used in the cpp file are not atomic and can effect multiple IO pins
52// and if an interrupt happens in between the time the code reads the register
53// and writes out the updated value, that changes one or more other IO pins
54// on that same IO port, those change will be clobbered when the updated
55// values are written back. A fast version can be implemented that uses the
56// ports set and clear registers which are atomic.
57// typedef volatile uint32_t BusIO_PortReg;
58// typedef uint32_t BusIO_PortMask;
59// #define BUSIO_USE_FAST_PINIO
60
61#elif defined(__MBED__) || defined(__ZEPHYR__)
62// Boards based on RTOS cores like mbed or Zephyr are not going to expose the
63// low level registers needed for fast pin manipulation
64#undef BUSIO_USE_FAST_PINIO
65
66#elif defined(ARDUINO_ARCH_XMC)
67#undef BUSIO_USE_FAST_PINIO
68
69#elif defined(__AVR__) || defined(TEENSYDUINO)
70typedef volatile uint8_t BusIO_PortReg;
71typedef uint8_t BusIO_PortMask;
72#define BUSIO_USE_FAST_PINIO
73
74#elif defined(ESP8266) || defined(ESP32) || defined(__SAM3X8E__) || \
75 defined(ARDUINO_ARCH_SAMD)
76typedef volatile uint32_t BusIO_PortReg;
77typedef uint32_t BusIO_PortMask;
78#define BUSIO_USE_FAST_PINIO
79
80#elif (defined(__arm__) || defined(ARDUINO_FEATHER52)) && \
81 !defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_SILABS) && \
82 !defined(ARDUINO_UNOR4_MINIMA) && !defined(ARDUINO_UNOR4_WIFI) && \
83 !defined(PORTDUINO)
84typedef volatile uint32_t BusIO_PortReg;
85typedef uint32_t BusIO_PortMask;
86#if !defined(__ASR6501__) && !defined(__ASR6502__)
87#define BUSIO_USE_FAST_PINIO
88#endif
89
90#else
91#undef BUSIO_USE_FAST_PINIO
92#endif
93
94/**! The class which defines how we will talk to this device over SPI **/
95class Adafruit_SPIDevice {
96public:
97#ifdef BUSIO_HAS_HW_SPI
98 Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000,
99 BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
100 uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = &SPI);
101#else
102 Adafruit_SPIDevice(int8_t cspin, uint32_t freq = 1000000,
103 BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
104 uint8_t dataMode = SPI_MODE0, SPIClass *theSPI = nullptr);
105#endif
106 Adafruit_SPIDevice(int8_t cspin, int8_t sck, int8_t miso, int8_t mosi,
107 uint32_t freq = 1000000,
108 BusIOBitOrder dataOrder = SPI_BITORDER_MSBFIRST,
109 uint8_t dataMode = SPI_MODE0);
110 ~Adafruit_SPIDevice();
111
112 bool begin(void);
113 bool read(uint8_t *buffer, size_t len, uint8_t sendvalue = 0xFF);
114 bool write(const uint8_t *buffer, size_t len,
115 const uint8_t *prefix_buffer = nullptr, size_t prefix_len = 0);
116 bool write_then_read(const uint8_t *write_buffer, size_t write_len,
117 uint8_t *read_buffer, size_t read_len,
118 uint8_t sendvalue = 0xFF);
119 bool write_and_read(uint8_t *buffer, size_t len);
120
121 uint8_t transfer(uint8_t send);
122 void transfer(uint8_t *buffer, size_t len);
123 void beginTransaction(void);
124 void endTransaction(void);
125 void beginTransactionWithAssertingCS();
126 void endTransactionWithDeassertingCS();
127
128private:
129#ifdef BUSIO_HAS_HW_SPI
130 SPIClass *_spi = nullptr;
131 SPISettings *_spiSetting = nullptr;
132#else
133 uint8_t *_spi = nullptr;
134 uint8_t *_spiSetting = nullptr;
135#endif
136 uint32_t _freq;
137 BusIOBitOrder _dataOrder;
138 uint8_t _dataMode;
139 void setChipSelect(int value);
140
141 int8_t _cs, _sck, _mosi, _miso;
142#ifdef BUSIO_USE_FAST_PINIO
143 BusIO_PortReg *mosiPort, *clkPort, *misoPort, *csPort;
144 BusIO_PortMask mosiPinMask, misoPinMask, clkPinMask, csPinMask;
145#endif
146 bool _begun;
147};
148
149#endif // Adafruit_SPIDevice_h