F439_CPP_SPI_RA8875_TFT_LCD_03 1.0
STM32F439 SPI RA8875 7-inch TFT display demo built on the STM32_GFX and STM32_RA8875 libraries
Loading...
Searching...
No Matches
Adafruit_RA8875.h
Go to the documentation of this file.
1/**************************************************************************/
20/**************************************************************************/
21
23#include "Adafruit_GFX.h"
24
26#define EEPROM_SUPPORTED
27
28#ifndef _ADAFRUIT_RA8875_H
29#define _ADAFRUIT_RA8875_H
30
31// Touchscreen Calibration and EEPROM Storage Defines
32#define CFG_EEPROM_TOUCHSCREEN_CAL_AN 0
33#define CFG_EEPROM_TOUCHSCREEN_CAL_BN 4
34#define CFG_EEPROM_TOUCHSCREEN_CAL_CN 8
35#define CFG_EEPROM_TOUCHSCREEN_CAL_DN 12
36#define CFG_EEPROM_TOUCHSCREEN_CAL_EN 16
37#define CFG_EEPROM_TOUCHSCREEN_CAL_FN 20
38#define CFG_EEPROM_TOUCHSCREEN_CAL_DIVIDER 24
39#define CFG_EEPROM_TOUCHSCREEN_CALIBRATED 28
40
41// Sizes!
42
43/**************************************************************************/
47/**************************************************************************/
54
55/**************************************************************************/
65/**************************************************************************/
66typedef struct Point {
67 int32_t x;
68 int32_t y;
70
71/**************************************************************************/
91/**************************************************************************/
92typedef struct // Matrix
93{
94 int32_t An, Bn, Cn, Dn, En, Fn, Divider;
96
97/**************************************************************************/
102/**************************************************************************/
104 public:
110 Adafruit_RA8875(SPI_HandleTypeDef* spi, GPIO_TypeDef* csPort, uint16_t csPin,
111 GPIO_TypeDef* rstPort, uint16_t rstPin,
112 GPIO_TypeDef* waitPort = nullptr, uint16_t waitPin = 0);
113
114 boolean begin(enum RA8875sizes s);
115 void softReset(void);
116 void displayOn(boolean on);
117 void sleep(boolean sleep);
118
119 /* Text functions */
120 void textMode(void);
121 void textSetCursor(uint16_t x, uint16_t y);
122 void textColor(uint16_t foreColor, uint16_t bgColor);
123 void textTransparent(uint16_t foreColor);
124 void textEnlarge(uint8_t scale);
125 void textWrite(const char* buffer, uint16_t len = 0);
126 void cursorBlink(uint8_t rate);
127
128 /* Graphics functions */
129 void graphicsMode(void);
130 void setXY(uint16_t x, uint16_t y);
131 void pushPixels(uint32_t num, uint16_t p);
132 void fillRect(void);
133
134 /* Adafruit_GFX functions */
135 void drawPixel(int16_t x, int16_t y, uint16_t color);
136 void drawPixels(uint16_t* p, uint32_t count, int16_t x, int16_t y);
137 void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
138 void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
139
140 /* HW accelerated wrapper functions (override Adafruit_GFX prototypes) */
141 void fillScreen(uint16_t color);
142 void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
143 void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
144 void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
145 void drawCircle(int16_t x, int16_t y, int16_t r, uint16_t color);
146 void fillCircle(int16_t x, int16_t y, int16_t r, uint16_t color);
147 void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
148 int16_t y2, uint16_t color);
149 void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
150 int16_t y2, uint16_t color);
151 void drawEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis,
152 int16_t shortAxis, uint16_t color);
153 void fillEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis,
154 int16_t shortAxis, uint16_t color);
155 void drawCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis,
156 int16_t shortAxis, uint8_t curvePart, uint16_t color);
157 void fillCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis,
158 int16_t shortAxis, uint8_t curvePart, uint16_t color);
159 void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r,
160 uint16_t color);
161 void fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r,
162 uint16_t color);
163
164 /* Scroll */
165 void setScrollWindow(int16_t x, int16_t y, int16_t w, int16_t h,
166 uint8_t mode);
167 void scrollX(int16_t dist);
168 void scrollY(int16_t dist);
169
170 /* Backlight */
171 void GPIOX(boolean on);
172 void PWM1config(boolean on, uint8_t clock);
173 void PWM2config(boolean on, uint8_t clock);
174 void PWM1out(uint8_t p);
175 void PWM2out(uint8_t p);
176
177 /* Touch screen */
178 void touchEnable(boolean on);
179 boolean touched(void);
180 boolean touchRead(uint16_t* x, uint16_t* y);
181
183#if defined(EEPROM_SUPPORTED)
185 /* Touch screen calibration persistence. STM32 has no Arduino EEPROM, so the
186 * application supplies read/write callbacks for whatever non-volatile
187 * memory it has (FRAM, external EEPROM, flash...). Without callbacks the
188 * calibration functions fail safely: readCalibration() returns false,
189 * writeCalibration() does nothing. */
191 typedef bool (*StorageReadFn)(void* ctx, uint32_t address, uint8_t* data,
192 uint32_t length);
194 typedef bool (*StorageWriteFn)(void* ctx, uint32_t address,
195 const uint8_t* data, uint32_t length);
197 void* ctx, uint32_t sizeBytes);
198 uint32_t eepromReadS32(int location);
199 void eepromWriteS32(int location, int32_t value);
200 bool readCalibration(int location, tsMatrix_t* matrixPtr);
201 void writeCalibration(int location, tsMatrix_t* matrixPtr);
203#endif
205
206 /* Low level access */
207 void writeReg(uint8_t reg, uint8_t val);
208 uint8_t readReg(uint8_t reg);
209 void writeData(uint8_t d);
210 uint8_t readData(void);
211 void writeCommand(uint8_t d);
212 uint8_t readStatus(void);
213 boolean waitPoll(uint8_t r, uint8_t f);
214 uint16_t width(void);
215 uint16_t height(void);
216 void setRotation(int8_t rotation);
217 int8_t getRotation(void);
218
219#ifndef USE_ADAFRUIT_GFX_FONTS
220 /**************************************************************************/
228 /**************************************************************************/
229 virtual size_t write(uint8_t b) {
230 textWrite((const char*)&b, 1);
231 return 1;
232 }
233
234 /**************************************************************************/
243 /**************************************************************************/
244 virtual size_t write(const uint8_t* buffer, size_t size) {
245 textWrite((const char*)buffer, size);
246 return size;
247 }
248#endif
249
250 private:
251 void PLLinit(void);
252 void initialize(void);
253
254 /* GFX Helper Functions */
255 void circleHelper(int16_t x, int16_t y, int16_t r, uint16_t color,
256 bool filled);
257 void rectHelper(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color,
258 bool filled);
259 void triangleHelper(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
260 int16_t x2, int16_t y2, uint16_t color, bool filled);
261 void ellipseHelper(int16_t xCenter, int16_t yCenter, int16_t longAxis,
262 int16_t shortAxis, uint16_t color, bool filled);
263 void curveHelper(int16_t xCenter, int16_t yCenter, int16_t longAxis,
264 int16_t shortAxis, uint8_t curvePart, uint16_t color,
265 bool filled);
266 void roundRectHelper(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r,
267 uint16_t color, bool filled);
268
269 /* Rotation Functions */
270 int16_t applyRotationX(int16_t x);
271 int16_t applyRotationY(int16_t y);
272
273 void swap(int16_t& x, int16_t& y) {
274 int16_t temp = x;
275 x = y;
276 y = temp;
277 }
278
279 SPI_HandleTypeDef* _spi;
280 GPIO_TypeDef *_csPort, *_rstPort, *_waitPort;
281 uint16_t _csPin, _rstPin, _waitPin;
282 StorageReadFn _storageRead;
283 StorageWriteFn _storageWrite;
284 void* _storageCtx;
285 uint32_t _storageSize;
286
287 // STM32 HAL transport helpers
288 bool spiConfigOk(void);
289 void spiSetSpeed(uint32_t hz);
290 uint8_t spiTransfer(uint8_t d);
291 void spiWrite(const uint8_t* data, uint16_t len);
292 void csLow(void);
293 void csHigh(void);
297 void waitForReady(void);
298 bool storageReadBytes(uint32_t address, uint8_t* data, uint32_t length);
299 bool storageWriteBytes(uint32_t address, const uint8_t* data,
300 uint32_t length);
301 uint16_t _width, _height;
302 uint8_t _textScale;
303 uint8_t _rotation;
304 uint8_t _voffset;
305 enum RA8875sizes _size;
306};
307
308// Colors (RGB565)
309#define RA8875_BLACK 0x0000
310#define RA8875_BLUE 0x001F
311#define RA8875_RED 0xF800
312#define RA8875_GREEN 0x07E0
313#define RA8875_CYAN 0x07FF
314#define RA8875_MAGENTA 0xF81F
315#define RA8875_YELLOW 0xFFE0
316#define RA8875_WHITE 0xFFFF
317
318// Command/Data pins for SPI
319#define RA8875_DATAWRITE 0x00
320#define RA8875_DATAREAD 0x40
321#define RA8875_CMDWRITE 0x80
322#define RA8875_CMDREAD 0xC0
323
324// Registers & bits
325#define RA8875_PWRR 0x01
326#define RA8875_PWRR_DISPON 0x80
327#define RA8875_PWRR_DISPOFF 0x00
328#define RA8875_PWRR_SLEEP 0x02
329#define RA8875_PWRR_NORMAL 0x00
330#define RA8875_PWRR_SOFTRESET 0x01
331
332#define RA8875_MRWC 0x02
333
334#define RA8875_GPIOX 0xC7
335
336#define RA8875_PLLC1 0x88
337#define RA8875_PLLC1_PLLDIV2 0x80
338#define RA8875_PLLC1_PLLDIV1 0x00
339
340#define RA8875_PLLC2 0x89
341#define RA8875_PLLC2_DIV1 0x00
342#define RA8875_PLLC2_DIV2 0x01
343#define RA8875_PLLC2_DIV4 0x02
344#define RA8875_PLLC2_DIV8 0x03
345#define RA8875_PLLC2_DIV16 0x04
346#define RA8875_PLLC2_DIV32 0x05
347#define RA8875_PLLC2_DIV64 0x06
348#define RA8875_PLLC2_DIV128 0x07
349
350#define RA8875_SYSR 0x10
351#define RA8875_SYSR_8BPP 0x00
352#define RA8875_SYSR_16BPP 0x0C
353#define RA8875_SYSR_MCU8 0x00
354#define RA8875_SYSR_MCU16 0x03
355
356#define RA8875_PCSR 0x04
357#define RA8875_PCSR_PDATR 0x00
358#define RA8875_PCSR_PDATL 0x80
359#define RA8875_PCSR_CLK 0x00
360#define RA8875_PCSR_2CLK 0x01
361#define RA8875_PCSR_4CLK 0x02
362#define RA8875_PCSR_8CLK 0x03
363
364#define RA8875_HDWR 0x14
365
366#define RA8875_HNDFTR 0x15
367#define RA8875_HNDFTR_DE_HIGH 0x00
368#define RA8875_HNDFTR_DE_LOW 0x80
369
370#define RA8875_HNDR 0x16
371#define RA8875_HSTR 0x17
372#define RA8875_HPWR 0x18
373#define RA8875_HPWR_LOW 0x00
374#define RA8875_HPWR_HIGH 0x80
375
376#define RA8875_VDHR0 0x19
377#define RA8875_VDHR1 0x1A
378#define RA8875_VNDR0 0x1B
379#define RA8875_VNDR1 0x1C
380#define RA8875_VSTR0 0x1D
381#define RA8875_VSTR1 0x1E
382#define RA8875_VPWR 0x1F
383#define RA8875_VPWR_LOW 0x00
384#define RA8875_VPWR_HIGH 0x80
385
386#define RA8875_HSAW0 0x30
387#define RA8875_HSAW1 0x31
388#define RA8875_VSAW0 0x32
389#define RA8875_VSAW1 0x33
390
391#define RA8875_HEAW0 0x34
392#define RA8875_HEAW1 0x35
393#define RA8875_VEAW0 0x36
394#define RA8875_VEAW1 0x37
395
396#define RA8875_MCLR 0x8E
397#define RA8875_MCLR_START 0x80
398#define RA8875_MCLR_STOP 0x00
399#define RA8875_MCLR_READSTATUS 0x80
400#define RA8875_MCLR_FULL 0x00
401#define RA8875_MCLR_ACTIVE 0x40
402
403#define RA8875_DCR 0x90
404#define RA8875_DCR_LINESQUTRI_START 0x80
405#define RA8875_DCR_LINESQUTRI_STOP 0x00
406#define RA8875_DCR_LINESQUTRI_STATUS 0x80
407#define RA8875_DCR_CIRCLE_START 0x40
408#define RA8875_DCR_CIRCLE_STATUS 0x40
409#define RA8875_DCR_CIRCLE_STOP 0x00
410#define RA8875_DCR_FILL 0x20
411#define RA8875_DCR_NOFILL 0x00
412#define RA8875_DCR_DRAWLINE 0x00
413#define RA8875_DCR_DRAWTRIANGLE 0x01
414#define RA8875_DCR_DRAWSQUARE 0x10
415
416#define RA8875_ELLIPSE 0xA0
417#define RA8875_ELLIPSE_STATUS 0x80
418
419#define RA8875_MWCR0 0x40
420#define RA8875_MWCR0_GFXMODE 0x00
421#define RA8875_MWCR0_TXTMODE 0x80
422#define RA8875_MWCR0_CURSOR 0x40
423#define RA8875_MWCR0_BLINK 0x20
424
425#define RA8875_MWCR0_DIRMASK 0x0C
426#define RA8875_MWCR0_LRTD 0x00
427#define RA8875_MWCR0_RLTD 0x04
428#define RA8875_MWCR0_TDLR 0x08
429#define RA8875_MWCR0_DTLR 0x0C
430
431#define RA8875_BTCR 0x44
432#define RA8875_CURH0 0x46
433#define RA8875_CURH1 0x47
434#define RA8875_CURV0 0x48
435#define RA8875_CURV1 0x49
436
437#define RA8875_P1CR 0x8A
438#define RA8875_P1CR_ENABLE 0x80
439#define RA8875_P1CR_DISABLE 0x00
440#define RA8875_P1CR_CLKOUT 0x10
441#define RA8875_P1CR_PWMOUT 0x00
442
443#define RA8875_P1DCR 0x8B
444
445#define RA8875_P2CR 0x8C
446#define RA8875_P2CR_ENABLE 0x80
447#define RA8875_P2CR_DISABLE 0x00
448#define RA8875_P2CR_CLKOUT 0x10
449#define RA8875_P2CR_PWMOUT 0x00
450
451#define RA8875_P2DCR 0x8D
452
453#define RA8875_PWM_CLK_DIV1 0x00
454#define RA8875_PWM_CLK_DIV2 0x01
455#define RA8875_PWM_CLK_DIV4 0x02
456#define RA8875_PWM_CLK_DIV8 0x03
457#define RA8875_PWM_CLK_DIV16 0x04
458#define RA8875_PWM_CLK_DIV32 0x05
459#define RA8875_PWM_CLK_DIV64 0x06
460#define RA8875_PWM_CLK_DIV128 0x07
461#define RA8875_PWM_CLK_DIV256 0x08
462#define RA8875_PWM_CLK_DIV512 0x09
463#define RA8875_PWM_CLK_DIV1024 0x0A
464#define RA8875_PWM_CLK_DIV2048 0x0B
465#define RA8875_PWM_CLK_DIV4096 0x0C
466#define RA8875_PWM_CLK_DIV8192 0x0D
467#define RA8875_PWM_CLK_DIV16384 0x0E
468#define RA8875_PWM_CLK_DIV32768 0x0F
469
470#define RA8875_TPCR0 0x70
471#define RA8875_TPCR0_ENABLE 0x80
472#define RA8875_TPCR0_DISABLE 0x00
473#define RA8875_TPCR0_WAIT_512CLK 0x00
474#define RA8875_TPCR0_WAIT_1024CLK 0x10
475#define RA8875_TPCR0_WAIT_2048CLK 0x20
476#define RA8875_TPCR0_WAIT_4096CLK 0x30
477#define RA8875_TPCR0_WAIT_8192CLK 0x40
478#define RA8875_TPCR0_WAIT_16384CLK 0x50
479#define RA8875_TPCR0_WAIT_32768CLK 0x60
480#define RA8875_TPCR0_WAIT_65536CLK 0x70
481#define RA8875_TPCR0_WAKEENABLE 0x08
482#define RA8875_TPCR0_WAKEDISABLE 0x00
483#define RA8875_TPCR0_ADCCLK_DIV1 0x00
484#define RA8875_TPCR0_ADCCLK_DIV2 0x01
485#define RA8875_TPCR0_ADCCLK_DIV4 0x02
486#define RA8875_TPCR0_ADCCLK_DIV8 0x03
487#define RA8875_TPCR0_ADCCLK_DIV16 0x04
488#define RA8875_TPCR0_ADCCLK_DIV32 0x05
489#define RA8875_TPCR0_ADCCLK_DIV64 0x06
490#define RA8875_TPCR0_ADCCLK_DIV128 0x07
491
492#define RA8875_TPCR1 0x71
493#define RA8875_TPCR1_AUTO 0x00
494#define RA8875_TPCR1_MANUAL 0x40
495#define RA8875_TPCR1_VREFINT 0x00
496#define RA8875_TPCR1_VREFEXT 0x20
497#define RA8875_TPCR1_DEBOUNCE 0x04
498#define RA8875_TPCR1_NODEBOUNCE 0x00
499#define RA8875_TPCR1_IDLE 0x00
500#define RA8875_TPCR1_WAIT 0x01
501#define RA8875_TPCR1_LATCHX 0x02
502#define RA8875_TPCR1_LATCHY 0x03
503
504#define RA8875_TPXH 0x72
505#define RA8875_TPYH 0x73
506#define RA8875_TPXYL 0x74
507
508#define RA8875_INTC1 0xF0
509#define RA8875_INTC1_KEY 0x10
510#define RA8875_INTC1_DMA 0x08
511#define RA8875_INTC1_TP 0x04
512#define RA8875_INTC1_BTE 0x02
513
514#define RA8875_INTC2 0xF1
515#define RA8875_INTC2_KEY 0x10
516#define RA8875_INTC2_DMA 0x08
517#define RA8875_INTC2_TP 0x04
518#define RA8875_INTC2_BTE 0x02
519
520#define RA8875_SCROLL_BOTH 0x00
521#define RA8875_SCROLL_LAYER1 0x40
522#define RA8875_SCROLL_LAYER2 0x80
523#define RA8875_SCROLL_BUFFER 0xC0
524
525#endif
struct Point tsPoint_t
Nameless struct variable!
RA8875sizes
@ RA8875_480x272
@ RA8875_800x480
@ RA8875_480x80
@ RA8875_480x128
Minimal Arduino-API compatibility layer for the STM32 port of Adafruit_GFX (and libraries built on it...
uint8_t rotation
Display rotation (0 thru 3)
Class that stores state and functions for interacting with the RA8875 display controller.
void GPIOX(boolean on)
void fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color)
bool readCalibration(int location, tsMatrix_t *matrixPtr)
boolean touchRead(uint16_t *x, uint16_t *y)
void drawPixel(int16_t x, int16_t y, uint16_t color)
virtual size_t write(const uint8_t *buffer, size_t size)
bool(* StorageReadFn)(void *ctx, uint32_t address, uint8_t *data, uint32_t length)
Read length bytes at address; return true on success.
void touchEnable(boolean on)
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)
void sleep(boolean sleep)
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color)
void fillCircle(int16_t x, int16_t y, int16_t r, uint16_t color)
void fillScreen(uint16_t color)
void writeReg(uint8_t reg, uint8_t val)
void fillCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color)
Adafruit_RA8875(SPI_HandleTypeDef *spi, GPIO_TypeDef *csPort, uint16_t csPin, GPIO_TypeDef *rstPort, uint16_t rstPin, GPIO_TypeDef *waitPort=nullptr, uint16_t waitPin=0)
void PWM2config(boolean on, uint8_t clock)
bool(* StorageWriteFn)(void *ctx, uint32_t address, const uint8_t *data, uint32_t length)
Write length bytes at address; return true on success.
void writeCalibration(int location, tsMatrix_t *matrixPtr)
void pushPixels(uint32_t num, uint16_t p)
void writeCommand(uint8_t d)
virtual size_t write(uint8_t b)
void setScrollWindow(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t mode)
uint8_t readStatus(void)
void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
void fillEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint16_t color)
void drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color)
uint32_t eepromReadS32(int location)
uint8_t readData(void)
void cursorBlink(uint8_t rate)
boolean begin(enum RA8875sizes s)
void setXY(uint16_t x, uint16_t y)
void drawCircle(int16_t x, int16_t y, int16_t r, uint16_t color)
void textEnlarge(uint8_t scale)
void textSetCursor(uint16_t x, uint16_t y)
uint16_t height(void)
void PWM1out(uint8_t p)
void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
void PWM2out(uint8_t p)
int8_t getRotation(void)
void drawCurve(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint8_t curvePart, uint16_t color)
void scrollY(int16_t dist)
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color)
void setCalibrationStorage(StorageReadFn read, StorageWriteFn write, void *ctx, uint32_t sizeBytes)
void textColor(uint16_t foreColor, uint16_t bgColor)
boolean touched(void)
void drawPixels(uint16_t *p, uint32_t count, int16_t x, int16_t y)
void displayOn(boolean on)
uint8_t readReg(uint8_t reg)
uint16_t width(void)
boolean waitPoll(uint8_t r, uint8_t f)
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
void writeData(uint8_t d)
void textTransparent(uint16_t foreColor)
void PWM1config(boolean on, uint8_t clock)
void setRotation(int8_t rotation)
void textWrite(const char *buffer, uint16_t len=0)
void scrollX(int16_t dist)
void drawEllipse(int16_t xCenter, int16_t yCenter, int16_t longAxis, int16_t shortAxis, uint16_t color)
void eepromWriteS32(int location, int32_t value)
int32_t y
int32_t x