31
31
#include " tft_spi.h"
32
32
#include " pinconfig.h"
33
33
34
+ // #define DEBUG_TFT_IO
35
+ #define DEBUG_OUT ENABLED (DEBUG_TFT_IO)
36
+ #include " ../../../core/debug_out.h"
37
+
34
38
SPI_HandleTypeDef TFT_SPI::SPIx;
35
39
DMA_HandleTypeDef TFT_SPI::DMAtx;
36
40
@@ -43,8 +47,9 @@ void TFT_SPI::init() {
43
47
if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral (digitalPinToPinName (TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return ;
44
48
if (spiInstance != (SPI_TypeDef *)pinmap_peripheral (digitalPinToPinName (TFT_MOSI_PIN), PinMap_SPI_MOSI)) return ;
45
49
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 ;
48
53
#endif
49
54
50
55
SPIx.Instance = spiInstance;
@@ -76,10 +81,13 @@ void TFT_SPI::init() {
76
81
77
82
pinmap_pinout (digitalPinToPinName (TFT_SCK_PIN), PinMap_SPI_SCLK);
78
83
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);
81
87
#endif
82
88
89
+ // pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN);
90
+
83
91
#ifdef SPI1_BASE
84
92
if (SPIx.Instance == SPI1) {
85
93
__HAL_RCC_SPI1_CLK_ENABLE ();
@@ -151,29 +159,47 @@ void TFT_SPI::dataTransferBegin(uint16_t dataSize) {
151
159
WRITE (TFT_CS_PIN, LOW);
152
160
}
153
161
154
- #ifdef TFT_DEFAULT_DRIVER
155
- #include " ../../../lcd/tft_io/tft_ids.h"
156
- #endif
162
+ #include " ../../../lcd/tft_io/tft_ids.h"
157
163
158
164
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
+
161
175
if ((id & 0xFFFF ) == 0 || (id & 0xFFFF ) == 0xFFFF ) {
162
176
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);
166
181
#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
+
168
194
return id;
169
195
}
170
196
171
197
uint32_t TFT_SPI::readID (const uint16_t inReg) {
172
198
uint32_t data = 0 ;
173
199
#if PIN_EXISTS(TFT_MISO)
174
- const uint32_t oldPrescaler = SPIx.Init .BaudRatePrescaler ;
175
-
200
+ uint32_t BaudRatePrescaler = SPIx.Init .BaudRatePrescaler ;
176
201
SPIx.Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
202
+
177
203
dataTransferBegin (DATASIZE_8BIT);
178
204
writeReg (inReg);
179
205
@@ -185,10 +211,8 @@ uint32_t TFT_SPI::readID(const uint16_t inReg) {
185
211
__HAL_SPI_ENABLE (&SPIx);
186
212
SET_BIT (SPIx.Instance ->CR1 , SPI_CR1_CSTART);
187
213
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 */ }
192
216
data = (data << 8 ) | SPIx.Instance ->RXDR ;
193
217
__HAL_SPI_DISABLE (&SPIx);
194
218
__HAL_SPI_CLEAR_EOTFLAG (&SPIx);
@@ -197,19 +221,22 @@ uint32_t TFT_SPI::readID(const uint16_t inReg) {
197
221
#else
198
222
__HAL_SPI_ENABLE (&SPIx);
199
223
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 */ }
202
226
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 */ }
205
229
data = (data << 8 ) | SPIx.Instance ->DR ;
206
230
}
207
231
#endif
208
232
209
233
dataTransferEnd ();
210
- SPIx.Init .BaudRatePrescaler = oldPrescaler;
234
+ #if DISABLED(DEBUG_TFT_IO)
235
+ SPIx.Init .BaudRatePrescaler = BaudRatePrescaler;
236
+ #endif
211
237
#endif
212
238
239
+ DEBUG_ECHOLNPGM (" raw data : " , data);
213
240
return data >> 7 ;
214
241
}
215
242
@@ -238,13 +265,13 @@ bool TFT_SPI::isBusy() {
238
265
// Check if SPI data transfer is completed
239
266
if (!__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_EOT)) return true ;
240
267
#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 ;
243
270
#endif
244
271
}
245
272
246
273
abort ();
247
- return false ;
274
+ return true ;
248
275
}
249
276
250
277
void TFT_SPI::abort () {
@@ -263,9 +290,7 @@ void TFT_SPI::abort() {
263
290
}
264
291
265
292
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);
269
294
270
295
#ifdef STM32H7xx
271
296
MODIFY_REG (SPIx.Instance ->CR2 , SPI_CR2_TSIZE, 1 );
@@ -274,30 +299,26 @@ void TFT_SPI::transmit(uint16_t data) {
274
299
275
300
SPIx.Instance ->TXDR = data;
276
301
277
- while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_SR_EOT)) {}
302
+ while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_SR_EOT)) { /* nada */ }
278
303
279
304
__HAL_SPI_CLEAR_EOTFLAG (&SPIx);
280
305
__HAL_SPI_CLEAR_TXTFFLAG (&SPIx);
306
+ __HAL_SPI_DISABLE (&SPIx);
281
307
#else
282
308
__HAL_SPI_ENABLE (&SPIx);
283
309
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
285
312
#endif
286
313
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
292
315
}
293
316
294
317
void TFT_SPI::transmitDMA (uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
295
318
DMAtx.Init .MemInc = memoryIncrease;
296
319
HAL_DMA_Init (&DMAtx);
297
320
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);
301
322
302
323
dataTransferBegin ();
303
324
@@ -316,17 +337,18 @@ void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t coun
316
337
SET_BIT (SPIx.Instance ->CR2 , SPI_CR2_TXDMAEN); // Enable Tx DMA Request
317
338
#endif
318
339
319
- TERN_ (TFT_SHARED_IO, while (isBusy ()));
340
+ TERN_ (TFT_SHARED_IO, while (isBusy ()) { /* nada */ } );
320
341
}
321
342
322
343
void TFT_SPI::transmit (uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
323
344
transmitDMA (memoryIncrease, data, count);
324
345
325
346
HAL_DMA_PollForTransfer (&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
326
347
#ifdef STM32H7xx
327
- while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_SR_EOT)) {}
348
+ while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_SR_EOT)) { /* nada */ }
328
349
#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 */ }
330
352
#endif
331
353
abort ();
332
354
}
@@ -337,8 +359,7 @@ void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count)
337
359
DMAtx.Init .MemInc = memoryIncrease;
338
360
HAL_DMA_Init (&DMAtx);
339
361
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);
342
363
343
364
dataTransferBegin ();
344
365
0 commit comments