Skip to content

Commit 3b86828

Browse files
jmz52eoyilmaz
authored andcommitted
🐛 Fix SPI TFT for STM32F1/F4 (MarlinFirmware#26052)
1 parent 9b86bb1 commit 3b86828

File tree

5 files changed

+85
-66
lines changed

5 files changed

+85
-66
lines changed

Marlin/src/HAL/STM32/tft/tft_spi.cpp

+66-45
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
#include "tft_spi.h"
3232
#include "pinconfig.h"
3333

34+
//#define DEBUG_TFT_IO
35+
#define DEBUG_OUT ENABLED(DEBUG_TFT_IO)
36+
#include "../../../core/debug_out.h"
37+
3438
SPI_HandleTypeDef TFT_SPI::SPIx;
3539
DMA_HandleTypeDef TFT_SPI::DMAtx;
3640

@@ -43,8 +47,9 @@ void TFT_SPI::init() {
4347
if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return;
4448
if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI)) return;
4549

46-
#if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN
47-
if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return;
50+
#if PIN_EXISTS(TFT_MISO)
51+
// Check these pins in code because they are sometimes defined as analog pin references
52+
if ((TFT_MISO_PIN != TFT_MOSI_PIN) && (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO))) return;
4853
#endif
4954

5055
SPIx.Instance = spiInstance;
@@ -76,10 +81,13 @@ void TFT_SPI::init() {
7681

7782
pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK);
7883
pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI);
79-
#if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN
80-
pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO);
84+
#if PIN_EXISTS(TFT_MISO)
85+
// Check these pins in code because they are sometimes defined as analog pin references
86+
if (TFT_MISO_PIN != TFT_MOSI_PIN) pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO);
8187
#endif
8288

89+
//pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN);
90+
8391
#ifdef SPI1_BASE
8492
if (SPIx.Instance == SPI1) {
8593
__HAL_RCC_SPI1_CLK_ENABLE();
@@ -151,29 +159,47 @@ void TFT_SPI::dataTransferBegin(uint16_t dataSize) {
151159
WRITE(TFT_CS_PIN, LOW);
152160
}
153161

154-
#ifdef TFT_DEFAULT_DRIVER
155-
#include "../../../lcd/tft_io/tft_ids.h"
156-
#endif
162+
#include "../../../lcd/tft_io/tft_ids.h"
157163

158164
uint32_t TFT_SPI::getID() {
159-
uint32_t id;
160-
id = readID(LCD_READ_ID);
165+
DEBUG_ECHOLNPGM("TFT_SPI::getID()");
166+
167+
uint32_t id = readID(LCD_READ_ID);
168+
#if ENABLED(DEBUG_TFT_IO)
169+
char debug_register[3], debug_value[5];
170+
sprintf_P(debug_register, PSTR("%02X"), LCD_READ_ID);
171+
sprintf_P(debug_value, PSTR("%04X"), uint16_t(id));
172+
DEBUG_ECHOLNPGM(" readID(0x", debug_register, ") : 0x", debug_value);
173+
#endif
174+
161175
if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) {
162176
id = readID(LCD_READ_ID4);
163-
#ifdef TFT_DEFAULT_DRIVER
164-
if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF)
165-
id = TFT_DEFAULT_DRIVER;
177+
#if ENABLED(DEBUG_TFT_IO)
178+
sprintf_P(debug_register, PSTR("%02X"), LCD_READ_ID4);
179+
sprintf_P(debug_value, PSTR("%04X"), uint16_t(id));
180+
DEBUG_ECHOLNPGM(" readID(0x", debug_register, ") : 0x", debug_value);
166181
#endif
167-
}
182+
}
183+
184+
#ifdef TFT_DEFAULT_DRIVER
185+
if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) {
186+
id = TFT_DEFAULT_DRIVER;
187+
#if ENABLED(DEBUG_TFT_IO)
188+
sprintf_P(debug_value, PSTR("%04X"), uint16_t(id));
189+
DEBUG_ECHOLNPGM(" Fallback to TFT_DEFAULT_DRIVER : 0x", debug_value);
190+
#endif
191+
}
192+
#endif
193+
168194
return id;
169195
}
170196

171197
uint32_t TFT_SPI::readID(const uint16_t inReg) {
172198
uint32_t data = 0;
173199
#if PIN_EXISTS(TFT_MISO)
174-
const uint32_t oldPrescaler = SPIx.Init.BaudRatePrescaler;
175-
200+
uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler;
176201
SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
202+
177203
dataTransferBegin(DATASIZE_8BIT);
178204
writeReg(inReg);
179205

@@ -185,10 +211,8 @@ uint32_t TFT_SPI::readID(const uint16_t inReg) {
185211
__HAL_SPI_ENABLE(&SPIx);
186212
SET_BIT(SPIx.Instance->CR1, SPI_CR1_CSTART);
187213

188-
#if TFT_MISO_PIN != TFT_MOSI_PIN
189-
SPIx.Instance->TXDR = 0;
190-
#endif
191-
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_EOT)) {}
214+
if (SPIx.Init.Direction == SPI_DIRECTION_2LINES) SPIx.Instance->TXDR = 0;
215+
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_EOT)) { /* nada */ }
192216
data = (data << 8) | SPIx.Instance->RXDR;
193217
__HAL_SPI_DISABLE(&SPIx);
194218
__HAL_SPI_CLEAR_EOTFLAG(&SPIx);
@@ -197,19 +221,22 @@ uint32_t TFT_SPI::readID(const uint16_t inReg) {
197221
#else
198222
__HAL_SPI_ENABLE(&SPIx);
199223
for (uint32_t i = 0; i < 4; i++) {
200-
#if TFT_MISO_PIN != TFT_MOSI_PIN
201-
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) {}
224+
if (SPIx.Init.Direction == SPI_DIRECTION_2LINES) {
225+
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) { /* nada */ }
202226
SPIx.Instance->DR = 0;
203-
#endif
204-
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_RXNE)) {}
227+
}
228+
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_RXNE)) { /* nada */ }
205229
data = (data << 8) | SPIx.Instance->DR;
206230
}
207231
#endif
208232

209233
dataTransferEnd();
210-
SPIx.Init.BaudRatePrescaler = oldPrescaler;
234+
#if DISABLED(DEBUG_TFT_IO)
235+
SPIx.Init.BaudRatePrescaler = BaudRatePrescaler;
236+
#endif
211237
#endif
212238

239+
DEBUG_ECHOLNPGM(" raw data : ", data);
213240
return data >> 7;
214241
}
215242

@@ -238,13 +265,13 @@ bool TFT_SPI::isBusy() {
238265
// Check if SPI data transfer is completed
239266
if (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_EOT)) return true;
240267
#else
241-
// Check if SPI is idle
242-
if (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) return true;
268+
// Check if SPI transmit butter is empty and SPI is idle
269+
if ((!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) || (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY))) return true;
243270
#endif
244271
}
245272

246273
abort();
247-
return false;
274+
return true;
248275
}
249276

250277
void TFT_SPI::abort() {
@@ -263,9 +290,7 @@ void TFT_SPI::abort() {
263290
}
264291

265292
void TFT_SPI::transmit(uint16_t data) {
266-
#if TFT_MISO_PIN == TFT_MOSI_PIN
267-
SPI_1LINE_TX(&SPIx);
268-
#endif
293+
if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_TX(&SPIx);
269294

270295
#ifdef STM32H7xx
271296
MODIFY_REG(SPIx.Instance->CR2, SPI_CR2_TSIZE, 1);
@@ -274,30 +299,26 @@ void TFT_SPI::transmit(uint16_t data) {
274299

275300
SPIx.Instance->TXDR = data;
276301

277-
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) {}
302+
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) { /* nada */ }
278303

279304
__HAL_SPI_CLEAR_EOTFLAG(&SPIx);
280305
__HAL_SPI_CLEAR_TXTFFLAG(&SPIx);
306+
__HAL_SPI_DISABLE(&SPIx);
281307
#else
282308
__HAL_SPI_ENABLE(&SPIx);
283309
SPIx.Instance->DR = data;
284-
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {}
310+
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) { /* nada */ } // Wait for data transfer to actually start
311+
while ( __HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) { /* nada */ } // Wait until SPI is idle
285312
#endif
286313

287-
__HAL_SPI_DISABLE(&SPIx);
288-
289-
#if TFT_MISO_PIN != TFT_MOSI_PIN
290-
__HAL_SPI_CLEAR_OVRFLAG(&SPIx); // Clear overrun flag in 2 Lines communication mode because received data is not read
291-
#endif
314+
if (SPIx.Init.Direction == SPI_DIRECTION_2LINES) __HAL_SPI_CLEAR_OVRFLAG(&SPIx); // Clear overrun flag in 2 Lines communication mode because received data is not read
292315
}
293316

294317
void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
295318
DMAtx.Init.MemInc = memoryIncrease;
296319
HAL_DMA_Init(&DMAtx);
297320

298-
#if TFT_MISO_PIN == TFT_MOSI_PIN
299-
SPI_1LINE_TX(&SPIx);
300-
#endif
321+
if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_TX(&SPIx);
301322

302323
dataTransferBegin();
303324

@@ -316,17 +337,18 @@ void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t coun
316337
SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); // Enable Tx DMA Request
317338
#endif
318339

319-
TERN_(TFT_SHARED_IO, while (isBusy()));
340+
TERN_(TFT_SHARED_IO, while (isBusy()) { /* nada */ });
320341
}
321342

322343
void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
323344
transmitDMA(memoryIncrease, data, count);
324345

