Adafruit Library
Adafruit_seesaw.h
Go to the documentation of this file.
1 
21 #ifndef LIB_SEESAW_H
22 #define LIB_SEESAW_H
23 
24 #include "Adafruit_I2CDevice.h"
25 #include <Arduino.h>
26 #include <Wire.h>
27 
28 /*=========================================================================
29  I2C ADDRESS/BITS
30  -----------------------------------------------------------------------*/
31 #define SEESAW_ADDRESS (0x49)
32 /*=========================================================================*/
33 
34 /*=========================================================================
35  REGISTERS
36  -----------------------------------------------------------------------*/
37 
41 enum {
42  SEESAW_STATUS_BASE = 0x00,
43  SEESAW_GPIO_BASE = 0x01,
44  SEESAW_SERCOM0_BASE = 0x02,
45 
46  SEESAW_TIMER_BASE = 0x08,
47  SEESAW_ADC_BASE = 0x09,
48  SEESAW_DAC_BASE = 0x0A,
49  SEESAW_INTERRUPT_BASE = 0x0B,
50  SEESAW_DAP_BASE = 0x0C,
51  SEESAW_EEPROM_BASE = 0x0D,
52  SEESAW_NEOPIXEL_BASE = 0x0E,
53  SEESAW_TOUCH_BASE = 0x0F,
54  SEESAW_KEYPAD_BASE = 0x10,
55  SEESAW_ENCODER_BASE = 0x11,
56  SEESAW_SPECTRUM_BASE = 0x12,
58  0x13,
59 };
60 
63 enum {
64  SEESAW_GPIO_DIRSET_BULK = 0x02,
65  SEESAW_GPIO_DIRCLR_BULK = 0x03,
66  SEESAW_GPIO_BULK = 0x04,
67  SEESAW_GPIO_BULK_SET = 0x05,
68  SEESAW_GPIO_BULK_CLR = 0x06,
69  SEESAW_GPIO_BULK_TOGGLE = 0x07,
70  SEESAW_GPIO_INTENSET = 0x08,
71  SEESAW_GPIO_INTENCLR = 0x09,
72  SEESAW_GPIO_INTFLAG = 0x0A,
73  SEESAW_GPIO_PULLENSET = 0x0B,
74  SEESAW_GPIO_PULLENCLR = 0x0C,
75 };
76 
79 enum {
80  SEESAW_STATUS_HW_ID = 0x01,
81  SEESAW_STATUS_VERSION = 0x02,
82  SEESAW_STATUS_OPTIONS = 0x03,
83  SEESAW_STATUS_TEMP = 0x04,
84  SEESAW_STATUS_SWRST = 0x7F,
85 };
86 
89 enum {
90  SEESAW_TIMER_STATUS = 0x00,
91  SEESAW_TIMER_PWM = 0x01,
92  SEESAW_TIMER_FREQ = 0x02,
93 };
94 
97 enum {
98  SEESAW_ADC_STATUS = 0x00,
99  SEESAW_ADC_INTEN = 0x02,
100  SEESAW_ADC_INTENCLR = 0x03,
101  SEESAW_ADC_WINMODE = 0x04,
102  SEESAW_ADC_WINTHRESH = 0x05,
103  SEESAW_ADC_CHANNEL_OFFSET = 0x07,
104 };
105 
108 enum {
109  SEESAW_SERCOM_STATUS = 0x00,
110  SEESAW_SERCOM_INTEN = 0x02,
111  SEESAW_SERCOM_INTENCLR = 0x03,
112  SEESAW_SERCOM_BAUD = 0x04,
113  SEESAW_SERCOM_DATA = 0x05,
114 };
115 
118 enum {
119  SEESAW_NEOPIXEL_STATUS = 0x00,
120  SEESAW_NEOPIXEL_PIN = 0x01,
121  SEESAW_NEOPIXEL_SPEED = 0x02,
122  SEESAW_NEOPIXEL_BUF_LENGTH = 0x03,
123  SEESAW_NEOPIXEL_BUF = 0x04,
124  SEESAW_NEOPIXEL_SHOW = 0x05,
125 };
126 
129 enum {
130  SEESAW_TOUCH_CHANNEL_OFFSET = 0x10,
131 };
132 
135 enum {
136  SEESAW_KEYPAD_STATUS = 0x00,
137  SEESAW_KEYPAD_EVENT = 0x01,
138  SEESAW_KEYPAD_INTENSET = 0x02,
139  SEESAW_KEYPAD_INTENCLR = 0x03,
140  SEESAW_KEYPAD_COUNT = 0x04,
141  SEESAW_KEYPAD_FIFO = 0x10,
142 };
143 
146 enum {
147  SEESAW_KEYPAD_EDGE_HIGH = 0,
148  SEESAW_KEYPAD_EDGE_LOW,
149  SEESAW_KEYPAD_EDGE_FALLING,
150  SEESAW_KEYPAD_EDGE_RISING,
151 };
152 
155 enum {
156  SEESAW_ENCODER_STATUS = 0x00,
157  SEESAW_ENCODER_INTENSET = 0x10,
158  SEESAW_ENCODER_INTENCLR = 0x20,
159  SEESAW_ENCODER_POSITION = 0x30,
160  SEESAW_ENCODER_DELTA = 0x40,
161 };
162 
165 enum {
166  SEESAW_SPECTRUM_RESULTS_LOWER = 0x00, // Audio spectrum bins 0-31
167  SEESAW_SPECTRUM_RESULTS_UPPER = 0x01, // Audio spectrum bins 32-63
168  // If some future device supports a larger spectrum, can add additional
169  // "bins" working upward from here. Configurable setting registers then
170  // work downward from the top to avoid collision between spectrum bins
171  // and configurables.
172  SEESAW_SPECTRUM_CHANNEL = 0xFD,
173  SEESAW_SPECTRUM_RATE = 0xFE,
174  SEESAW_SPECTRUM_STATUS = 0xFF,
175 };
176 
177 #define ADC_INPUT_0_PIN 2
178 #define ADC_INPUT_1_PIN 3
179 #define ADC_INPUT_2_PIN 4
180 #define ADC_INPUT_3_PIN 5
181 
182 #define PWM_0_PIN 4
183 #define PWM_1_PIN 5
184 #define PWM_2_PIN 6
185 #define PWM_3_PIN 7
186 
187 #ifndef INPUT_PULLDOWN
188 #define INPUT_PULLDOWN \
189  0x03
190 #endif
192 
193 /*=========================================================================*/
194 // clang-format off
195 #define SEESAW_HW_ID_CODE_SAMD09 0x55
196 #define SEESAW_HW_ID_CODE_TINY416 0x46
197 #define SEESAW_HW_ID_CODE_TINY806 0x84
198 #define SEESAW_HW_ID_CODE_TINY807 0x85
199 #define SEESAW_HW_ID_CODE_TINY816 0x86
200 #define SEESAW_HW_ID_CODE_TINY817 0x87
201 #define SEESAW_HW_ID_CODE_TINY1616 0x88
202 #define SEESAW_HW_ID_CODE_TINY1617 0x89
203 #define SEESAW_HW_ID_CODE_STM32C011 0x90
204 #define SEESAW_HW_ID_CODE_STM32C031 0x91
205 #define SEESAW_HW_ID_CODE_STM32C051 0x92
206 #define SEESAW_HW_ID_CODE_STM32G071 0x93
207 // clang-format on
208 
210 union keyEventRaw {
211  struct {
212  uint8_t EDGE : 2;
213  uint8_t NUM : 6;
214  } bit;
215  uint8_t reg;
216 };
217 
219 union keyEvent {
220  struct {
221  uint8_t EDGE : 2;
222  uint16_t NUM : 14;
223  } bit;
224  uint16_t reg;
225 };
226 
228 union keyState {
229  struct {
230  uint8_t STATE : 1;
231  uint8_t ACTIVE : 4;
232  } bit;
233  uint8_t reg;
234 };
235 
236 /**************************************************************************/
241 /**************************************************************************/
242 class Adafruit_seesaw : public Print {
243 public:
244  // constructors
245  Adafruit_seesaw(TwoWire *Wi = NULL);
246  ~Adafruit_seesaw(void) {}
247 
248  bool begin(uint8_t addr = SEESAW_ADDRESS, int8_t flow = -1,
249  bool reset = true);
250  uint32_t getOptions();
251  uint32_t getVersion();
252  bool getProdDatecode(uint16_t *pid, uint8_t *year, uint8_t *mon,
253  uint8_t *day);
254 
255  bool SWReset();
256 
257  void pinMode(uint8_t pin, uint8_t mode);
258  void pinModeBulk(uint32_t pins, uint8_t mode);
259  void pinModeBulk(uint32_t pinsa, uint32_t pinsb, uint8_t mode);
260  virtual void analogWrite(uint8_t pin, uint16_t value, uint8_t width = 8);
261  void digitalWrite(uint8_t pin, uint8_t value);
262  void digitalWriteBulk(uint32_t port_values);
263  void digitalWriteBulk(uint32_t pins, uint8_t value);
264  void digitalWriteBulk(uint32_t pinsa, uint32_t pinsb, uint8_t value);
265 
266  bool digitalRead(uint8_t pin);
267  uint32_t digitalReadBulk(uint32_t pins);
268  uint32_t digitalReadBulkB(uint32_t pins);
269 
270  void setGPIOInterrupts(uint32_t pins, bool enabled);
271 
272  virtual uint16_t analogRead(uint8_t pin);
273 
274  uint16_t touchRead(uint8_t pin);
275 
276  virtual void setPWMFreq(uint8_t pin, uint16_t freq);
277 
278  void enableSercomDataRdyInterrupt(uint8_t sercom = 0);
279  void disableSercomDataRdyInterrupt(uint8_t sercom = 0);
280 
281  char readSercomData(uint8_t sercom = 0);
282 
283  void EEPROMWrite8(uint8_t addr, uint8_t val);
284  void EEPROMWrite(uint8_t addr, uint8_t *buf, uint8_t size);
285  uint8_t EEPROMRead8(uint8_t addr);
286 
287  void setI2CAddr(uint8_t addr);
288  uint8_t getI2CAddr();
289 
290  void UARTSetBaud(uint32_t baud);
291 
292  void setKeypadEvent(uint8_t key, uint8_t edge, bool enable = true);
293  void enableKeypadInterrupt();
294  void disableKeypadInterrupt();
295  uint8_t getKeypadCount();
296  bool readKeypad(keyEventRaw *buf, uint8_t count);
297 
298  float getTemp();
299 
300  int32_t getEncoderPosition(uint8_t encoder = 0);
301  int32_t getEncoderDelta(uint8_t encoder = 0);
302  bool enableEncoderInterrupt(uint8_t encoder = 0);
303  bool disableEncoderInterrupt(uint8_t encoder = 0);
304  void setEncoderPosition(int32_t pos, uint8_t encoder = 0);
305 
306  using Print::write;
307  virtual size_t write(uint8_t) override;
308  virtual size_t write(const char *str);
309 
310 protected:
311  TwoWire *_i2cbus;
312  Adafruit_I2CDevice *_i2c_dev = NULL;
313 
314  int8_t _flow;
316  uint8_t _hardwaretype = 0;
317  uint8_t getI2CaddrEEPROMloc();
318 
319  bool write8(byte regHigh, byte regLow, byte value);
320  uint8_t read8(byte regHigh, byte regLow, uint16_t delay = 250);
321 
322  bool read(uint8_t regHigh, uint8_t regLow, uint8_t *buf, uint8_t num,
323  uint16_t delay = 250);
324  bool write(uint8_t regHigh, uint8_t regLow, uint8_t *buf, uint8_t num);
325 
326  /*=========================================================================
327  REGISTER BITFIELDS
328  -----------------------------------------------------------------------*/
329 
332  union sercom_inten {
333  struct {
334  uint8_t DATA_RDY : 1;
335  } bit;
336  uint8_t reg;
337  };
339 
340  /*=========================================================================*/
341 };
342 
343 #endif
Definition: Adafruit_seesaw.h:228
uint8_t DATA_RDY
this bit is set when data becomes available
Definition: Adafruit_seesaw.h:334
int8_t _flow
Definition: Adafruit_seesaw.h:314
Definition: Adafruit_seesaw.h:332
struct keyEventRaw::@12 bit
bitfield format
uint8_t NUM
the event number
Definition: Adafruit_seesaw.h:213
Experimental SPI controller bridge, not SPI slave transport.
Definition: Adafruit_seesaw.h:57
uint8_t reg
register format
Definition: Adafruit_seesaw.h:215
uint8_t ACTIVE
the registered events for that key
Definition: Adafruit_seesaw.h:231
uint8_t STATE
the current state of the key
Definition: Adafruit_seesaw.h:230
uint16_t NUM
the event number
Definition: Adafruit_seesaw.h:222
Class that stores state and functions for interacting with seesaw helper IC.
Definition: Adafruit_seesaw.h:242
uint16_t reg
register format
Definition: Adafruit_seesaw.h:224
uint8_t EDGE
the edge that was triggered
Definition: Adafruit_seesaw.h:212
uint8_t reg
full register
Definition: Adafruit_seesaw.h:336
#define SEESAW_ADDRESS
Default Seesaw I2C address.
Definition: Adafruit_seesaw.h:31
TwoWire * _i2cbus
Definition: Adafruit_seesaw.h:311
Definition: Adafruit_seesaw.h:219
uint8_t EDGE
the edge that was triggered
Definition: Adafruit_seesaw.h:221
Definition: Adafruit_seesaw.h:210
uint8_t reg
register format
Definition: Adafruit_seesaw.h:233
sercom_inten _sercom_inten
sercom interrupt enable register instance
Definition: Adafruit_seesaw.h:338