@@ -54,6 +54,12 @@ static void cy_spi_irq_handler_internal(void *handler_arg, cyhal_spi_event_t eve
5454 spi -> async_events = 0 ;
5555 if (0 != (event & CYHAL_SPI_IRQ_DONE )) {
5656 spi -> async_events |= SPI_EVENT_COMPLETE ;
57+ if (spi -> async_in_progress == true) {
58+ /* Disable event CYHAL_SPI_IRQ_DONE */
59+ cyhal_spi_enable_event (& (spi -> hal_spi ), CYHAL_SPI_IRQ_DONE , CYHAL_ISR_PRIORITY_DEFAULT , false);
60+ /* Clear status */
61+ spi -> async_in_progress = false;
62+ }
5763 }
5864 if (0 != (event & CYHAL_SPI_IRQ_ERROR )) {
5965 spi -> async_events |= SPI_EVENT_ERROR ;
@@ -79,6 +85,8 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
7985 if (CY_RSLT_SUCCESS != cyhal_spi_init (& (spi -> hal_spi ), mosi , miso , sclk , ssel , NULL , spi -> cfg .data_bits , spi -> cfg .mode , spi -> cfg .is_slave )) {
8086 MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_SPI , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_spi_init" );
8187 }
88+
89+ /* Register callback mechanism */
8290 cyhal_spi_register_callback (& (spi -> hal_spi ), & cy_spi_irq_handler_internal , obj );
8391}
8492
@@ -116,6 +124,9 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
116124 if (spi -> hz != 0 ) {
117125 spi_frequency (obj , hz );
118126 }
127+
128+ /* Register callback mechanism after second init */
129+ cyhal_spi_register_callback (& (spi -> hal_spi ), & cy_spi_irq_handler_internal , obj );
119130}
120131
121132void spi_frequency (spi_t * obj , int hz )
@@ -229,9 +240,15 @@ void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx,
229240 struct spi_s * spi = cy_get_spi (obj );
230241 spi -> async_handler = (void (* )(void ))handler ;
231242 spi -> async_event_mask = event ;
243+ spi -> async_in_progress = false;
244+
245+ /* Enable event CYHAL_SPI_IRQ_DONE to know when asynchronous transfer is done */
246+ cyhal_spi_enable_event (& (spi -> hal_spi ), CYHAL_SPI_IRQ_DONE , CYHAL_ISR_PRIORITY_DEFAULT , true);
247+
232248 if (CY_RSLT_SUCCESS != cyhal_spi_transfer_async (& (spi -> hal_spi ), (const uint8_t * )tx , (size_t )tx_length , (uint8_t * )rx , (size_t )rx_length )) {
233249 MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_SPI , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_spi_transfer_async" );
234250 }
251+ spi -> async_in_progress = true;
235252}
236253
237254uint32_t spi_irq_handler_asynch (spi_t * obj )
0 commit comments