325346
HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
326347
#ifdef STM32H7xx
327-
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) {}
348+
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_SR_EOT)) { /* nada */ }
328349
#else
329-
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {}
350+
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) { /* nada */ }
351+
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) { /* nada */ }
330352
#endif
331353
abort();
332354
}
@@ -337,8 +359,7 @@ void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count)
337359
DMAtx.Init.MemInc = memoryIncrease;
338360
HAL_DMA_Init(&DMAtx);
339361

340-
if (TFT_MISO_PIN == TFT_MOSI_PIN)
341-
SPI_1LINE_TX(&SPIx);
362+
if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_TX(&SPIx);
342363

343364
dataTransferBegin();
344365

Marlin/src/lcd/extui/mks_ui/SPI_TFT.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,7 @@ void TFT::lcdInit() {
6363
#if PIN_EXISTS(TFT_BACKLIGHT)
6464
OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH);
6565
#endif
66-
#if HAS_LOGO_IN_FLASH
67-
delay(2000);
68-
#endif
66+
TERN_(HAS_LOGO_IN_FLASH, delay(2000));
6967
}
7068

7169
void TFT::lcdClear(uint16_t color) {

Marlin/src/lcd/tft/tft_string.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void TFT_String::set_font(const uint8_t *font) {
5858
for (glyph = 0; glyph < EXTRA_GLYPHS; glyph++) glyphs_extra[glyph] = nullptr;
5959
#endif
6060

61-
DEBUG_ECHOLNPGM("Format: ", ((unifont_t *)font_header)->format);
61+
DEBUG_ECHOLNPGM("format: ", ((unifont_t *)font_header)->format);
6262
DEBUG_ECHOLNPGM("capitalAHeight: ", ((unifont_t *)font_header)->capitalAHeight);
6363
DEBUG_ECHOLNPGM("fontStartEncoding: ", ((unifont_t *)font_header)->fontStartEncoding);
6464
DEBUG_ECHOLNPGM("fontEndEncoding: ", ((unifont_t *)font_header)->fontEndEncoding);

Marlin/src/lcd/tft_io/tft_io.cpp

+16-16
Original file line numberDiff line numberDiff line change
@@ -111,37 +111,37 @@ void TFT_IO::initTFT() {
111111
switch (lcd_id) {
112112
case LTDC_RGB:
113113
break;
114-
case ST7796: // ST7796S 480x320
115-
DEBUG_ECHO_MSG(" ST7796S");
114+
case ST7796:
115+
DEBUG_ECHO_MSG(" ST7796S"); // 480x320
116116
write_esc_sequence(st7796s_init);
117117
break;
118-
case ST7789: // ST7789V 320x240
119-
DEBUG_ECHO_MSG(" ST7789V");
118+
case ST7789:
119+
DEBUG_ECHO_MSG(" ST7789V"); // 320x240
120120
write_esc_sequence(st7789v_init);
121121
break;
122-
case SSD1963: // SSD1963
122+
case SSD1963:
123123
DEBUG_ECHO_MSG(" SSD1963");
124124
write_esc_sequence(ssd1963_init);
125125
break;
126-
case ST7735: // ST7735 160x128
127-
DEBUG_ECHO_MSG(" ST7735");
126+
case ST7735:
127+
DEBUG_ECHO_MSG(" ST7735"); // 160x128
128128
write_esc_sequence(st7735_init);
129129
break;
130-
case R61505: // R61505U 320x240
131-
DEBUG_ECHO_MSG(" R61505U");
130+
case R61505:
131+
DEBUG_ECHO_MSG(" R61505U"); // 320x240
132132
write_esc_sequence(r61505_init);
133133
break;
134-
case ILI9328: // ILI9328 320x240
135-
DEBUG_ECHO_MSG(" ILI9328");
134+
case ILI9328:
135+
DEBUG_ECHO_MSG(" ILI9328"); // 320x240
136136
write_esc_sequence(ili9328_init);
137137
break;
138-
case ILI9341: // ILI9341 320x240
139-
DEBUG_ECHO_MSG(" ILI9341");
138+
case ILI9341:
139+
DEBUG_ECHO_MSG(" ILI9341"); // 320x240
140140
write_esc_sequence(ili9341_init);
141141
break;
142-
case ILI9488: // ILI9488 480x320
143-
case ILI9488_ID1: // 0x8066 ILI9488 480x320
144-
DEBUG_ECHO_MSG(" ILI9488");
142+
case ILI9488:
143+
case ILI9488_ID1:
144+
DEBUG_ECHO_MSG(" ILI9488"); // 480x320
145145
write_esc_sequence(ili9488_init);
146146
break;
147147
default:

Marlin/src/lcd/tft_io/tft_io.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
#endif
3939

4040
#ifndef TFT_DRIVER
41-
#define TFT_DRIVER AUTO
41+
#define TFT_DRIVER AUTO
4242
#endif
4343

4444
#define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x

0 commit comments

Comments
 (0)