@@ -197,58 +197,135 @@ 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 */
218
+
219
+ __HAL_RCC_SPI1_FORCE_RESET ();
220
+ __HAL_RCC_SPI1_RELEASE_RESET ();
203
221
__HAL_RCC_SPI1_CLK_ENABLE ();
204
222
spiobj -> spiIRQ = SPI1_IRQn ;
205
223
}
206
224
#endif
207
225
208
226
#if defined SPI2_BASE
209
227
if (spiobj -> spi == SPI_2 ) {
228
+ #if defined(SPI_IP_VERSION_V2 )
229
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI2 ;
230
+ #if defined (RCC_SPI123CLKSOURCE_PLL )
231
+ PeriphClkInit .Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL ;
232
+ #else
233
+ PeriphClkInit .Spi2ClockSelection = RCC_SPI2CLKSOURCE_SYSCLK ;
234
+ #endif
235
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
236
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
237
+ }
238
+ #endif /* SPI_IP_VERSION_V2 */
239
+
240
+ __HAL_RCC_SPI2_FORCE_RESET ();
241
+ __HAL_RCC_SPI2_RELEASE_RESET ();
210
242
__HAL_RCC_SPI2_CLK_ENABLE ();
211
243
spiobj -> spiIRQ = SPI2_IRQn ;
212
244
}
213
245
#endif
214
246
215
247
#if defined SPI3_BASE
216
248
if (spiobj -> spi == SPI_3 ) {
249
+ #if defined(SPI_IP_VERSION_V2 )
250
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI3 ;
251
+ #if defined (RCC_SPI123CLKSOURCE_PLL )
252
+ PeriphClkInit .Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL ;
253
+ #else
254
+ PeriphClkInit .Spi3ClockSelection = RCC_SPI3CLKSOURCE_SYSCLK ;
255
+ #endif
256
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
257
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
258
+ }
259
+ #endif /* SPI_IP_VERSION_V2 */
260
+
261
+ __HAL_RCC_SPI3_FORCE_RESET ();
262
+ __HAL_RCC_SPI3_RELEASE_RESET ();
217
263
__HAL_RCC_SPI3_CLK_ENABLE ();
218
264
spiobj -> spiIRQ = SPI3_IRQn ;
219
265
}
220
266
#endif
221
267
222
268
#if defined SPI4_BASE
223
269
if (spiobj -> spi == SPI_4 ) {
270
+ #if defined(SPI_IP_VERSION_V2 )
271
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI4 ;
272
+ PeriphClkInit .Spi45ClockSelection = RCC_SPI45CLKSOURCE_PCLK1 ;
273
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
274
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
275
+ }
276
+ #endif /* SPI_IP_VERSION_V2 */
277
+
278
+ __HAL_RCC_SPI4_FORCE_RESET ();
279
+ __HAL_RCC_SPI4_RELEASE_RESET ();
224
280
__HAL_RCC_SPI4_CLK_ENABLE ();
225
281
spiobj -> spiIRQ = SPI4_IRQn ;
226
282
}
227
283
#endif
228
284
229
285
#if defined SPI5_BASE
230
286
if (spiobj -> spi == SPI_5 ) {
287
+ #if defined(SPI_IP_VERSION_V2 )
288
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI5 ;
289
+ PeriphClkInit .Spi45ClockSelection = RCC_SPI45CLKSOURCE_PCLK1 ;
290
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
291
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
292
+ }
293
+ #endif /* SPI_IP_VERSION_V2 */
294
+
295
+ __HAL_RCC_SPI5_FORCE_RESET ();
296
+ __HAL_RCC_SPI5_RELEASE_RESET ();
231
297
__HAL_RCC_SPI5_CLK_ENABLE ();
232
298
spiobj -> spiIRQ = SPI5_IRQn ;
233
299
}
234
300
#endif
235
301
236
302
#if defined SPI6_BASE
237
303
if (spiobj -> spi == SPI_6 ) {
304
+ #if defined(SPI_IP_VERSION_V2 )
305
+ PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_SPI6 ;
306
+ PeriphClkInit .Spi6ClockSelection = RCC_SPI6CLKSOURCE_PCLK4 ;
307
+ if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInit ) != HAL_OK ) {
308
+ error ("HAL_RCCEx_PeriphCLKConfig\n" );
309
+ }
310
+ #endif /* SPI_IP_VERSION_V2 */
311
+
312
+ __HAL_RCC_SPI6_FORCE_RESET ();
313
+ __HAL_RCC_SPI6_RELEASE_RESET ();
238
314
__HAL_RCC_SPI6_CLK_ENABLE ();
239
315
spiobj -> spiIRQ = SPI6_IRQn ;
240
316
}
241
317
#endif
242
318
243
319
// Configure the SPI pins
244
320
pin_function (pinmap -> mosi_pin , pinmap -> mosi_function );
245
- pin_mode (pinmap -> mosi_pin , PullNone );
321
+ pin_mode (pinmap -> mosi_pin , PullDown ); // Pull Down is set for output line
246
322
247
323
pin_function (pinmap -> miso_pin , pinmap -> miso_function );
248
324
pin_mode (pinmap -> miso_pin , PullNone );
249
325
250
326
pin_function (pinmap -> sclk_pin , pinmap -> sclk_function );
251
327
pin_mode (pinmap -> sclk_pin , PullNone );
328
+
252
329
spiobj -> pin_miso = pinmap -> miso_pin ;
253
330
spiobj -> pin_mosi = pinmap -> mosi_pin ;
254
331
spiobj -> pin_sclk = pinmap -> sclk_pin ;
@@ -289,10 +366,21 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
289
366
handle -> Init .FirstBit = SPI_FIRSTBIT_MSB ;
290
367
handle -> Init .TIMode = SPI_TIMODE_DISABLE ;
291
368
292
- #if TARGET_STM32H7
369
+ #if defined (SPI_IP_VERSION_V2 )
370
+ handle -> Init .NSSPolarity = SPI_NSS_POLARITY_LOW ;
293
371
handle -> Init .MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE ;
294
372
handle -> Init .FifoThreshold = SPI_FIFO_THRESHOLD_01DATA ;
295
- #endif
373
+ handle -> Init .TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN ;
374
+ handle -> Init .RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN ;
375
+ handle -> Init .MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE ;
376
+ handle -> Init .MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE ;
377
+ handle -> Init .MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE ;
378
+ handle -> Init .IOSwap = SPI_IO_SWAP_DISABLE ;
379
+ #if defined(SPI_RDY_MASTER_MANAGEMENT_INTERNALLY )
380
+ handle -> Init .ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY ;
381
+ handle -> Init .ReadyPolarity = SPI_RDY_POLARITY_HIGH ;
382
+ #endif
383
+ #endif /* SPI_IP_VERSION_V2 */
296
384
297
385
/*
298
386
* According the STM32 Datasheet for SPI peripheral we need to PULLDOWN
@@ -580,16 +668,21 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
580
668
handle -> Init .NSS = (slave ) ? SPI_NSS_HARD_INPUT : SPI_NSS_HARD_OUTPUT ;
581
669
}
582
670
583
- handle -> Init .Mode = (slave ) ? SPI_MODE_SLAVE : SPI_MODE_MASTER ;
671
+ if (slave ) {
672
+ handle -> Init .Mode = SPI_MODE_SLAVE ;
584
673
585
- if (slave && (handle -> Init .Direction == SPI_DIRECTION_1LINE )) {
586
- /* SPI slave implemtation in MBED does not support the 3 wires SPI.
587
- * (e.g. when MISO is not connected). So we're forcing slave in
588
- * 2LINES mode. As MISO is not connected, slave will only read
589
- * from master, and cannot write to it. Inform user.
590
- */
591
- debug ("3 wires SPI slave not supported - slave will only read\r\n" );
592
- handle -> Init .Direction = SPI_DIRECTION_2LINES ;
674
+ if (handle -> Init .Direction == SPI_DIRECTION_1LINE ) {
675
+ /* SPI slave implemtation in MBED does not support the 3 wires SPI.
676
+ * (e.g. when MISO is not connected). So we're forcing slave in
677
+ * 2LINES mode. As MISO is not connected, slave will only read
678
+ * from master, and cannot write to it. Inform user.
679
+ */
680
+ debug ("3 wires SPI slave not supported - slave will only read\r\n" );
681
+ handle -> Init .Direction = SPI_DIRECTION_2LINES ;
682
+ }
683
+
684
+ pin_mode (spiobj -> pin_mosi , PullNone );
685
+ pin_mode (spiobj -> pin_miso , PullDown ); // Pull Down is set for output line
593
686
}
594
687
595
688
/*
@@ -699,7 +792,11 @@ static inline int ssp_readable(spi_t *obj)
699
792
SPI_HandleTypeDef * handle = & (spiobj -> handle );
700
793
701
794
// Check if data is received
795
+ #if defined(SPI_IP_VERSION_V2 )
796
+ status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_RXP ) != RESET ) ? 1 : 0 );
797
+ #else /* SPI_IP_VERSION_V2 */
702
798
status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_RXNE ) != RESET ) ? 1 : 0 );
799
+ #endif /* SPI_IP_VERSION_V2 */
703
800
return status ;
704
801
}
705
802
@@ -710,7 +807,12 @@ static inline int ssp_writeable(spi_t *obj)
710
807
SPI_HandleTypeDef * handle = & (spiobj -> handle );
711
808
712
809
// Check if data is transmitted
810
+ #if defined(SPI_IP_VERSION_V2 )
811
+ status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_TXP ) != RESET ) ? 1 : 0 );
812
+ #else /* SPI_IP_VERSION_V2 */
713
813
status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_TXE ) != RESET ) ? 1 : 0 );
814
+ #endif /* SPI_IP_VERSION_V2 */
815
+
714
816
return status ;
715
817
}
716
818
@@ -719,11 +821,11 @@ static inline int ssp_busy(spi_t *obj)
719
821
int status ;
720
822
struct spi_s * spiobj = SPI_S (obj );
721
823
SPI_HandleTypeDef * handle = & (spiobj -> handle );
722
- #if TARGET_STM32H7
824
+ #if defined( SPI_IP_VERSION_V2 )
723
825
status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_RXWNE ) != RESET ) ? 1 : 0 );
724
- #else /* TARGET_STM32H7 */
826
+ #else /* SPI_IP_VERSION_V2 */
725
827
status = ((__HAL_SPI_GET_FLAG (handle , SPI_FLAG_BSY ) != RESET ) ? 1 : 0 );
726
- #endif /* TARGET_STM32H7 */
828
+ #endif /* SPI_IP_VERSION_V2 */
727
829
return status ;
728
830
}
729
831
@@ -845,11 +947,11 @@ static inline int datasize_to_transfer_bitshift(uint32_t DataSize)
845
947
*/
846
948
static inline int msp_writable (spi_t * obj )
847
949
{
848
- #if TARGET_STM32H7
950
+ #if defined( SPI_IP_VERSION_V2 )
849
951
return (int )LL_SPI_IsActiveFlag_TXP (SPI_INST (obj ));
850
- #else /* TARGET_STM32H7 */
952
+ #else /* SPI_IP_VERSION_V2 */
851
953
return (int )LL_SPI_IsActiveFlag_TXE (SPI_INST (obj ));
852
- #endif /* TARGET_STM32H7 */
954
+ #endif /* SPI_IP_VERSION_V2 */
853
955
}
854
956
855
957
/**
@@ -860,11 +962,11 @@ static inline int msp_writable(spi_t *obj)
860
962
*/
861
963
static inline int msp_readable (spi_t * obj )
862
964
{
863
- #if TARGET_STM32H7
965
+ #if defined( SPI_IP_VERSION_V2 )
864
966
return (int )LL_SPI_IsActiveFlag_RXP (SPI_INST (obj ));
865
- #else /* TARGET_STM32H7 */
967
+ #else /* SPI_IP_VERSION_V2 */
866
968
return (int )LL_SPI_IsActiveFlag_RXNE (SPI_INST (obj ));
867
- #endif /* TARGET_STM32H7 */
969
+ #endif /* SPI_IP_VERSION_V2 */
868
970
}
869
971
870
972
/**
@@ -891,11 +993,11 @@ static inline void msp_wait_readable(spi_t *obj)
891
993
*/
892
994
static inline int msp_busy (spi_t * obj )
893
995
{
894
- #if TARGET_STM32H7
996
+ #if defined( SPI_IP_VERSION_V2 )
895
997
return !(int )LL_SPI_IsActiveFlag_TXC (SPI_INST (obj ));
896
- #else /* TARGET_STM32H7 */
998
+ #else /* SPI_IP_VERSION_V2 */
897
999
return (int )LL_SPI_IsActiveFlag_BSY (SPI_INST (obj ));
898
- #endif /* TARGET_STM32H7 */
1000
+ #endif /* SPI_IP_VERSION_V2 */
899
1001
}
900
1002
901
1003
/**
@@ -962,15 +1064,15 @@ static int spi_master_one_wire_transfer(spi_t *obj, const char *tx_buffer, int t
962
1064
/* Transmit data */
963
1065
if (tx_length ) {
964
1066
LL_SPI_SetTransferDirection (SPI_INST (obj ), LL_SPI_HALF_DUPLEX_TX );
965
- #if TARGET_STM32H7
1067
+ #if defined( SPI_IP_VERSION_V2 )
966
1068
/* Set transaction size */
967
1069
LL_SPI_SetTransferSize (SPI_INST (obj ), tx_length );
968
- #endif /* TARGET_STM32H7 */
1070
+ #endif /* SPI_IP_VERSION_V2 */
969
1071
LL_SPI_Enable (SPI_INST (obj ));
970
- #if TARGET_STM32H7
1072
+ #if defined( SPI_IP_VERSION_V2 )
971
1073
/* Master transfer start */
972
1074
LL_SPI_StartMasterTransfer (SPI_INST (obj ));
973
- #endif /* TARGET_STM32H7 */
1075
+ #endif /* SPI_IP_VERSION_V2 */
974
1076
975
1077
for (int i = 0 ; i < tx_length ; i ++ ) {
976
1078
msp_wait_writable (obj );
@@ -982,19 +1084,19 @@ static int spi_master_one_wire_transfer(spi_t *obj, const char *tx_buffer, int t
982
1084
983
1085
LL_SPI_Disable (SPI_INST (obj ));
984
1086
985
- #if TARGET_STM32H7
1087
+ #if defined( SPI_IP_VERSION_V2 )
986
1088
/* Clear transaction flags */
987
1089
LL_SPI_ClearFlag_EOT (SPI_INST (obj ));
988
1090
LL_SPI_ClearFlag_TXTF (SPI_INST (obj ));
989
1091
/* Reset transaction size */
990
1092
LL_SPI_SetTransferSize (SPI_INST (obj ), 0 );
991
- #endif /* TARGET_STM32H7 */
1093
+ #endif /* SPI_IP_VERSION_V2 */
992
1094
}
993
1095
994
1096
/* Receive data */
995
1097
if (rx_length ) {
996
1098
LL_SPI_SetTransferDirection (SPI_INST (obj ), LL_SPI_HALF_DUPLEX_RX );
997
- #if TARGET_STM32H7
1099
+ #if defined( SPI_IP_VERSION_V2 )
998
1100
/* Set transaction size and run SPI */
999
1101
LL_SPI_SetTransferSize (SPI_INST (obj ), rx_length );
1000
1102
LL_SPI_Enable (SPI_INST (obj ));
@@ -1014,7 +1116,7 @@ static int spi_master_one_wire_transfer(spi_t *obj, const char *tx_buffer, int t
1014
1116
/* Reset transaction size */
1015
1117
LL_SPI_SetTransferSize (SPI_INST (obj ), 0 );
1016
1118
1017
- #else /* TARGET_STM32H7 */
1119
+ #else /* SPI_IP_VERSION_V2 */
1018
1120
/* Unlike STM32H7 other STM32 families generates SPI Clock signal continuously in half-duplex receive mode
1019
1121
* till SPI is enabled. To stop clock generation a SPI should be disabled during last frame receiving,
1020
1122
* after generation at least one SPI clock cycle. It causes necessity of critical section usage.
@@ -1044,7 +1146,7 @@ static int spi_master_one_wire_transfer(spi_t *obj, const char *tx_buffer, int t
1044
1146
rx_buffer [i ] = msp_read_data (obj , bitshift );
1045
1147
}
1046
1148
1047
- #endif /* TARGET_STM32H7 */
1149
+ #endif /* SPI_IP_VERSION_V2 */
1048
1150
}
1049
1151
1050
1152
return rx_length + tx_length ;
@@ -1077,10 +1179,10 @@ int spi_master_write(spi_t *obj, int value)
1077
1179
* but this will increase performances significantly
1078
1180
*/
1079
1181
1080
- #if TARGET_STM32H7
1182
+ #if defined( SPI_IP_VERSION_V2 )
1081
1183
/* Master transfer start */
1082
1184
LL_SPI_StartMasterTransfer (SPI_INST (obj ));
1083
- #endif
1185
+ #endif /* SPI_IP_VERSION_V2 */
1084
1186
1085
1187
/* Transmit data */
1086
1188
msp_wait_writable (obj );
@@ -1241,7 +1343,7 @@ static int spi_master_start_asynch_transfer(spi_t *obj, transfer_type_t transfer
1241
1343
NVIC_EnableIRQ (irq_n );
1242
1344
1243
1345
// flush FIFO
1244
- #if defined(SPI_FLAG_FRLVL ) // STM32F0 STM32F3 STM32F7 STM32L4
1346
+ #if defined(SPI_FLAG_FRLVL )
1245
1347
HAL_SPIEx_FlushRxFifo (handle );
1246
1348
#endif
1247
1349
@@ -1306,11 +1408,10 @@ void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx,
1306
1408
1307
1409
obj -> spi .event = event ;
1308
1410
1309
- DEBUG_PRINTF ("SPI: Transfer: %u, %u\n" , tx_length , rx_length );
1310
-
1311
1411
// register the thunking handler
1312
1412
IRQn_Type irq_n = spiobj -> spiIRQ ;
1313
1413
NVIC_SetVector (irq_n , (uint32_t )handler );
1414
+ DEBUG_PRINTF ("SPI: Transfer: tx %u (%u), rx %u (%u), IRQ %u\n" , use_tx , tx_length , use_rx , rx_length , irq_n );
1314
1415
1315
1416
// enable the right hal transfer
1316
1417
if (use_tx && use_rx ) {
@@ -1355,7 +1456,7 @@ inline uint32_t spi_irq_handler_asynch(spi_t *obj)
1355
1456
// disable the interrupt
1356
1457
NVIC_DisableIRQ (obj -> spi .spiIRQ );
1357
1458
NVIC_ClearPendingIRQ (obj -> spi .spiIRQ );
1358
- #ifndef TARGET_STM32H7
1459
+ #if !defined( SPI_IP_VERSION_V2 )
1359
1460
if (handle -> Init .Direction == SPI_DIRECTION_1LINE && obj -> rx_buff .buffer != NULL ) {
1360
1461
/**
1361
1462
* In case of 3-wire SPI data receiving we usually get dummy reads.
@@ -1365,7 +1466,7 @@ inline uint32_t spi_irq_handler_asynch(spi_t *obj)
1365
1466
*/
1366
1467
spi_flush_rx (obj );
1367
1468
}
1368
- #endif
1469
+ #endif /* SPI_IP_VERSION_V2 */
1369
1470
}
1370
1471
1371
1472
return (event & (obj -> spi .event | SPI_EVENT_INTERNAL_TRANSFER_COMPLETE ));
0 commit comments