Доброго времени суток!
Используя эту статью по подключению монитора ST7735 я собрал схему и написал код из статьи.
Получилось, но со странностями.
Первая странность, перепутаны цвета. Вот такие цвета я использовал
#define ST7735_COLOR_RED 0xF800 #define ST7735_COLOR_GREEN 0x07E0 #define ST7735_COLOR_BLUE 0x001F #define ST7735_COLOR_YELLOW 0xFFE0 #define ST7735_COLOR_WHITE 0xFFFF #define ST7735_COLOR_BLACK 0x0000 #define ST7735_COLOR_ORANGE 0xFA20
Синий попутан с красным, почему так?
Далее не понятно, почему монитор не все показывает?
Вот размеры монитора:
#define ST7735_X_SIZE 128 #define ST7735_Y_SIZE 160
Что бы я не делал, пиксели по Y от 0 до 35 находятся за пределами видимости. Как такое возможно?
Вот код отрисовки прямоугольников:
ST7735_DrawRect(0, 0, ST7735_X_SIZE, ST7735_Y_SIZE, ST7735_COLOR_BLACK); ST7735_DrawRect(0, 0, 35, 35, ST7735_COLOR_RED); ST7735_DrawRect(35, 35, 85, 85, ST7735_COLOR_GREEN); ST7735_DrawRect(85, 85, 128, 160, ST7735_COLOR_BLUE);
Где косяки - не пойму?
@mihayk Доброго!
По поводу цветов - там есть бит или биты в конфигурации дисплея, которые за это отвечают, навскидку не помню, потом могу посмотреть в даташите.
А по поводу размеров - судя по фото, дисплей не 128*160, а 128*128.
Вот что получается если делаешь размеры 128 на 128.
Отрезается верхняя часть монитора! А нижняя часть ограничивается 128 пикселями, поэтому там рябь. Проблема заключается в том, что куда то подевалась часть монитора от 0.0 до 128.30
Если сместить все прямоугольники по Y на 30 пикселей, то все ОК!
Но почему?
Брак китайской поделки?
@mihayk Брак по цветам может быть из за того, какое декодирование включено RGB, BRG, RBG
Я согласен что декодирование неправильное, но как понять какое именно стоит на данном мониторе?
Можно конечно поменять синий дефайн на красный, но остальные цвета придется подбирать методом проб.
#define ST7735_COLOR_RED 0xF800 На самом деле Синий #define ST7735_COLOR_GREEN 0x07E0 Зеленый остался #define ST7735_COLOR_BLUE 0x001F На самом деле Красный #define ST7735_COLOR_YELLOW 0xFFE0 На самом деле Салатовый #define ST7735_COLOR_WHITE 0xFFFF Белый он и в Африке Белый #define ST7735_COLOR_BLACK 0x0000 Черный понятно #define ST7735_COLOR_ORANGE 0xFA20 На самом деле голубой
@mihayk это в регистре можно изменить, в одном из тех, которые пишутся при инициализации. Нужно в даташите найти, в каком регистре, и поменять в инициализации.
@aveal Понятно, со цветами - надо поискать.
А с размерами тоже в даташите искать надо? Напомню что у меня размеры 128х160. Но 128х30 пикселей сверху (по Y) обрезаны.
@mihayk можно посмотреть тоже на предмет вариантов, в каком направлении обход по пикселям идёт. Я сейчас пока отъехал, могу глянуть через пару дней, освежить память)
Вообще были прецеденты, когда в большой партии дисплеев от одного поставщика были экземпляры с разными смещениями. Единственное что - там были порядки 2-5 единиц.
@aveal Значит проштудировал я интернет, повертел биты в коде и выяснил все сам.
Все дело было в команде MADCTL. Для нормального отображения цветов нужно было возвести 1 в бите цветов: 00001000. Далее долго не мог понять с ориентацией. Дело в том что ориентация пикселей монитора:
А ориентация ОЗУ монитора:
Методом проб и ошибок вертел биты ориентации на одном месте 🙂 пока не добился нужной позиции: 01100000
Соединил с битом цветов получил байт 01101000 или 0х68. Что и требовалось отправить в команду MADCTL данные 0х68.
P.S. в действительности монитор оказался 128х128.
Дальше выясняется, что в каждом пакете ровно вдвое больше байт, чем должно быть. Отсюда возникает предположение, что SPI контроллер работает в режиме 16-бит. Это вполне объяснило бы и несвоевременный DCX.
«Не знаю, что за "режим 16-бит", DS у меня 8 бит, значит всё норм» - подумал я.
Для тех, кто, как и я, не использует HAL от ST и прочитал datasheet по диагонали.
Решение:
// вместо SPI->DR = byte; *(volatile uint8_t*)&SPI->DR = byte;
Ссылки:
http://www.efton.sk/STM32/gotcha/g22.html
https://community.st.com/t5/stm32-mcu-products/why-would-spi-send-16-bits-instead-of-8/td-p/120501
Если бы Вы раньше посмотрели мои дрова, то увидели бы, что примерно так и есть.
В продолжение разговора под статьей.
На данном этапе картина такая
Код
ST7735_DrawRect(0, 0, 35, 35, ST7735_COLOR_RED);
ST7735_DrawRect(35, 35, 70, 70, ST7735_COLOR_GREEN);
ST7735_DrawRect(70, 70, 150, 80, ST7735_COLOR_ORANGE);
Настройка ориентации(сделал ландшафт с началом координат в верхнем левом углу).
ST7735_SendCommand(ST7735_MADCTL);
ST7735_SendData(0b01101000);
Предыдущий пост утратил актуальность) Нужно было обновить фон.
Разрешение
#define ST7735_X_SIZE 160
#define ST7735_Y_SIZE 80
Ориентация
ST7735_SendCommand(ST7735_MADCTL);
ST7735_SendData(0b01101000);
Команды
ST7735_DrawRect(0, 0, 35, 35, ST7735_COLOR_RED);
ST7735_DrawRect(35, 35, 70, 70, ST7735_COLOR_GREEN);
ST7735_DrawRect(70, 70, 160, 80, ST7735_COLOR_BLACK);
Результат команд