SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
xl9555_spi.ino
Go to the documentation of this file.
1
31#include <IoExpanderDrv.hpp>
32
33#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_IDF_TARGET_ESP32S3)
34
35#include <esp_lcd_panel_io.h>
36#include <esp_lcd_panel_ops.h>
37#include <esp_lcd_panel_rgb.h>
38#include <esp_lcd_panel_vendor.h>
39#include <vector>
40
41#define SENSOR_SDA 8
42#define SENSOR_SCL 48
43
44#define RGB_MAX_PIXEL_CLOCK_HZ (8000000UL)
45
46#define BOARD_TFT_WIDTH (480)
47#define BOARD_TFT_HEIGHT (480)
48
49#define BOARD_TFT_BL (46)
50
51#define BOARD_TFT_HSYNC (47)
52#define BOARD_TFT_VSYNC (41)
53#define BOARD_TFT_DE (45)
54#define BOARD_TFT_PCLK (42)
55
56#define BOARD_TFT_DATA0 (44) //B0
57#define BOARD_TFT_DATA1 (21) //B1
58#define BOARD_TFT_DATA2 (18) //B2
59#define BOARD_TFT_DATA3 (17) //B3
60#define BOARD_TFT_DATA4 (16) //B4
61#define BOARD_TFT_DATA5 (15) //B5 MSB
62
63#define BOARD_TFT_DATA6 (14) //G0
64#define BOARD_TFT_DATA7 (13) //G1
65#define BOARD_TFT_DATA8 (12) //G2
66#define BOARD_TFT_DATA9 (11) //G3
67#define BOARD_TFT_DATA10 (10) //G4
68#define BOARD_TFT_DATA11 (9) //G5 MSB
69
70#define BOARD_TFT_DATA12 (43) //R0
71#define BOARD_TFT_DATA13 (7) //R1
72#define BOARD_TFT_DATA14 (6) //R2
73#define BOARD_TFT_DATA15 (5) //R3
74#define BOARD_TFT_DATA16 (3) //R4
75#define BOARD_TFT_DATA17 (2) //R5 MSB
76
77#define BOARD_TFT_RST (6)
78#define BOARD_TFT_CS (3)
79#define BOARD_TFT_MOSI (4)
80#define BOARD_TFT_SCLK (5)
81
82typedef struct {
83 uint8_t cmd;
84 uint8_t data[16];
85 uint8_t databytes; // No of data in data; bit 7 = delay after set; 0xFF = end of cmds.
86} lcd_init_cmd_t;
87
88DRAM_ATTR static const lcd_init_cmd_t st7701_2_1_inches[] = {
89 {0xFF, {0x77, 0x01, 0x00, 0x00, 0x10}, 0x05},
90 {0xC0, {0x3b, 0x00}, 0x02},
91 {0xC1, {0x0b, 0x02}, 0x02},
92 {0xC2, {0x07, 0x02}, 0x02},
93 {0xCC, {0x10}, 0x01},
94 {0xCD, {0x08}, 0x01}, // 用565时屏蔽 666打开
95 {0xb0, {0x00, 0x11, 0x16, 0x0e, 0x11, 0x06, 0x05, 0x09, 0x08, 0x21, 0x06, 0x13, 0x10, 0x29, 0x31, 0x18}, 0x10},
96 {0xb1, {0x00, 0x11, 0x16, 0x0e, 0x11, 0x07, 0x05, 0x09, 0x09, 0x21, 0x05, 0x13, 0x11, 0x2a, 0x31, 0x18}, 0x10},
97 {0xFF, {0x77, 0x01, 0x00, 0x00, 0x11}, 0x05},
98 {0xb0, {0x6d}, 0x01},
99 {0xb1, {0x37}, 0x01},
100 {0xb2, {0x81}, 0x01},
101 {0xb3, {0x80}, 0x01},
102 {0xb5, {0x43}, 0x01},
103 {0xb7, {0x85}, 0x01},
104 {0xb8, {0x20}, 0x01},
105 {0xc1, {0x78}, 0x01},
106 {0xc2, {0x78}, 0x01},
107 {0xc3, {0x8c}, 0x01},
108 {0xd0, {0x88}, 0x01},
109 {0xe0, {0x00, 0x00, 0x02}, 0x03},
110 {0xe1, {0x03, 0xa0, 0x00, 0x00, 0x04, 0xa0, 0x00, 0x00, 0x00, 0x20, 0x20}, 0x0b},
111 {0xe2, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0x0d},
112 {0xe3, {0x00, 0x00, 0x11, 0x00}, 0x04},
113 {0xe4, {0x22, 0x00}, 0x02},
114 {0xe5, {0x05, 0xec, 0xa0, 0xa0, 0x07, 0xee, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0x10},
115 {0xe6, {0x00, 0x00, 0x11, 0x00}, 0x04},
116 {0xe7, {0x22, 0x00}, 0x02},
117 {0xe8, {0x06, 0xed, 0xa0, 0xa0, 0x08, 0xef, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 0x10},
118 {0xeb, {0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00}, 0x07},
119 {0xed, {0xff, 0xff, 0xff, 0xba, 0x0a, 0xbf, 0x45, 0xff, 0xff, 0x54, 0xfb, 0xa0, 0xab, 0xff, 0xff, 0xff}, 0x10},
120 {0xef, {0x10, 0x0d, 0x04, 0x08, 0x3f, 0x1f}, 0x06},
121 {0xFF, {0x77, 0x01, 0x00, 0x00, 0x13}, 0x05},
122 {0xef, {0x08}, 0x01},
123 {0xFF, {0x77, 0x01, 0x00, 0x00, 0x00}, 0x05},
124 {0x36, {0x08}, 0x01},
125 {0x3a, {0x66}, 0x01},
126 {0x11, {0x00}, 0x80},
127 {0x29, {0x00}, 0x80},
128 {0, {0}, 0xff}
129};
130
132IoExpanderSPI expanderSPI;
133
134uint8_t cs = 3;
135uint8_t mosi = 4;
136uint8_t sclk = 5;
137uint8_t reset = 6;
138uint8_t power_enable = 2;
139
140static const lcd_init_cmd_t *_init_cmd = st7701_2_1_inches;
141esp_lcd_panel_handle_t _panelDrv;
142std::vector < uint16_t > draw_buf(BOARD_TFT_WIDTH * BOARD_TFT_HEIGHT * 2, 0x000);
143
144void writeCommand(const uint8_t cmd)
145{
146 uint16_t data = cmd;
147 expanderSPI.transfer9(data);
148}
149
150void writeData(const uint8_t *data, int len)
151{
152 uint32_t i = 0;
153 if (len > 0) {
154 do {
155 // The ninth bit of data, 1, represents data, 0 represents command
156 uint16_t pdat = (*(data + i)) | 1 << 8;
157 expanderSPI.transfer9(pdat);
158 i++;
159 } while (len--);
160 }
161}
162
163void setup()
164{
165 Serial.begin(115200);
166
167 /*
168 *
169 * If the device address is not known, the 0xFF parameter can be passed in.
170 *
171 * XL9555_UNKNOWN_ADDRESS = 0xFF
172 *
173 * If the device address is known, the device address is given
174 *
175 * XL9555_SLAVE_ADDRESS0 = 0x20
176 * XL9555_SLAVE_ADDRESS1 = 0x21
177 * XL9555_SLAVE_ADDRESS2 = 0x22
178 * XL9555_SLAVE_ADDRESS3 = 0x23
179 * XL9555_SLAVE_ADDRESS4 = 0x24
180 * XL9555_SLAVE_ADDRESS5 = 0x25
181 * XL9555_SLAVE_ADDRESS6 = 0x26
182 * XL9555_SLAVE_ADDRESS7 = 0x27
183 */
184 const uint8_t chip_address = XL9555_UNKNOWN_ADDRESS;
185
186 if (!expander.begin(Wire, chip_address, SENSOR_SDA, SENSOR_SCL)) {
187 while (1) {
188 Serial.println("Failed to find XL9555 - check your wiring!");
189 delay(1000);
190 }
191 }
192
197 expander.pinMode(power_enable, OUTPUT);
198 expander.digitalWrite(power_enable, HIGH);
199
200 expander.pinMode(reset, OUTPUT);
201 expander.digitalWrite(reset, LOW);
202 delay(20);
203 expander.digitalWrite(reset, HIGH);
204 delay(10);
205
206
207 Wire.setClock(1000000UL);
208 uint32_t start = millis();
209
210 expanderSPI.beginSPI(expander, mosi, -1, sclk, cs);
211
212 int i = 0;
213 while (_init_cmd[i].databytes != 0xff) {
214 writeCommand(_init_cmd[i].cmd);
215 writeData(_init_cmd[i].data, _init_cmd[i].databytes & 0x1F);
216 if (_init_cmd[i].databytes & 0x80) {
217 delay(100);
218 }
219 i++;
220 }
221
222 uint32_t end = millis();
223
224 Serial.printf("Initialization took %u milliseconds\n", end - start);
225
226 // Uses 400k I2C speed : Initialization took about 6229 milliseconds
227 // Uses 1M I2C speed : Initialization took about 1833 milliseconds
228
229 // Reduce to standard speed, touch does not support access greater than 400KHZ speed
230 Wire.setClock(400000UL);
231
232
233 esp_lcd_rgb_panel_config_t panel_config = {
234 .clk_src = LCD_CLK_SRC_PLL160M,
235 .timings =
236 {
237 .pclk_hz = RGB_MAX_PIXEL_CLOCK_HZ,
238 .h_res = BOARD_TFT_WIDTH,
239 .v_res = BOARD_TFT_HEIGHT,
240 // The following parameters should refer to LCD spec
241 .hsync_pulse_width = 1,
242 .hsync_back_porch = 30,
243 .hsync_front_porch = 50,
244 .vsync_pulse_width = 1,
245 .vsync_back_porch = 30,
246 .vsync_front_porch = 20,
247 .flags =
248 {
249 .hsync_idle_low = 0,
250 .vsync_idle_low = 0,
251 .de_idle_high = 0,
252 .pclk_active_neg = 1,
253 .pclk_idle_high = 0
254 },
255 },
256 .data_width = 16, // RGB565 in parallel mode, thus 16bit in width
257 .sram_trans_align = 0,
258 .psram_trans_align = 64,
259 .hsync_gpio_num = BOARD_TFT_HSYNC,
260 .vsync_gpio_num = BOARD_TFT_VSYNC,
261 .de_gpio_num = BOARD_TFT_DE,
262 .pclk_gpio_num = BOARD_TFT_PCLK,
263
264#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3,0,0)
265 .disp_gpio_num = GPIO_NUM_NC,
266 .data_gpio_nums =
267 {
268 // BOARD_TFT_DATA0,
269 BOARD_TFT_DATA13,
270 BOARD_TFT_DATA14,
271 BOARD_TFT_DATA15,
272 BOARD_TFT_DATA16,
273 BOARD_TFT_DATA17,
274
275 BOARD_TFT_DATA6,
276 BOARD_TFT_DATA7,
277 BOARD_TFT_DATA8,
278 BOARD_TFT_DATA9,
279 BOARD_TFT_DATA10,
280 BOARD_TFT_DATA11,
281 // BOARD_TFT_DATA12,
282
283 BOARD_TFT_DATA1,
284 BOARD_TFT_DATA2,
285 BOARD_TFT_DATA3,
286 BOARD_TFT_DATA4,
287 BOARD_TFT_DATA5,
288 },
289#else
290 .data_gpio_nums =
291 {
292 // BOARD_TFT_DATA0,
293 BOARD_TFT_DATA13,
294 BOARD_TFT_DATA14,
295 BOARD_TFT_DATA15,
296 BOARD_TFT_DATA16,
297 BOARD_TFT_DATA17,
298
299 BOARD_TFT_DATA6,
300 BOARD_TFT_DATA7,
301 BOARD_TFT_DATA8,
302 BOARD_TFT_DATA9,
303 BOARD_TFT_DATA10,
304 BOARD_TFT_DATA11,
305 // BOARD_TFT_DATA12,
306
307 BOARD_TFT_DATA1,
308 BOARD_TFT_DATA2,
309 BOARD_TFT_DATA3,
310 BOARD_TFT_DATA4,
311 BOARD_TFT_DATA5,
312 },
313 .disp_gpio_num = GPIO_NUM_NC,
314 .on_frame_trans_done = NULL,
315 .user_ctx = NULL,
316#endif
317 .flags =
318 {
319 .fb_in_psram = 1, // allocate frame buffer in PSRAM
320 },
321 };
322
323 log_d("new rgb panel");
324 ESP_ERROR_CHECK(esp_lcd_new_rgb_panel(&panel_config, &_panelDrv));
325 ESP_ERROR_CHECK(esp_lcd_panel_init(_panelDrv));
326
327 pinMode(BOARD_TFT_BL, OUTPUT);
328 digitalWrite(BOARD_TFT_BL, HIGH);
329}
330
331void loop()
332{
333 std::fill(draw_buf.begin(), draw_buf.end(), random(0x0000, 0xFFFF));
334 esp_lcd_panel_draw_bitmap(_panelDrv, 0, 0, BOARD_TFT_WIDTH, BOARD_TFT_HEIGHT, draw_buf.data());
335 delay(1000);
336}
337
338#else
339void setup()
340{
341 Serial.begin(115200);
342}
343
344void loop()
345{
346 Serial.println("The example only support your esp32s3 platform"); delay(1000);
347}
348#endif /*ARDUINO_ARCH_ESP32*/
@license MIT License
#define SENSOR_SCL
#define SENSOR_SDA
bool begin(SensorCommCustom::CustomCallback callback, uint8_t addr)
Initialize the sensor using custom callback interface.
void pinMode(uint8_t pin, uint8_t mode)
Set the direction of a GPIO pin.
void digitalWrite(uint8_t pin, bool value)
Write a digital value to an output pin.
Software SPI master class for driving GPIO expanders via bit-banging.
bool beginSPI(IoExpanderBase &base, int mosi, int miso, int sck, int cs)
Initialize the software SPI interface.
uint16_t transfer9(uint16_t val)
Transfer 9 bits over SPI.
Concrete driver for the XL9555 16‑bit I2C GPIO expander.
IoExpanderPCA9570 expander
uint8_t i
void setup()
void loop()