Top.Mail.Ru
Уведомления
Очистить все

[Решено] Дисплей st7735. Подключение к stm32f100, stm32f072

Страница 7 / 8
(@mihayk)
Level 3

Доброго времени суток! 

Используя эту статью по подключению монитора ST7735 я собрал схему и написал код из статьи.

Получилось, но со странностями.

Фото 19072023

 Первая странность, перепутаны цвета. Вот такие цвета я использовал 

#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);

Где косяки - не пойму?

ОтветитьЦитата
Размещено : 19.07.2023 10:29
Aveal
(@aveal)
Top level Admin

@mihayk Доброго!

По поводу цветов - там есть бит или биты в конфигурации дисплея, которые за это отвечают, навскидку не помню, потом могу посмотреть в даташите.

А по поводу размеров - судя по фото, дисплей не 128*160, а 128*128.

ОтветитьЦитата
Размещено : 19.07.2023 11:12
(@mihayk)
Level 3
IMG 20230719 153735

Вот что получается если делаешь размеры 128 на 128.

Отрезается верхняя часть монитора! А нижняя часть ограничивается 128 пикселями, поэтому там рябь. Проблема заключается в том, что куда то подевалась часть монитора от 0.0 до 128.30

 

ОтветитьЦитата
Размещено : 19.07.2023 15:45
(@mihayk)
Level 3

Если сместить все прямоугольники по Y на 30 пикселей, то все ОК!

Но почему? 

Брак китайской поделки?

ОтветитьЦитата
Размещено : 19.07.2023 15:58
(@eduard)
Level 5 Moderator

@mihayk Брак по цветам может быть из за того, какое декодирование включено RGB, BRG, RBG

ОтветитьЦитата
Размещено : 19.07.2023 19:39
(@mihayk)
Level 3

Я согласен что декодирование неправильное, но как понять какое именно стоит на данном мониторе?

Можно конечно поменять синий дефайн на красный, но остальные цвета придется подбирать методом проб. 

#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 На самом деле голубой
ОтветитьЦитата
Размещено : 20.07.2023 11:15
Aveal
(@aveal)
Top level Admin

@mihayk это в регистре можно изменить, в одном из тех, которые пишутся при инициализации. Нужно в даташите найти, в каком регистре, и поменять в инициализации.

ОтветитьЦитата
Размещено : 20.07.2023 16:55
(@mihayk)
Level 3

@aveal Понятно, со цветами - надо поискать. 

А с размерами тоже в даташите искать надо? Напомню что у меня размеры 128х160.  Но 128х30 пикселей сверху (по Y) обрезаны. 

ОтветитьЦитата
Размещено : 20.07.2023 20:34
Aveal
(@aveal)
Top level Admin

@mihayk можно посмотреть тоже на предмет вариантов, в каком направлении обход по пикселям идёт. Я сейчас пока отъехал, могу глянуть через пару дней, освежить память)

Вообще были прецеденты, когда в большой партии дисплеев от одного поставщика были экземпляры с разными смещениями. Единственное что - там были порядки 2-5 единиц.

ОтветитьЦитата
Размещено : 20.07.2023 22:19
(@mihayk)
Level 3

@aveal Значит проштудировал я интернет, повертел биты в коде и выяснил все сам.

Все дело было в команде MADCTL. Для нормального отображения цветов нужно было возвести 1 в бите цветов: 00001000. Далее долго не мог понять с ориентацией. Дело в том что ориентация пикселей монитора:

1475744907 ris7

А ориентация ОЗУ монитора:

1475744869 ris6

Методом проб и ошибок вертел биты ориентации на одном месте 🙂  пока не добился нужной позиции: 01100000

Соединил с битом цветов получил байт 01101000 или 0х68. Что и требовалось отправить в команду MADCTL данные 0х68.

P.S. в действительности монитор оказался 128х128.

 

ОтветитьЦитата
Размещено : 21.07.2023 09:30
Aveal
(@aveal)
Top level Admin

@mihayk Рад, что получилось 👍 

ОтветитьЦитата
Размещено : 23.07.2023 08:50
(@entrance)
New member
От: @mamon

Дальше выясняется, что в каждом пакете ровно вдвое больше байт, чем должно быть. Отсюда возникает предположение, что 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

ОтветитьЦитата
Размещено : 01.08.2023 17:55
(@eduard)
Level 5 Moderator

Если бы Вы раньше посмотрели мои дрова, то увидели бы, что примерно так и есть.

ОтветитьЦитата
Размещено : 01.08.2023 18:25
(@336219429)
Level 1

В продолжение разговора под статьей.

На данном этапе картина такая

изображение

Код

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);

 

ОтветитьЦитата
Размещено : 09.12.2023 16:09
(@336219429)
Level 1

Предыдущий пост утратил актуальность) Нужно было обновить фон.

Разрешение

#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);

 Результат команд

изображение

 

 

ОтветитьЦитата
Размещено : 09.12.2023 16:32
Страница 7 / 8
Поделиться: