Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/39: Рейтинг темы: голосов - 39, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 02.11.2020
Сообщений: 9

ST7735 + STM32

02.11.2020, 15:51. Показов 8178. Ответов 20

Студворк — интернет-сервис помощи студентам
Доброго времени суток
Помогите,пожалуйста, разобраться с datasheet контроллера ST7735 (дисплей 1.44 tft 128x128)
Посмотрел у других людей код инициализации, у китайцев пример попросил, у всех работает.
Но почему последовательность команд и данных такая, не могу понять.
Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2020, 15:51
Ответы с готовыми решениями:

STM32F103C8T6 и дисплей ST7735
Вывожу график на дисплей, размер окна графика 140х50 = 7000 точек. Сам дисплей 160х128 точек. Сначала - подложку, затем оси, курсоры в виде...

STM32F103 + ST7735 + STemWin
Всем здравия. Подскажите пожалуйста с чего начать подключать STemWin? Мануал помогает как-то плохо (пока). Готовый пример на дисковери...

STM32F4Discovery + дисплейчик ST7735
Привет всем. Попал тут ко мне дисплейчик - http://www.ebay.com/itm/1-8-TFT-LCD-mod ... 1277wt_934 Нашёл проект уважаемого ВитГа -...

20
1 / 1 / 0
Регистрация: 02.11.2020
Сообщений: 9
03.11.2020, 14:58  [ТС]
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
void spi_SendByte(uint8_t Data) { //-- реализация программного SPI
    uint8_t i = 0;
    for (i = 8; i > 0; i--) { //-- делаем 8 итераций
        if (Data & 0x80) { //-- 0x80 маска для того чтобы считывать СТАРШИЙ бит
            mosiHIGH; //-- если истина то 1
        } else //-- иначе 0
            mosiLOW;
        clkLOW; //-- начало такта
        clkHIGH; //-- конец такта
        Data <<= 1; //-- смещаем данные влево
    }
}
 
void reset_hardware(void){ //-- функция аппаратной перезагрузки
    reset_HIGH;     //-- выставляем на всякий случай 1
    HAL_Delay(5);   //-- задержка
    reset_LOW;      //-- выставляем 0
    HAL_Delay(5);   //-- задержка
    reset_HIGH;     //-- выставляем в устойчивое состояние
    HAL_Delay(5);   //-- задержка
}
 
void tft_ST7735_sendCMD(uint8_t cmd) { //-- функция отправки команды
    select_cmd;
    spi_SendByte(cmd);
}
 
void tft_ST7735_sendDATA(uint8_t data) { //-- функция отправки данных
    select_data;
    spi_SendByte(data);
}
 
//-- команды для инициализации разбитые на 3 блока
void tft_ST7735_Init_Command1(){ //--список команд 1
    //-- Table 18 Panel Function Command List (1)
    tft_ST7735_sendCMD(ST7735_SWRESET);    //  1: Software reset
    HAL_Delay(2);
    tft_ST7735_sendCMD(ST7735_SLPOUT);     //  2: Out of sleep mode
    HAL_Delay(3);
    tft_ST7735_sendCMD(ST7735_FRMCTR1);    //  3: Frame rate ctrl - normal mode
    tft_ST7735_sendDATA(0x01);             //     Rate = fosc/(1x2+40) * (LINE+2C+2D)
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendCMD(ST7735_FRMCTR2);    //  4: Frame rate control - idle mode
    tft_ST7735_sendDATA(0x01);             //  Rate = fosc/(1x2+40) * (LINE+2C+2D)
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendCMD(ST7735_FRMCTR3);    //  5: Frame rate ctrl - partial mode
    tft_ST7735_sendDATA(0x01);             //     Dot inversion mode
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendDATA(0x01);             //     Line inversion mode
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendCMD(ST7735_INVCTR);     //  6: Display inversion ctrl
    tft_ST7735_sendDATA(0x07);             //     No inversion
    tft_ST7735_sendCMD(ST7735_PWCTR1);     //  7: Power control
    tft_ST7735_sendDATA(0xA2);
    tft_ST7735_sendDATA(0x02);             //     -4.6V
    tft_ST7735_sendDATA(0x84);              //     AUTO mode
    tft_ST7735_sendCMD(ST7735_PWCTR2);     //  8: Power control
    tft_ST7735_sendDATA(0xC5);             //     VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD
    tft_ST7735_sendCMD(ST7735_PWCTR3);     //  9: Power control
    tft_ST7735_sendDATA(0x0A);             //     Opamp current small
    tft_ST7735_sendDATA(0x00);             //     Boost frequency
    tft_ST7735_sendCMD(ST7735_PWCTR4);     // 10: Power control
    tft_ST7735_sendDATA(0x8A);             //     BCLK/2, Opamp current small & Medium low
    tft_ST7735_sendDATA(0x2A);
    tft_ST7735_sendCMD(ST7735_PWCTR5);     // 11: Power control
    tft_ST7735_sendDATA(0x8A);
    tft_ST7735_sendDATA(0xEE);
    tft_ST7735_sendCMD(ST7735_VMCTR1);     // 12: Power control
    tft_ST7735_sendDATA(0x0E);
    tft_ST7735_sendCMD(ST7735_INVOFF);     // 13: Don't invert display
    tft_ST7735_sendCMD(ST7735_MADCTL);     // 14: Memory access control (directions)
    tft_ST7735_sendDATA(ST7735_ROTATION);  //     row addr/col addr, bottom to top refresh
    tft_ST7735_sendCMD(ST7735_COLMOD);     // 15: set color mode
    tft_ST7735_sendDATA(0x05);              //     16-bit color
}
 
void tft_ST7735_Init_Command2(){ //--список команд 2
    tft_ST7735_sendCMD(ST7735_CASET);      //  1: Column addr set
    tft_ST7735_sendDATA(0x00);             //     XSTART = 0
    tft_ST7735_sendDATA(0x00);
    tft_ST7735_sendDATA(0x00);             //     XEND = 127
    tft_ST7735_sendDATA(0x7F);
    tft_ST7735_sendCMD(ST7735_RASET);      //  2: Row addr set
    tft_ST7735_sendDATA(0x00);             //     XSTART = 0
    tft_ST7735_sendDATA(0x00);
    tft_ST7735_sendDATA(0x00);             //     XEND = 127
    tft_ST7735_sendDATA(0x9F);
}
 
void tft_ST7735_Init_Command3(){ //--список команд 3
    tft_ST7735_sendCMD(ST7735_GMCTRP1);    //  Gamma ‘+’polarity Correction Characteristics Setting
    tft_ST7735_sendDATA(0x02);
    tft_ST7735_sendDATA(0x1C);
    tft_ST7735_sendDATA(0x07);
    tft_ST7735_sendDATA(0x12);
    tft_ST7735_sendDATA(0x37);
    tft_ST7735_sendDATA(0x32);
    tft_ST7735_sendDATA(0x29);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendDATA(0x29);
    tft_ST7735_sendDATA(0x25);
    tft_ST7735_sendDATA(0x2B);
    tft_ST7735_sendDATA(0x39);
    tft_ST7735_sendDATA(0x00);
    tft_ST7735_sendDATA(0x01);
    tft_ST7735_sendDATA(0x03);
    tft_ST7735_sendDATA(0x10);
    tft_ST7735_sendCMD(ST7735_GMCTRN1);    //  Gamma ‘-’polarity Correction Characteristics Setting
    tft_ST7735_sendDATA(0x03);
    tft_ST7735_sendDATA(0x1D);
    tft_ST7735_sendDATA(0x07);
    tft_ST7735_sendDATA(0x06);
    tft_ST7735_sendDATA(0x2E);
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x29);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendDATA(0x2E);
    tft_ST7735_sendDATA(0x2E);
    tft_ST7735_sendDATA(0x37);
    tft_ST7735_sendDATA(0x3F);
    tft_ST7735_sendDATA(0x00);
    tft_ST7735_sendDATA(0x00);
    tft_ST7735_sendDATA(0x02);
    tft_ST7735_sendDATA(0x10);
    tft_ST7735_sendCMD(ST7735_NORON);     // 3: Normal display on, no args, w/delay
    HAL_Delay(1);
    tft_ST7735_sendCMD(ST7735_DISPON);    // 4: Main screen turn on, no args w/delay
    HAL_Delay(1);
}
 
void tft_ST7735_Init() { //-- инициализация дисплея
    cs_LOW;
    reset_hardware();
    tft_ST7735_Init_Command1();   //ST7735_ExecuteCommandList(init_cmds1);
    tft_ST7735_Init_Command2();   //ST7735_ExecuteCommandList(init_cmds2);
    tft_ST7735_Init_Command3();   //ST7735_ExecuteCommandList(init_cmds3);
    cs_HIGH;
}
0
Почетный модератор
 Аватар для Humanoid
11557 / 4352 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
03.11.2020, 23:17
Цитата Сообщение от defRoman Посмотреть сообщение
Но почему последовательность команд и данных такая, не могу понять.
Что именно вас смущает? Вроде, всё логично: ресет, вывод из power-down, настройка частот и напряжений, выбор активной зоны, настройка гаммы, включение экрана. Выбор активной зоны, скорее всего, непринципиален... можно в конец перенести или совсем убрать (обычно перед выводом картинки указывают размер и позицию).
1
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
04.11.2020, 09:19
Цитата Сообщение от defRoman Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
void spi_SendByte(uint8_t Data) { //-- реализация программного SPI
    uint8_t i = 0;
    for (i = 8; i > 0; i--) { //-- делаем 8 итераций
        if (Data & 0x80) { //-- 0x80 маска для того чтобы считывать СТАРШИЙ бит
            mosiHIGH; //-- если истина то 1
        } else //-- иначе 0
            mosiLOW;
        clkLOW; //-- начало такта
        clkHIGH; //-- конец такта
        Data <<= 1; //-- смещаем данные влево
    }
}
как то не кузяво
какая ширина импульса?
вот так мне больше нравится
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void spi_SendByte(uint8_t Data) { //-- реализация программного SPI
    uint8_t i = 0;
 
    for (i = 8; i > 0; i--) { //-- делаем 8 итераций
      clkHIGH; //-- начало такта
        if (Data & 0x80) { //-- 0x80 маска для того чтобы считывать СТАРШИЙ бит
            mosiHIGH; //-- если истина то 1
        } else //-- иначе 0
            mosiLOW;
      
        clkLOW; //-- конец такта
        Data <<= 1; //-- смещаем данные влево
    }
}
а я делал так, сдвигал не данные а маску
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void spi_SendByte(uint8_t Data) { //-- реализация программного SPI
    uint8_t i = 0;
 
    for (i = 0x80; i > 0; i>>=1) { //-- делаем 8 итераций
     clkHIGH; //-- начало такта
        if (Data & i) { // маска для очередного бита
            mosiHIGH; //-- если истина то 1
        } else //-- иначе 0
            mosiLOW;
       
        clkLOW; //-- конец такта
 
    }
clkHIGH
}
что более логично
1
1 / 1 / 0
Регистрация: 02.11.2020
Сообщений: 9
05.11.2020, 07:52  [ТС]
Меня смущает то, что я не могу разобраться с документацией, где там указано что надо именно эти данные отправлять и в какой последовательности. Не хватает человека который меня носом ткнет и я пойму

Добавлено через 1 минуту
А за подробности с SPI большое спасибо
0
1 / 1 / 0
Регистрация: 02.11.2020
Сообщений: 9
05.11.2020, 12:43  [ТС]
Надеюсь созрел на адекватный вопрос
Почему при инициализации первая команда 0xB1 ???
C
1
2
#define ST7735_FRMCTR1 0xB1 //-- Frame Rate Control (In normal mode/ Full colors). Контроль частоты кадров (в обычном режиме / полноцветный)
tft_ST7735_sendCMD(ST7735_FRMCTR1);
у команды есть 3 параметра:
C
1
2
3
tft_ST7735_sendDATA(0x01);
tft_ST7735_sendDATA(0x2C);
tft_ST7735_sendDATA(0x2D);

Почему первый 0x01? Второй 0x2C? Третий 0x2D?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void tft_ST7735_Init_Command1(){ //--список команд 1
    //-- Table 18 Panel Function Command List (1)
    tft_ST7735_sendCMD(ST7735_SWRESET); //-- программная перезагрузка димплея (подождать после неё 120мс)
    HAL_Delay(2);
    tft_ST7735_sendCMD(ST7735_SLPOUT); //-- Выход из спящего режима.
    HAL_Delay(3);
 
    tft_ST7735_sendCMD(ST7735_FRMCTR1); //-- Контроль частоты кадров в обычном режиме
    tft_ST7735_sendDATA(0x01);             //     Rate = fosc/(1x2+40) * (LINE+2C+2D)
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x2D);
 
    tft_ST7735_sendCMD(ST7735_FRMCTR2);    //  4: Frame rate control - idle mode
    tft_ST7735_sendDATA(0x01);             //  Rate = fosc/(1x2+40) * (LINE+2C+2D)
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendCMD(ST7735_FRMCTR3);    //  5: Frame rate ctrl - partial mode
    tft_ST7735_sendDATA(0x01);             //     Dot inversion mode
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendDATA(0x01);             //     Line inversion mode
    tft_ST7735_sendDATA(0x2C);
    tft_ST7735_sendDATA(0x2D);
    tft_ST7735_sendCMD(ST7735_INVCTR);     //  6: Display inversion ctrl
    tft_ST7735_sendDATA(0x07);             //     No inversion
    tft_ST7735_sendCMD(ST7735_PWCTR1);     //  7: Power control
    tft_ST7735_sendDATA(0xA2);
    tft_ST7735_sendDATA(0x02);             //     -4.6V
    tft_ST7735_sendDATA(0x84);              //     AUTO mode
    tft_ST7735_sendCMD(ST7735_PWCTR2);     //  8: Power control
    tft_ST7735_sendDATA(0xC5);             //     VGH25 = 2.4C VGSEL = -10 VGH = 3 * AVDD
    tft_ST7735_sendCMD(ST7735_PWCTR3);     //  9: Power control
    tft_ST7735_sendDATA(0x0A);             //     Opamp current small
    tft_ST7735_sendDATA(0x00);             //     Boost frequency
    tft_ST7735_sendCMD(ST7735_PWCTR4);     // 10: Power control
    tft_ST7735_sendDATA(0x8A);             //     BCLK/2, Opamp current small & Medium low
    tft_ST7735_sendDATA(0x2A);
    tft_ST7735_sendCMD(ST7735_PWCTR5);     // 11: Power control
    tft_ST7735_sendDATA(0x8A);
    tft_ST7735_sendDATA(0xEE);
    tft_ST7735_sendCMD(ST7735_VMCTR1);     // 12: Power control
    tft_ST7735_sendDATA(0x0E);
    tft_ST7735_sendCMD(ST7735_INVOFF);     // 13: Don't invert display
    tft_ST7735_sendCMD(ST7735_MADCTL);     // 14: Memory access control (directions)
    tft_ST7735_sendDATA(ST7735_ROTATION);  //     row addr/col addr, bottom to top refresh
    tft_ST7735_sendCMD(ST7735_COLMOD);     // 15: set color mode
    tft_ST7735_sendDATA(0x05);              //     16-bit color
}
Спасибо
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 907
Записей в блоге: 16
30.01.2021, 23:39
да просто многие просто код копипастят и не смотрят что, где, и как...
у меня вот такой инит..

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@ аппаратный сброс LCD
                         @ установим линию RST=0
                         MOV         R0, 0
                         LDR         R1, = ( PERIPH_BB_BASE + ( pRst_GPIO_BASE + GPIO_ODR ) * 32 + pRST * 4 )
                         STR         R0, [ R1 ]
                     @ пауза для фиксации сигнала сброса устройством
                         MOV         R0, 10
                         BL          SYSTICK_DELAY
                         @ установим линию RST=1
                         MOV         R0, 1
                         STR         R0, [ R1 ]
                     @ пауза после сброса
                         MOV         R0, 50
                         BL          SYSTICK_DELAY
 
          @ отправка команд инициализации LCD
                         MOV         R0, 0xC0               @ режим POWER1
                         BL          LCD_SENDCOM
                         MOV         R0, 0x23
                         BL          LCD_SENDDATA
 
                         MOV         R0, 0xC1               @ режим POWER2
                         BL          LCD_SENDCOM
                         MOV         R0, 0x10
                         BL          LCD_SENDDATA
 
                         MOV         R0, 0x36               @ направление вывода изображения и формат rgb
                         BL          LCD_SENDCOM
                         MOV         R0, 0X48
                         BL          LCD_SENDDATA
 
 
                         MOV         R0, 0x3A               @ режим цвета
                         BL          LCD_SENDCOM
                         MOV         R0, 0x55               @ 16ти битный цвет
                         BL          LCD_SENDDATA
 
                         MOV         R0, 0x11               @ разбудить дисплей
                         BL          LCD_SENDCOM
 
                         MOV         R0, 0x29               @ включить отображение
                         BL          LCD_SENDCOM
0
248 / 0 / 1
Регистрация: 29.11.2015
Сообщений: 229
14.06.2022, 19:05
Скажите, пожалуйста, а можно ли для этого модуля st7735 изначально задать начало его координат в других углах. У меня дисплейчик 128х160 распологается горизонтально. Если нет, то как это лучше организовать?
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 907
Записей в блоге: 16
15.06.2022, 06:56
Цитата Сообщение от Юрий_48 Посмотреть сообщение
изначально задать начало его координат в других углах.
смотрели 9.10.3 Frame Data Write Direction According to the MADCTL parameters (MV, MX and MY) ?
0
248 / 0 / 1
Регистрация: 29.11.2015
Сообщений: 229
15.06.2022, 11:32
Цитата Сообщение от ВитГо Посмотреть сообщение
смотрели 9.10.3 Frame Data Write Direction According to the MADCTL parameters (MV, MX and MY) ?
Ещё вчера разобрался, спасибо.
Миниатюры
ST7735 + STM32   ST7735 + STM32  
0
248 / 0 / 1
Регистрация: 29.11.2015
Сообщений: 229
22.06.2022, 02:23
Не всё так просто. Сделал такие настройки MV=1, MX=0, MY=1. После этого строка стала выводиться так, как хотел - вдоль длинной стороны (160) с левого верхнего угла. Но дальше 128-го пикселя по длине хотя что то и выводится, но искажённое. Поменять то строки с столбцами удалось, но, видимо, для новых столбцов осталось старое ограничение, а именно 128. Так понимаю, что как то надо задать новые размеры экрана не 128 на 160, а 160 на 128. Но как это сделать не смог найти. Помогите, пожалуйста, очень нужно. Начало дискуссии по этому вопросу тремя постами выше.
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 907
Записей в блоге: 16
22.06.2022, 04:47
Цитата Сообщение от Юрий_48 Посмотреть сообщение
Поменять то строки с столбцами удалось, но, видимо, для новых столбцов осталось старое ограничение, а именно 128.
ну аппаратное то ограничение у вас осталось... как дисплей подключили - так он и работает..
и проще такие перевороты сделать програмно если уж очень надо
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
22.06.2022, 07:29
Цитата Сообщение от Юрий_48 Посмотреть сообщение
Но дальше 128-го пикселя по длине хотя что то и выводится, но искажённое.
Может, у вас просто локальная переменная объявлена как int8_t или что-то в этом роде? Вряд ли это проблема в дисплее.
0
248 / 0 / 1
Регистрация: 29.11.2015
Сообщений: 229
22.06.2022, 12:58
Вычислил проблему. Последний символ вылезал за размер матрици (160) а контроллер st7789 как то интелликтуально это воспринимал - область заполнения под символ он укорачивал на вылезающий хвостик.
0
 Аватар для Redfern89
2 / 2 / 1
Регистрация: 05.11.2018
Сообщений: 96
26.07.2022, 06:17
Цитата Сообщение от ValeryS Посмотреть сообщение
как то не кузяво
какая ширина импульса?
вот так мне больше нравится

