@@ -52,6 +52,7 @@ void TFT_SPI::init() {
52
52
SPIx.Init .NSS = SPI_NSS_SOFT;
53
53
SPIx.Init .Mode = SPI_MODE_MASTER;
54
54
SPIx.Init .Direction = (TFT_MISO_PIN == TFT_MOSI_PIN) ? SPI_DIRECTION_1LINE : SPI_DIRECTION_2LINES;
55
+ SPIx.Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
55
56
SPIx.Init .CLKPhase = SPI_PHASE_1EDGE;
56
57
SPIx.Init .CLKPolarity = SPI_POLARITY_LOW;
57
58
SPIx.Init .DataSize = SPI_DATASIZE_8BIT;
@@ -60,43 +61,25 @@ void TFT_SPI::init() {
60
61
SPIx.Init .CRCCalculation = SPI_CRCCALCULATION_DISABLE;
61
62
SPIx.Init .CRCPolynomial = 10 ;
62
63
63
- #ifndef STM32H7xx
64
- SPIx.Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; // 18 MBit/s for F103, 21 MBit/s for F407, 25 MBit/s for F411
65
- #else
66
- SPIx.Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 20 MBit/s for H743
67
- SPIx.Init .NSSPMode = SPI_NSS_PULSE_ENABLE;
68
- SPIx.Init .NSSPolarity = SPI_NSS_POLARITY_LOW;
69
- SPIx.Init .FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
70
- SPIx.Init .MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
71
- SPIx.Init .MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
72
- SPIx.Init .MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
73
- SPIx.Init .MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
74
- SPIx.Init .IOSwap = SPI_IO_SWAP_DISABLE;
75
- #endif
76
-
77
64
pinmap_pinout (digitalPinToPinName (TFT_SCK_PIN), PinMap_SPI_SCLK);
78
65
pinmap_pinout (digitalPinToPinName (TFT_MOSI_PIN), PinMap_SPI_MOSI);
79
66
#if PIN_EXISTS(TFT_MISO) && TFT_MISO_PIN != TFT_MOSI_PIN
80
67
pinmap_pinout (digitalPinToPinName (TFT_MISO_PIN), PinMap_SPI_MISO);
81
68
#endif
69
+ pin_PullConfig (get_GPIO_Port (STM_PORT (digitalPinToPinName (TFT_SCK_PIN))), STM_LL_GPIO_PIN (digitalPinToPinName (TFT_SCK_PIN)), GPIO_PULLDOWN);
82
70
83
71
#ifdef SPI1_BASE
84
72
if (SPIx.Instance == SPI1) {
85
73
__HAL_RCC_SPI1_CLK_ENABLE ();
86
74
#ifdef STM32F1xx
87
75
__HAL_RCC_DMA1_CLK_ENABLE ();
88
76
DMAtx.Instance = DMA1_Channel3;
89
- SPIx.Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // SPI1 clock on F1 and F4 is two times faster than SPI2 and SPI3 clock
90
77
#elif defined(STM32F4xx)
91
78
__HAL_RCC_DMA2_CLK_ENABLE ();
92
79
DMAtx.Instance = DMA2_Stream3;
93
80
DMAtx.Init .Channel = DMA_CHANNEL_3;
94
- SPIx.Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // SPI1 clock on F1 and F4 is two times faster than SPI2 and SPI3 clock
95
- #elif defined(STM32H7xx)
96
- __HAL_RCC_DMA1_CLK_ENABLE ();
97
- DMAtx.Instance = DMA1_Stream4;
98
- DMAtx.Init .Request = DMA_REQUEST_SPI1_TX;
99
81
#endif
82
+ SPIx.Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
100
83
}
101
84
#endif
102
85
#ifdef SPI2_BASE
@@ -109,10 +92,6 @@ void TFT_SPI::init() {
109
92
__HAL_RCC_DMA1_CLK_ENABLE ();
110
93
DMAtx.Instance = DMA1_Stream4;
111
94
DMAtx.Init .Channel = DMA_CHANNEL_0;
112
- #elif defined(STM32H7xx)
113
- __HAL_RCC_DMA1_CLK_ENABLE ();
114
- DMAtx.Instance = DMA1_Stream4;
115
- DMAtx.Init .Request = DMA_REQUEST_SPI2_TX;
116
95
#endif
117
96
}
118
97
#endif
@@ -126,27 +105,25 @@ void TFT_SPI::init() {
126
105
__HAL_RCC_DMA1_CLK_ENABLE ();
127
106
DMAtx.Instance = DMA1_Stream5;
128
107
DMAtx.Init .Channel = DMA_CHANNEL_0;
129
- #elif defined(STM32H7xx)
130
- __HAL_RCC_DMA1_CLK_ENABLE ();
131
- DMAtx.Instance = DMA1_Stream4;
132
- DMAtx.Init .Request = DMA_REQUEST_SPI3_TX;
133
108
#endif
134
109
}
135
110
#endif
136
111
112
+ HAL_SPI_Init (&SPIx);
113
+
137
114
DMAtx.Init .Direction = DMA_MEMORY_TO_PERIPH;
138
115
DMAtx.Init .PeriphInc = DMA_PINC_DISABLE;
139
116
DMAtx.Init .PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
140
117
DMAtx.Init .MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
141
118
DMAtx.Init .Mode = DMA_NORMAL;
142
119
DMAtx.Init .Priority = DMA_PRIORITY_LOW;
143
- #if ANY( STM32F4xx, STM32H7xx)
120
+ #ifdef STM32F4xx
144
121
DMAtx.Init .FIFOMode = DMA_FIFOMODE_DISABLE;
145
122
#endif
146
123
}
147
124
148
125
void TFT_SPI::dataTransferBegin (uint16_t dataSize) {
149
- SPIx.Init .DataSize = dataSize;
126
+ SPIx.Init .DataSize = dataSize == DATASIZE_8BIT ? SPI_DATASIZE_8BIT : SPI_DATASIZE_16BIT ;
150
127
HAL_SPI_Init (&SPIx);
151
128
WRITE (TFT_CS_PIN, LOW);
152
129
}
@@ -171,43 +148,28 @@ uint32_t TFT_SPI::getID() {
171
148
uint32_t TFT_SPI::readID (const uint16_t inReg) {
172
149
uint32_t data = 0 ;
173
150
#if PIN_EXISTS(TFT_MISO)
174
- const uint32_t oldPrescaler = SPIx.Init .BaudRatePrescaler ;
151
+ uint32_t BaudRatePrescaler = SPIx.Init .BaudRatePrescaler ;
152
+ uint32_t i;
175
153
176
- SPIx.Init .BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64 ;
154
+ SPIx.Init .BaudRatePrescaler = SPIx. Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4 ;
177
155
dataTransferBegin (DATASIZE_8BIT);
178
156
writeReg (inReg);
179
157
180
158
if (SPIx.Init .Direction == SPI_DIRECTION_1LINE) SPI_1LINE_RX (&SPIx);
159
+ __HAL_SPI_ENABLE (&SPIx);
181
160
182
- #ifdef STM32H7xx
183
- for (uint32_t i = 0 ; i < 4 ; i++) {
184
- MODIFY_REG (SPIx.Instance ->CR2 , SPI_CR2_TSIZE, 1 );
185
- __HAL_SPI_ENABLE (&SPIx);
186
- SET_BIT (SPIx.Instance ->CR1 , SPI_CR1_CSTART);
187
-
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)) {}
192
- data = (data << 8 ) | SPIx.Instance ->RXDR ;
193
- __HAL_SPI_DISABLE (&SPIx);
194
- __HAL_SPI_CLEAR_EOTFLAG (&SPIx);
195
- __HAL_SPI_CLEAR_TXTFFLAG (&SPIx);
196
- }
197
- #else
198
- __HAL_SPI_ENABLE (&SPIx);
199
- 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)) {}
202
- SPIx.Instance ->DR = 0 ;
203
- #endif
204
- while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_RXNE)) {}
205
- data = (data << 8 ) | SPIx.Instance ->DR ;
206
- }
207
- #endif
161
+ for (i = 0 ; i < 4 ; i++) {
162
+ #if TFT_MISO_PIN != TFT_MOSI_PIN
163
+ while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_TXE)) {}
164
+ SPIx.Instance ->DR = 0 ;
165
+ #endif
166
+ while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_RXNE)) {}
167
+ data = (data << 8 ) | SPIx.Instance ->DR ;
168
+ }
208
169
209
170
dataTransferEnd ();
210
- SPIx.Init .BaudRatePrescaler = oldPrescaler;
171
+
172
+ SPIx.Init .BaudRatePrescaler = BaudRatePrescaler;
211
173
#endif
212
174
213
175
return data >> 7 ;
@@ -220,9 +182,6 @@ bool TFT_SPI::isBusy() {
220
182
#elif defined(STM32F4xx)
221
183
#define __IS_DMA_ENABLED (__HANDLE__ ) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN)
222
184
#define __IS_DMA_CONFIGURED (__HANDLE__ ) ((__HANDLE__)->Instance->PAR != 0 )
223
- #elif defined(STM32H7xx)
224
- #define __IS_DMA_ENABLED (__HANDLE__ ) (((DMA_Stream_TypeDef *)((__HANDLE__)->Instance))->CR & DMA_SxCR_EN)
225
- #define __IS_DMA_CONFIGURED (__HANDLE__ ) (((DMA_Stream_TypeDef *)((__HANDLE__)->Instance))->PAR != 0 )
226
185
#endif
227
186
228
187
if (!__IS_DMA_CONFIGURED (&DMAtx)) return false ;
@@ -234,13 +193,8 @@ bool TFT_SPI::isBusy() {
234
193
else {
235
194
// Check if DMA transfer completed flag is set
236
195
if (__HAL_DMA_GET_FLAG (&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX (&DMAtx)) == 0 ) return true ;
237
- #ifdef STM32H7xx
238
- // Check if SPI data transfer is completed
239
- if (!__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_EOT)) return true ;
240
- #else
241
- // Check if SPI is idle
242
- if (__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_BSY)) return true ;
243
- #endif
196
+ // Check if SPI transmit butter is empty and SPI is idle
197
+ if ((!__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_TXE)) || (__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_BSY))) return true ;
244
198
}
245
199
246
200
abort ();
@@ -251,40 +205,22 @@ void TFT_SPI::abort() {
251
205
HAL_DMA_Abort (&DMAtx); // Abort DMA transfer if any
252
206
HAL_DMA_DeInit (&DMAtx);
253
207
254
- #ifdef STM32H7xx
255
- CLEAR_BIT (SPIx.Instance ->CFG1 , SPI_CFG1_TXDMAEN);
256
- __HAL_SPI_CLEAR_EOTFLAG (&SPIx);
257
- __HAL_SPI_CLEAR_TXTFFLAG (&SPIx);
258
- #else
259
- CLEAR_BIT (SPIx.Instance ->CR2 , SPI_CR2_TXDMAEN);
260
- #endif
208
+ CLEAR_BIT (SPIx.Instance ->CR2 , SPI_CR2_TXDMAEN);
261
209
262
- dataTransferEnd (); // Stop SPI and deselect CS
210
+ dataTransferEnd (); // Stop SPI and deselect CS
263
211
}
264
212
265
213
void TFT_SPI::transmit (uint16_t data) {
266
214
#if TFT_MISO_PIN == TFT_MOSI_PIN
267
215
SPI_1LINE_TX (&SPIx);
268
216
#endif
269
217
270
- #ifdef STM32H7xx
271
- MODIFY_REG (SPIx.Instance ->CR2 , SPI_CR2_TSIZE, 1 );
272
- __HAL_SPI_ENABLE (&SPIx);
273
- SET_BIT (SPIx.Instance ->CR1 , SPI_CR1_CSTART);
274
-
275
- SPIx.Instance ->TXDR = data;
218
+ __HAL_SPI_ENABLE (&SPIx);
276
219
277
- while (! __HAL_SPI_GET_FLAG (& SPIx, SPI_SR_EOT)) {}
220
+ SPIx. Instance -> DR = data;
278
221
279
- __HAL_SPI_CLEAR_EOTFLAG (&SPIx);
280
- __HAL_SPI_CLEAR_TXTFFLAG (&SPIx);
281
- #else
282
- __HAL_SPI_ENABLE (&SPIx);
283
- SPIx.Instance ->DR = data;
284
- while (__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_BSY)) {}
285
- #endif
286
-
287
- __HAL_SPI_DISABLE (&SPIx);
222
+ while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_TXE)) {}
223
+ while ( __HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_BSY)) {}
288
224
289
225
#if TFT_MISO_PIN != TFT_MOSI_PIN
290
226
__HAL_SPI_CLEAR_OVRFLAG (&SPIx); // Clear overrun flag in 2 Lines communication mode because received data is not read
@@ -301,38 +237,35 @@ void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t coun
301
237
302
238
dataTransferBegin ();
303
239
304
- # ifdef STM32H7xx
305
- HAL_DMA_Start (&DMAtx, ( uint32_t )data, ( uint32_t )&( SPIx. Instance -> TXDR ), count );
240
+ HAL_DMA_Start (&DMAtx, ( uint32_t )data, ( uint32_t )&(SPIx. Instance -> DR ), count);
241
+ __HAL_SPI_ENABLE (& SPIx);
306
242
307
- CLEAR_BIT (SPIx.Instance ->CFG1 , SPI_CFG1_TXDMAEN);
308
- MODIFY_REG (SPIx.Instance ->CR2 , SPI_CR2_TSIZE, count);
309
- SET_BIT (SPIx.Instance ->CFG1 , SPI_CFG1_TXDMAEN); // Enable Tx DMA Request
310
- __HAL_SPI_ENABLE (&SPIx);
311
- SET_BIT (SPIx.Instance ->CR1 , SPI_CR1_CSTART);
312
- #else
313
- HAL_DMA_Start (&DMAtx, (uint32_t )data, (uint32_t )&(SPIx.Instance ->DR ), count);
314
-
315
- __HAL_SPI_ENABLE (&SPIx);
316
- SET_BIT (SPIx.Instance ->CR2 , SPI_CR2_TXDMAEN); // Enable Tx DMA Request
317
- #endif
243
+ SET_BIT (SPIx.Instance ->CR2 , SPI_CR2_TXDMAEN); // Enable Tx DMA Request
318
244
319
245
TERN_ (TFT_SHARED_IO, while (isBusy ()));
320
246
}
321
247
322
248
void TFT_SPI::transmit (uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
323
- transmitDMA (memoryIncrease, data, count);
249
+ DMAtx.Init .MemInc = memoryIncrease;
250
+ HAL_DMA_Init (&DMAtx);
251
+
252
+ if (TFT_MISO_PIN == TFT_MOSI_PIN)
253
+ SPI_1LINE_TX (&SPIx);
254
+
255
+ dataTransferBegin ();
256
+
257
+ HAL_DMA_Start (&DMAtx, (uint32_t )data, (uint32_t )&(SPIx.Instance ->DR ), count);
258
+ __HAL_SPI_ENABLE (&SPIx);
259
+
260
+ SET_BIT (SPIx.Instance ->CR2 , SPI_CR2_TXDMAEN); // Enable Tx DMA Request
324
261
325
262
HAL_DMA_PollForTransfer (&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
326
- #ifdef STM32H7xx
327
- while (!__HAL_SPI_GET_FLAG (&SPIx, SPI_SR_EOT)) {}
328
- #else
329
- while (__HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_BSY)) {}
330
- #endif
263
+ while ( __HAL_SPI_GET_FLAG (&SPIx, SPI_FLAG_BSY)) {}
331
264
abort ();
332
265
}
333
266
334
267
#if ENABLED(USE_SPI_DMA_TC)
335
- void TFT_SPI::transmitDMA_IT (uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
268
+ void TFT_SPI::TransmitDMA_IT (uint32_t memoryIncrease, uint16_t *data, uint16_t count) {
336
269
337
270
DMAtx.Init .MemInc = memoryIncrease;
338
271
HAL_DMA_Init (&DMAtx);
0 commit comments