Форум, приветствую! Снова я не могу без вашей помощи.
Плата esp32-s3-nano, дисплей такой, если правильно понял, он на чипе ST7796
Код рабочий, но время обновления экрана целиком секунды три примерно, что ну никак меня не устраивает.
#include <SPI.h>
#define CS 8
#define RS 10
#define RESET 9
#define SPI_FREQUENCY 80000000
#define SPI_MODE SPI_MODE0
void Lcd_Writ_Bus(uint8_t d) {
SPI.beginTransaction(SPISettings(SPI_FREQUENCY, MSBFIRST, SPI_MODE));
SPI.transfer(d);
SPI.endTransaction();
}
void Lcd_Write_Com(uint8_t VH) {
digitalWrite(RS, LOW);
Lcd_Writ_Bus(VH);
}
void Lcd_Write_Data(uint8_t VH) {
digitalWrite(RS, HIGH);
Lcd_Writ_Bus(VH);
}
void Lcd_Write_Com_Data(uint8_t com, uint8_t dat) {
Lcd_Write_Com(com);
Lcd_Write_Data(dat);
}
void Address_set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
Lcd_Write_Com(0x2a);
Lcd_Write_Data(x1>>8);
Lcd_Write_Data(x1);
Lcd_Write_Data(x2>>8);
Lcd_Write_Data(x2);
Lcd_Write_Com(0x2b);
Lcd_Write_Data(y1>>8);
Lcd_Write_Data(y1);
Lcd_Write_Data(y2>>8);
Lcd_Write_Data(y2);
Lcd_Write_Com(0x2c);
}
void Lcd_Init() {
digitalWrite(RESET, HIGH);
delay(5);
digitalWrite(RESET, LOW);
delay(15);
digitalWrite(RESET, HIGH);
delay(15);
digitalWrite(CS, LOW);
Lcd_Write_Com(0x11);
delay(120);
Lcd_Write_Com(0x36);
Lcd_Write_Data(0x48);
Lcd_Write_Com(0x3A);
Lcd_Write_Data(0x55);
Lcd_Write_Com(0xF0);
Lcd_Write_Data(0xC3);
Lcd_Write_Com(0xF0);
Lcd_Write_Data(0x96);
Lcd_Write_Com(0xB4);
Lcd_Write_Data(0x02);
Lcd_Write_Com(0xB7);
Lcd_Write_Data(0xC6);
Lcd_Write_Com(0xC0);
Lcd_Write_Data(0xC0);
Lcd_Write_Data(0x00);
Lcd_Write_Com(0xC1);
Lcd_Write_Data(0x13);
Lcd_Write_Com(0xC2);
Lcd_Write_Data(0xA7);
Lcd_Write_Com(0xC5);
Lcd_Write_Data(0x21);
Lcd_Write_Com(0xE8);
Lcd_Write_Data(0x40);
Lcd_Write_Data(0x8A);
Lcd_Write_Data(0x1B);
Lcd_Write_Data(0x1B);
Lcd_Write_Data(0x23);
Lcd_Write_Data(0x0A);
Lcd_Write_Data(0xAC);
Lcd_Write_Data(0x33);
Lcd_Write_Com(0xE0);
Lcd_Write_Data(0xD2);
Lcd_Write_Data(0x05);
Lcd_Write_Data(0x08);
Lcd_Write_Data(0x06);
Lcd_Write_Data(0x05);
Lcd_Write_Data(0x02);
Lcd_Write_Data(0x2A);
Lcd_Write_Data(0x44);
Lcd_Write_Data(0x46);
Lcd_Write_Data(0x39);
Lcd_Write_Data(0x15);
Lcd_Write_Data(0x15);
Lcd_Write_Data(0x2D);
Lcd_Write_Data(0x32);
Lcd_Write_Com(0xE1);
Lcd_Write_Data(0x96);
Lcd_Write_Data(0x08);
Lcd_Write_Data(0x0C);
Lcd_Write_Data(0x09);
Lcd_Write_Data(0x09);
Lcd_Write_Data(0x25);
Lcd_Write_Data(0x2E);
Lcd_Write_Data(0x43);
Lcd_Write_Data(0x42);
Lcd_Write_Data(0x35);
Lcd_Write_Data(0x11);
Lcd_Write_Data(0x11);
Lcd_Write_Data(0x28);
Lcd_Write_Data(0x2E);
Lcd_Write_Com(0xF0);
Lcd_Write_Data(0x3C);
Lcd_Write_Com(0xF0);
Lcd_Write_Data(0x69);
delay(120);
Lcd_Write_Com(0x21);
Lcd_Write_Com(0x29);
digitalWrite(CS, HIGH);
}
void setup() {
pinMode(CS, OUTPUT);
pinMode(RS, OUTPUT);
pinMode(RESET, OUTPUT);
digitalWrite(CS, HIGH);
digitalWrite(RS, HIGH);
digitalWrite(RESET, HIGH);
SPI.begin();
//SPI.setClockDivider(SPI_CLOCK_DIV2);
SPI.setBitOrder(MSBFIRST);
SPI.setFrequency(SPI_FREQUENCY);
SPI.setDataMode(SPI_MODE0);
Lcd_Init();
}
void loop() {
digitalWrite(CS, LOW);
Address_set(0,0,319,479);
uint32_t ms = millis();
for (uint16_t x = 0; x < 480; x++) {
uint16_t i = (x * 63 * 6 / 480 + ms) % (63 * 6);
uint8_t r = 0;
uint8_t g = 0;
uint8_t b = 0;
if (i < 63) {
r = 63;
g = i;
} else if (i < 63 * 2) {
r = 63 * 2 - i;
g = 63;
} else if (i < 63 * 3) {
g = 63;
b = i - 63 * 2;
} else if (i < 63 * 4) {
g = 63 * 4 - i;
b = 63;
} else if (i < 63 * 5) {
r = i - 63 * 4;
b = 63;
} else {
r = 63;
b = 63 * 6 - i;
}
for (uint16_t y = 0; y < 320; y++) {
uint8_t r2 = (uint16_t)r * y / 319;
uint8_t g2 = (uint16_t)g * y / 319;
uint8_t b2 = (uint16_t)b * y / 319;
uint16_t color = (r2 >> 1) << 11 | g2 << 5 | (b2 >> 1);
Lcd_Write_Data(color >> 8);
Lcd_Write_Data(color);
}
}
digitalWrite(CS, HIGH);
}
у меня подозрение, что основная потеря в скорости из-за использования SPI.h, который наверняка идет из пакета для arduino esp32-s3-nano от разработчиков, и не хочет взаимодействовать со spi на хорошей скорости. Есть мысли?