@@ -82,7 +82,6 @@ void init_spi(spi_t *obj)
82
82
if (HAL_SPI_Init (handle ) != HAL_OK ) {
83
83
error ("Cannot initialize SPI" );
84
84
}
85
-
86
85
/* In case of standard 4 wires SPI,PI can be kept enabled all time
87
86
* and SCK will only be generated during the write operations. But in case
88
87
* of 3 wires, it should be only enabled during rd/wr unitary operations,
@@ -190,6 +189,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
190
189
#if TARGET_STM32H7
191
190
handle -> Init .NSSPMode = SPI_NSS_PULSE_DISABLE ;
192
191
handle -> Init .MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE ;
192
+ handle -> Init .FifoThreshold = SPI_FIFO_THRESHOLD_01DATA ;
193
193
#endif
194
194
195
195
init_spi (obj );
@@ -399,16 +399,6 @@ int spi_master_write(spi_t *obj, int value)
399
399
if (handle -> Init .Direction == SPI_DIRECTION_1LINE ) {
400
400
return HAL_SPI_Transmit (handle , (uint8_t * )& value , 1 , TIMEOUT_1_BYTE );
401
401
}
402
- #if TARGET_STM32H7
403
- else {
404
- int retval = 0 ;
405
- if (HAL_SPI_TransmitReceive (handle , (uint8_t * )& value , (uint8_t * )& retval , 1 , TIMEOUT_1_BYTE ) != HAL_OK ) {
406
- error ("spi transmit receive error\n" );
407
- }
408
- return retval ;
409
- }
410
- #else
411
-
412
402
413
403
#if defined(LL_SPI_RX_FIFO_TH_HALF )
414
404
/* Configure the default data size */
@@ -425,32 +415,39 @@ int spi_master_write(spi_t *obj, int value)
425
415
* but this will increase performances significantly
426
416
*/
427
417
428
- /* Wait TXE flag to transmit data */
429
418
#if TARGET_STM32H7
430
- while (!LL_SPI_IsActiveFlag_TXC (SPI_INST (obj )));
431
- #else /* TARGET_STM32H7 */
419
+ /* Master transfer start */
420
+ LL_SPI_StartMasterTransfer (SPI_INST (obj ));
421
+
422
+ /* Wait TXP flag to transmit data */
423
+ while (!LL_SPI_IsActiveFlag_TXP (SPI_INST (obj )));
424
+ #else
425
+ /* Wait TXE flag to transmit data */
432
426
while (!LL_SPI_IsActiveFlag_TXE (SPI_INST (obj )));
427
+
433
428
#endif /* TARGET_STM32H7 */
434
429
430
+ /* Transmit data */
435
431
if (handle -> Init .DataSize == SPI_DATASIZE_16BIT ) {
436
- LL_SPI_TransmitData16 (SPI_INST (obj ), value );
432
+ LL_SPI_TransmitData16 (SPI_INST (obj ), ( uint16_t ) value );
437
433
} else {
438
- LL_SPI_TransmitData8 (SPI_INST (obj ), (uint8_t ) value );
434
+ LL_SPI_TransmitData8 (SPI_INST (obj ), (uint8_t )value );
439
435
}
440
436
441
- /* Then wait RXE flag before reading */
442
437
#if TARGET_STM32H7
443
- while (!LL_SPI_IsActiveFlag_RXWNE (SPI_INST (obj )));
438
+ /* Wait for RXP or end of Transfer */
439
+ while (!LL_SPI_IsActiveFlag_RXP (SPI_INST (obj )));
444
440
#else /* TARGET_STM32H7 */
441
+ /* Wait for RXNE flag before reading */
445
442
while (!LL_SPI_IsActiveFlag_RXNE (SPI_INST (obj )));
446
443
#endif /* TARGET_STM32H7 */
447
444
445
+ /* Read received data */
448
446
if (handle -> Init .DataSize == SPI_DATASIZE_16BIT ) {
449
447
return LL_SPI_ReceiveData16 (SPI_INST (obj ));
450
448
} else {
451
449
return LL_SPI_ReceiveData8 (SPI_INST (obj ));
452
450
}
453
- #endif
454
451
}
455
452
456
453
int spi_master_block_write (spi_t * obj , const char * tx_buffer , int tx_length ,
0 commit comments