@@ -197,44 +197,102 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
197
197
spiobj -> spi = (SPIName )pinmap -> peripheral ;
198
198
MBED_ASSERT (spiobj -> spi != (SPIName )NC );
199
199
200
+ #if defined(SPI_IP_VERSION_V2 )
201
+ RCC_PeriphCLKInitTypeDef PeriphClkInit = {0 };
202
+ #endif /* SPI_IP_VERSION_V2 */
203
+
200
204
#if defined SPI1_BASE
201
205
// Enable SPI clock
202
206
if (spiobj -> spi == SPI_1 ) {
207
+ #if defined(SPI_IP_VERSION_V2 )
208
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI1 ;
209
+ #if defined (RCC_SPI123CLKSOURCE_PLL )
210
+ PeriphClkInit .Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL ;
211
+ #else
212
+ PeriphClkInit .Spi1ClockSelection = RCC_SPI1CLKSOURCE_SYSCLK ;
213
+ #endif
214
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
215
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
216
+ }
217
+ #endif /* SPI_IP_VERSION_V2 */
203
218
__HAL_RCC_SPI1_CLK_ENABLE ();
204
219
spiobj -> spiIRQ = SPI1_IRQn ;
205
220
}
206
221
#endif
207
222
208
223
#if defined SPI2_BASE
209
224
if (spiobj -> spi == SPI_2 ) {
225
+ #if defined(SPI_IP_VERSION_V2 )
226
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI2 ;
227
+ #if defined (RCC_SPI123CLKSOURCE_PLL )
228
+ PeriphClkInit .Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL ;
229
+ #else
230
+ PeriphClkInit .Spi2ClockSelection = RCC_SPI2CLKSOURCE_SYSCLK ;
231
+ #endif
232
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
233
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
234
+ }
235
+ #endif /* SPI_IP_VERSION_V2 */
210
236
__HAL_RCC_SPI2_CLK_ENABLE ();
211
237
spiobj -> spiIRQ = SPI2_IRQn ;
212
238
}
213
239
#endif
214
240
215
241
#if defined SPI3_BASE
216
242
if (spiobj -> spi == SPI_3 ) {
243
+ #if defined(SPI_IP_VERSION_V2 )
244
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI3 ;
245
+ #if defined (RCC_SPI123CLKSOURCE_PLL )
246
+ PeriphClkInit .Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL ;
247
+ #else
248
+ PeriphClkInit .Spi3ClockSelection = RCC_SPI3CLKSOURCE_SYSCLK ;
249
+ #endif
250
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
251
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
252
+ }
253
+ #endif /* SPI_IP_VERSION_V2 */
217
254
__HAL_RCC_SPI3_CLK_ENABLE ();
218
255
spiobj -> spiIRQ = SPI3_IRQn ;
219
256
}
220
257
#endif
221
258
222
259
#if defined SPI4_BASE
223
260
if (spiobj -> spi == SPI_4 ) {
261
+ #if defined(SPI_IP_VERSION_V2 )
262
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI4 ;
263
+ PeriphClkInit .Spi45ClockSelection = RCC_SPI45CLKSOURCE_PCLK1 ;
264
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
265
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
266
+ }
267
+ #endif /* SPI_IP_VERSION_V2 */
224
268
__HAL_RCC_SPI4_CLK_ENABLE ();
225
269
spiobj -> spiIRQ = SPI4_IRQn ;
226
270
}
227
271
#endif
228
272
229
273
#if defined SPI5_BASE
230
274
if (spiobj -> spi == SPI_5 ) {
275
+ #if defined(SPI_IP_VERSION_V2 )
276
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI5 ;
277
+ PeriphClkInit .Spi45ClockSelection = RCC_SPI45CLKSOURCE_PCLK1 ;
278
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
279
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
280
+ }
281
+ #endif /* SPI_IP_VERSION_V2 */
231
282
__HAL_RCC_SPI5_CLK_ENABLE ();
232
283
spiobj -> spiIRQ = SPI5_IRQn ;
233
284
}
234
285
#endif
235
286
236
287
#if defined SPI6_BASE
237
288
if (spiobj -> spi == SPI_6 ) {
289
+ #if defined(SPI_IP_VERSION_V2 )
290
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI6 ;
291
+ PeriphClkInit .Spi6ClockSelection = RCC_SPI6CLKSOURCE_PCLK4 ;
292
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
293
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
294
+ }
295
+ #endif /* SPI_IP_VERSION_V2 */
238
296
__HAL_RCC_SPI6_CLK_ENABLE ();
239
297
spiobj -> spiIRQ = SPI6_IRQn ;
240
298
}
@@ -289,10 +347,21 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
289
347
handle -> Init .FirstBit = SPI_FIRSTBIT_MSB ;
290
348
handle -> Init .TIMode = SPI_TIMODE_DISABLE ;
291
349
292
- #if TARGET_STM32H7
350
+ #if defined (SPI_IP_VERSION_V2 )
351
+ handle -> Init .NSSPolarity = SPI_NSS_POLARITY_LOW ;
293
352
handle -> Init .MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE ;
294
353
handle -> Init .FifoThreshold = SPI_FIFO_THRESHOLD_01DATA ;
295
- #endif
354
+ handle -> Init .TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN ;
355
+ handle -> Init .RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN ;
356
+ handle -> Init .MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE ;
357
+ handle -> Init .MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE ;
358
+ handle -> Init .MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE ;
359
+ handle -> Init .IOSwap = SPI_IO_SWAP_DISABLE ;
360
+ #if defined(SPI_RDY_MASTER_MANAGEMENT_INTERNALLY )
361
+ handle -> Init .ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY ;
362
+ handle -> Init .ReadyPolarity = SPI_RDY_POLARITY_HIGH ;
363
+ #endif
364
+ #endif /* SPI_IP_VERSION_V2 */
296
365
297
366
/*
298
367
* According the STM32 Datasheet for SPI peripheral we need to PULLDOWN
@@ -699,7 +768,11 @@ static inline int ssp_readable(spi_t *obj)
699
768
SPI_HandleTypeDef * handle = & (spiobj -> handle );
700
769
701
770
// Check if data is received
771
+ #if defined(SPI_IP_VERSION_V2 )
772
+ status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_RXP ) != RESET ) ? 1 : 0 );
773
+ #else /* SPI_IP_VERSION_V2 */
702
774
status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_RXNE ) != RESET ) ? 1 : 0 );
775
+ #endif /* SPI_IP_VERSION_V2 */
703
776
return status ;
704
777
}
705
778
@@ -710,7 +783,12 @@ static inline int ssp_writeable(spi_t *obj)
710
783
SPI_HandleTypeDef * handle = & (spiobj -> handle );
711
784
712
785
// Check if data is transmitted
786
+ #if defined(SPI_IP_VERSION_V2 )
787
+ status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_TXP ) != RESET ) ? 1 : 0 );
788
+ #else /* SPI_IP_VERSION_V2 */
713
789
status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_TXE ) != RESET ) ? 1 : 0 );
790
+ #endif /* SPI_IP_VERSION_V2 */
791
+
714
792
return status ;
715
793
}
716
794
@@ -719,11 +797,11 @@ static inline int ssp_busy(spi_t *obj)
719
797
int status ;
720
798
struct spi_s * spiobj = SPI_S (obj );
721
799
SPI_HandleTypeDef * handle = & (spiobj -> handle );
722
- #if TARGET_STM32H7
800
+ #if defined( SPI_IP_VERSION_V2 )
723
801
status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_RXWNE ) != RESET ) ? 1 : 0 );
724
- #else /* TARGET_STM32H7 */
802
+ #else /* SPI_IP_VERSION_V2 */
725
803
status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_BSY ) != RESET ) ? 1 : 0 );
726
- #endif /* TARGET_STM32H7 */
804
+ #endif /* SPI_IP_VERSION_V2 */
727
805
return status ;
728
806
}
729
807
@@ -845,11 +923,11 @@ static inline int datasize_to_transfer_bitshift(uint32_t DataSize)
845
923
*/
846
924
static inline int msp_writable (spi_t * obj )
847
925
{
848
- #if TARGET_STM32H7
926
+ #if defined( SPI_IP_VERSION_V2 )
849
927
return (int )LL_SPI_IsActiveFlag_TXP (SPI_INST (obj ));
850
- #else /* TARGET_STM32H7 */
928
+ #else /* SPI_IP_VERSION_V2 */
851
929
return (int )LL_SPI_IsActiveFlag_TXE (SPI_INST (obj ));
852
- #endif /* TARGET_STM32H7 */
930
+ #endif /* SPI_IP_VERSION_V2 */
853
931
}
854
932
855
933
/**
@@ -860,11 +938,11 @@ static inline int msp_writable(spi_t *obj)
860
938
*/
861
939
static inline int msp_readable (spi_t * obj )
862
940
{
863
- #if TARGET_STM32H7
941
+ #if defined( SPI_IP_VERSION_V2 )
864
942
return (int )LL_SPI_IsActiveFlag_RXP (SPI_INST (obj ));
865
- #else /* TARGET_STM32H7 */
943
+ #else /* SPI_IP_VERSION_V2 */
866
944
return (int )LL_SPI_IsActiveFlag_RXNE (SPI_INST (obj ));
867
- #endif /* TARGET_STM32H7 */
945
+ #endif /* SPI_IP_VERSION_V2 */
868
946
}
869
947
870
948
/**
@@ -891,11 +969,11 @@ static inline void msp_wait_readable(spi_t *obj)
891
969
*/
892
970
static inline int msp_busy (spi_t * obj )
893
971
{
894
- #if TARGET_STM32H7
972
+ #if defined( SPI_IP_VERSION_V2 )
895
973
return !(int )LL_SPI_IsActiveFlag_TXC (SPI_INST (obj ));
896
- #else /* TARGET_STM32H7 */
974
+ #else /* SPI_IP_VERSION_V2 */
897
975
return (int )LL_SPI_IsActiveFlag_BSY (SPI_INST (obj ));
898
- #endif /* TARGET_STM32H7 */
976
+ #endif /* SPI_IP_VERSION_V2 */
899
977
}
900
978
901
979
/**
@@ -962,15 +1040,15 @@ static int spi_master_one_wire_transfer(spi_t *obj, const char *tx_buffer, int t
962
1040
/* Transmit data */
963
1041
if (tx_length ) {
964
1042
LL_SPI_SetTransferDirection (SPI_INST (obj ), LL_SPI_HALF_DUPLEX_TX );
965
- #if TARGET_STM32H7
1043
+ #if defined( SPI_IP_VERSION_V2 )
966
1044
/* Set transaction size */
967
1045
LL_SPI_SetTransferSize (SPI_INST (obj ), tx_length );
968
- #endif /* TARGET_STM32H7 */
1046
+ #endif /* SPI_IP_VERSION_V2 */
969
1047
LL_SPI_Enable (SPI_INST (obj ));
970
- #if TARGET_STM32H7
1048
+ #if defined( SPI_IP_VERSION_V2 )
971
1049
/* Master transfer start */
972
1050
LL_SPI_StartMasterTransfer (SPI_INST (obj ));
973
- #endif /* TARGET_STM32H7 */
1051
+ #endif /* SPI_IP_VERSION_V2 */
974
1052
975
1053
for (int i = 0 ; i < tx_length ; i ++ ) {
976
1054
msp_wait_writable (obj );
@@ -982,19 +1060,19 @@ static int spi_master_one_wire_transfer(spi_t *obj, const char *tx_buffer, int t
982
1060
983
1061
LL_SPI_Disable (SPI_INST (obj ));
984
1062
985
- #if TARGET_STM32H7
1063
+ #if defined( SPI_IP_VERSION_V2 )
986
1064
/* Clear transaction flags */
987
1065
LL_SPI_ClearFlag_EOT (SPI_INST (obj ));
988
1066
LL_SPI_ClearFlag_TXTF (SPI_INST (obj ));
989
1067
/* Reset transaction size */
990
1068
LL_SPI_SetTransferSize (SPI_INST (obj ), 0 );
991
- #endif /* TARGET_STM32H7 */
1069
+ #endif /* SPI_IP_VERSION_V2 */
992
1070
}
993
1071
994
1072
/* Receive data */
995
1073
if (rx_length ) {
996
1074
LL_SPI_SetTransferDirection (SPI_INST (obj ), LL_SPI_HALF_DUPLEX_RX );
997
- #if TARGET_STM32H7
1075
+ #if defined( SPI_IP_VERSION_V2 )
998
1076
/* Set transaction size and run SPI */
999
1077
LL_SPI_SetTransferSize (SPI_INST (obj ), rx_length );
1000
1078
LL_SPI_Enable (SPI_INST (obj ));
@@ -1014,7 +1092,7 @@ static int spi_master_one_wire_transfer(spi_t *obj, const char *tx_buffer, int t
1014
1092
/* Reset transaction size */
1015
1093
LL_SPI_SetTransferSize (SPI_INST (obj ), 0 );
1016
1094
1017
- #else /* TARGET_STM32H7 */
1095
+ #else /* SPI_IP_VERSION_V2 */
1018
1096
/* Unlike STM32H7 other STM32 families generates SPI Clock signal continuously in half-duplex receive mode
1019
1097
* till SPI is enabled. To stop clock generation a SPI should be disabled during last frame receiving,
1020
1098
* after generation at least one SPI clock cycle. It causes necessity of critical section usage.
@@ -1044,7 +1122,7 @@ static int spi_master_one_wire_transfer(spi_t *obj, const char *tx_buffer, int t
1044
1122
rx_buffer [i ] = msp_read_data (obj , bitshift );
1045
1123
}
1046
1124
1047
- #endif /* TARGET_STM32H7 */
1125
+ #endif /* SPI_IP_VERSION_V2 */
1048
1126
}
1049
1127
1050
1128
return rx_length + tx_length ;
@@ -1077,10 +1155,10 @@ int spi_master_write(spi_t *obj, int value)
1077
1155
* but this will increase performances significantly
1078
1156
*/
1079
1157
1080
- #if TARGET_STM32H7
1158
+ #if defined( SPI_IP_VERSION_V2 )
1081
1159
/* Master transfer start */
1082
1160
LL_SPI_StartMasterTransfer (SPI_INST (obj ));
1083
- #endif
1161
+ #endif /* SPI_IP_VERSION_V2 */
1084
1162
1085
1163
/* Transmit data */
1086
1164
msp_wait_writable (obj );
@@ -1241,7 +1319,7 @@ static int spi_master_start_asynch_transfer(spi_t *obj, transfer_type_t transfer
1241
1319
NVIC_EnableIRQ (irq_n );
1242
1320
1243
1321
// flush FIFO
1244
- #if defined(SPI_FLAG_FRLVL ) // STM32F0 STM32F3 STM32F7 STM32L4
1322
+ #if defined(SPI_FLAG_FRLVL )
1245
1323
HAL_SPIEx_FlushRxFifo (handle );
1246
1324
#endif
1247
1325
@@ -1306,11 +1384,10 @@ void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx,
1306
1384
1307
1385
obj -> spi .event = event ;
1308
1386
1309
- DEBUG_PRINTF ("SPI: Transfer: %u, %u\n" , tx_length , rx_length );
1310
-
1311
1387
// register the thunking handler
1312
1388
IRQn_Type irq_n = spiobj -> spiIRQ ;
1313
1389
NVIC_SetVector (irq_n , (uint32_t )handler );
1390
+ DEBUG_PRINTF ("SPI: Transfer: tx %u (%u), rx %u (%u), IRQ %u\n" , use_tx , tx_length , use_rx , rx_length , irq_n );
1314
1391
1315
1392
// enable the right hal transfer
1316
1393
if (use_tx && use_rx ) {
@@ -1355,7 +1432,7 @@ inline uint32_t spi_irq_handler_asynch(spi_t *obj)
1355
1432
// disable the interrupt
1356
1433
NVIC_DisableIRQ (obj -> spi .spiIRQ );
1357
1434
NVIC_ClearPendingIRQ (obj -> spi .spiIRQ );
1358
- #ifndef TARGET_STM32H7
1435
+ #if !defined( SPI_IP_VERSION_V2 )
1359
1436
if (handle -> Init .Direction == SPI_DIRECTION_1LINE && obj -> rx_buff .buffer != NULL ) {
1360
1437
/**
1361
1438
* In case of 3-wire SPI data receiving we usually get dummy reads.
@@ -1365,7 +1442,7 @@ inline uint32_t spi_irq_handler_asynch(spi_t *obj)
1365
1442
*/
1366
1443
spi_flush_rx (obj );
1367
1444
}
1368
- #endif
1445
+ #endif /* SPI_IP_VERSION_V2 */
1369
1446
}
1370
1447
1371
1448
return (event & (obj -> spi .event | SPI_EVENT_INTERNAL_TRANSFER_COMPLETE ));
0 commit comments