C
1
2
3
4
5
6
7
8
9
10
11
12
void spi_SendByte(uint8_t Data) { //-- реализация программного SPI
    uint8_t i = 0;
for (i = 8; i > 0; i--) { //-- делаем 8 итераций
      clkHIGH; //-- начало такта
        if (Data & 0x80) { //-- 0x80 маска для того чтобы считывать СТАРШИЙ бит
            mosiHIGH; //-- если истина то 1
        } else //-- иначе 0
            mosiLOW;
clkLOW; //-- конец такта
        Data <<= 1; //-- смещаем данные влево
    }
}
Запись данных обычно идет по ниспадающему фронту - тут по восходящему. Последний бит недойдет. и ваще - в STM есть хардверный SPI. Зачем такие костыли?
0
4035 / 2647 / 582
Регистрация: 11.09.2009
Сообщений: 9,448
27.07.2022, 06:25
Цитата Сообщение от defRoman Посмотреть сообщение
не могу разобраться с документацией, где там указано что надо именно эти данные отправлять и в какой последовательности. Не хватает человека который меня носом ткнет и я пойму
Тому, кто писал эту документацию, тоже не хватало такого человека.
Вы наверное обратили внимание, что там кроме опечаток есть просто "описания" без объяснений? Или что в "последовательностях инициализации" встречаются настройки регистров, отсутствующих в документации? Поэтому все так мучаются. Это вам ещё повезло, что купленный дисплейчик более-менее соответствует документации, а, например, не со смещением экрана или с "собственной" настройкой цветовой гаммы.
Кстати, "стёкла" на дисплеях на ST7735 бывают разного типа, требующие разной настройки. Я уж не говорю о частотах развёртки, которые никто нигде не указывает и не пишет, как настраивать, но есть даже с инверсией цвета и без...
У меня есть целая коллекция "настроек" для вариантов "просто ST7735S", "ST7735S_S5P HSD LCD", "ST7735S_S5P BOE", "ST7735_ALT", "ST7735_STD"... Отличаются и параметрами команд, и даже набором регистров. И всё равно умудрился купить дисплеи, к которым ни одна их этих настроек не подходит.

Кстати, никто не знает, что означает "стекло" типа "HSD" или "BOE"? И по каким внешним половым признакам отличать, какое именно в конкретном дисплее установлено?
1
248 / 0 / 1
Регистрация: 29.11.2015
Сообщений: 229
27.07.2022, 17:57
Проблема с инициализацией дисплея ST7735 - то инициализируется нормально, то зависнет где то в самом начале, примерно 3 к 1. Уже написал большую часть основной программы с нормальным выводом, думая, что потом разберусь, но понял, что это не по моим силам. Пробовал понатыкать в разных местах задержки, но это больше напоминало мартышку с очками. Подсунуть другой вариант инициализации на данном этапе моего опыта очень стрёмно. Вот выкладываю вариант инициализации, который сейчас капризничает. Помогите, пожелуйста, найти ошибку в этом варианте, или предложите что то другое, проверенное.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
void lcd_st7735_send(uint8_t data) 
  {
      HAL_SPI_Transmit(&hspi1, &data, 1, 10);
  }
 
// Отправка команды на дисплей с ожиданием конца передачи
void lcd_st7735_send_cmd(uint8_t cmd) 
  {
      LCD_ST7735_A0_0;
      lcd_st7735_send(cmd);
  }
 
// Отправка данных на дисплей с ожиданием конца передачи
void lcd_st7735_send_data(uint8_t data) 
  {
      LCD_ST7735_A0_1;
      lcd_st7735_send(data);
  }
 
// Определение области экрана для заполнения
void lcd_st7735_at(uint8_t startX, uint8_t startY, uint8_t stopX, uint8_t stopY) 
{
    lcd_st7735_send_cmd(0x2A);  
    lcd_st7735_send_data(0x00);
    lcd_st7735_send_data(startX);
    lcd_st7735_send_data(0x00);        
    lcd_st7735_send_data(stopX);
        
    lcd_st7735_send_cmd(0x2B);
    lcd_st7735_send_data(0x00);
    lcd_st7735_send_data(startY);
    lcd_st7735_send_data(0x00);       
    lcd_st7735_send_data(stopY);
}
 
