Skip to content

Commit aed88a7

Browse files
committed
Fix SPI TFT for STM32F4
1 parent 67a9a7e commit aed88a7

File tree

1 file changed

+12
-18
lines changed

1 file changed

+12
-18
lines changed

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

+12-18
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ void TFT_SPI::init() {
4343
if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return;
4444
if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI)) return;
4545

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;
46+
#if PIN_EXISTS(TFT_MISO)
47+
if ((TFT_MISO_PIN != TFT_MOSI_PIN) && (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO))) return;
4848
#endif
4949

5050
SPIx.Instance = spiInstance;
@@ -76,8 +76,8 @@ void TFT_SPI::init() {
7676

7777
pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK);
7878
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);
79+
#if PIN_EXISTS(TFT_MISO)
80+
if (TFT_MISO_PIN != TFT_MOSI_PIN) pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO);
8181
#endif
8282

8383
#ifdef SPI1_BASE
@@ -185,9 +185,7 @@ uint32_t TFT_SPI::readID(const uint16_t inReg) {
185185
__HAL_SPI_ENABLE(&SPIx);
186186
SET_BIT(SPIx.Instance->CR1, SPI_CR1_CSTART);
187187

188-
#if TFT_MISO_PIN != TFT_MOSI_PIN
189-
SPIx.Instance->TXDR = 0;
190-
#endif
188+
if (SPIx.Init.Direction == SPI_DIRECTION_2LINES) SPIx.Instance->TXDR = 0;
191189
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_EOT)) {}
192190
data = (data << 8) | SPIx.Instance->RXDR;
193191
__HAL_SPI_DISABLE(&SPIx);
@@ -197,10 +195,10 @@ uint32_t TFT_SPI::readID(const uint16_t inReg) {
197195
#else
198196
__HAL_SPI_ENABLE(&SPIx);
199197
for (uint32_t i = 0; i < 4; i++) {
200-
#if TFT_MISO_PIN != TFT_MOSI_PIN
198+
if (SPIx.Init.Direction == SPI_DIRECTION_2LINES) {
201199
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) {}
202200
SPIx.Instance->DR = 0;
203-
#endif
201+
}
204202
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_RXNE)) {}
205203
data = (data << 8) | SPIx.Instance->DR;
206204
}
@@ -263,9 +261,7 @@ void TFT_SPI::abort() {
263261
}
264262

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

270266
#ifdef STM32H7xx
271267
MODIFY_REG(SPIx.Instance->CR2, SPI_CR2_TSIZE, 1);
@@ -278,17 +274,15 @@ void TFT_SPI::transmit(uint16_t data) {
278274

279275
__HAL_SPI_CLEAR_EOTFLAG(&SPIx);
280276
__HAL_SPI_CLEAR_TXTFFLAG(&SPIx);
277+
__HAL_SPI_DISABLE(&SPIx);
281278
#else
282279
__HAL_SPI_ENABLE(&SPIx);
283280
SPIx.Instance->DR = data;
284-
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {}
281+
while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) {} // Wait for data transfer to actually start
282+
while (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {} // Wait until SPI is idle
285283
#endif
286284

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
285+
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
292286
}
293287

294288
void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count) {

0 commit comments

Comments
 (0)