// Инициализация
void lcd_st7735_init(void) 
{
    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_DIRECTION_1LINE;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
    hspi1.Init.CRCPolynomial = 10;
    HAL_SPI_Init(&hspi1);
    //HAL_Delay(1000);
    
    // CS=0  - начали сеанс работы с дисплеем
    LCD_ST7735_CS_0;    
    
    // аппаратный сброс дисплея
    LCD_ST7735_RES_0;           // RST=0
    HAL_Delay(LCD_DELAY);       // пауза
    LCD_ST7735_RES_1;           // RST=1
    HAL_Delay(LCD_DELAY);       // пауза
 
    // инициализация дисплея
    lcd_st7735_send_cmd(0x11);  // после сброса дисплей спит - даем команду проснуться
 
    HAL_Delay(LCD_DELAY);       // пауза
 
    lcd_st7735_send_cmd(0x3A);  // режим цвета:
    lcd_st7735_send_data(0x05); //16 бит
 
    lcd_st7735_send_cmd(0x36);  // направление вывода изображения:   
    //lcd_st7735_send_data(0x14); // снизу вверх, справа на лево, порядок цветов RGB
    lcd_st7735_send_data(0xB4); // рабочий
    //lcd_st7735_send_data(0x74); // 
    //lcd_st7735_send_data(0xD4); //
    //lcd_st7735_send_data(0x54); //
    //lcd_st7735_send_data(0x94); //
    //lcd_st7735_send_data(0xA0); //
    lcd_st7735_send_cmd(0x29);  // включаем изображение
  
    LCD_ST7735_CS_1;
}
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 907
Записей в блоге: 16
27.07.2022, 18:31
спрошу банальное: с lcd_delay игрались ? пробовали увеличить например ?

провода не на соплях ?

после команды включения изображения тоже поставьте паузу... до cs=1
0
248 / 0 / 1
Регистрация: 29.11.2015
Сообщений: 229
27.07.2022, 19:07
Цитата Сообщение от ВитГо Посмотреть сообщение
спрошу банальное: с lcd_delay игрались ? пробовали увеличить например ?
провода не на соплях ?
после команды включения изображения тоже поставьте паузу... до cs=1
Именно с lcd_delay и начал. Подключение качественное. В качестве доказательства может служить бесперебойная работа при запустившемся дисплее даже когда его поворачиваешь. Скорость вывода тоже приемлемая. Пауза перед cs=1 ситуацию не меняет. Но что меня совершенно удивляет, так это его работа при зависании, а именно: Вот многократно нажимаешь кнопку резет и всё запускается нормально с выводом информации, но в какой то момент появляется белый экран. Нажимаешь резет опять и на дисплейчике на короткое время появляется правильная информация!!!, при чём очень быстро, а затем уже характерное для рестарта работа дисплея, это рябой экран, затем чёрный (это уже моё) и затем нужная информация. А может и опять зависнуть. Думаю, что данная информация для знающего может что то подсказать.
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 907
Записей в блоге: 16
27.07.2022, 19:20
гм... а другой дисплей не пробовали подключить ?
вообще странное поведение...
скорость spi не завышена от даташита ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.07.2022, 19:20
Помогаю со студенческими работами здесь

Спрошу-ка я тоже про экнанчик. stm32f4 + st7735
Хоть маленький, зато всего 5 проводов. Вот только не работает в моих руках :( Есть ли у кого-то работающий код под st7735? Вот...

Чем связать STM32 + STM32 в одном корпусе?
Есть 2 платы: (1) - STM32 (Вывод на LCD + запись SD) и (2) - STM32F4 (обработка сигналов + коммуникация с датчиками). Чем связать данные...

Общение с барометром MS5540 на STM32 (Arduino to STM32)
Получил от китайца сей аппарат, пошел тут же гуглить что нибудь готовое, но не тут то было. Информации по нем очень мало, даже на Arduino...

stm32 + FSMC + stm32
Доброе времени суток. Возможно ли к Ftosh памяти подцепить два Stm32F4. Один МК будет записывать данные на флеш, второй забирать и...

STM32 - STM32 I2C
*****ПРОБЛЕМА ИСПРАВЛЕНА****ОТВЕТ НИЖЕ , НЕ ВЧИТЫВАЙТЕСЬ В КОД ПРОГРАММЫ,УТОНЕТЕ)), НУ ЕСЛИ ТОЛЬКО ИНТЕРЕС ЕСТЬ. Всем добрый вечер....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru