@@ -54,6 +54,12 @@ static void cy_spi_irq_handler_internal(void *handler_arg, cyhal_spi_event_t eve
54
54
spi -> async_events = 0 ;
55
55
if (0 != (event & CYHAL_SPI_IRQ_DONE )) {
56
56
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
+ }
57
63
}
58
64
if (0 != (event & CYHAL_SPI_IRQ_ERROR )) {
59
65
spi -> async_events |= SPI_EVENT_ERROR ;
@@ -79,6 +85,8 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
79
85
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 )) {
80
86
MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_SPI , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_spi_init" );
81
87
}
88
+
89
+ /* Register callback mechanism */
82
90
cyhal_spi_register_callback (& (spi -> hal_spi ), & cy_spi_irq_handler_internal , obj );
83
91
}
84
92
@@ -116,6 +124,9 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
116
124
if (spi -> hz != 0 ) {
117
125
spi_frequency (obj , hz );
118
126
}
127
+
128
+ /* Register callback mechanism after second init */
129
+ cyhal_spi_register_callback (& (spi -> hal_spi ), & cy_spi_irq_handler_internal , obj );
119
130
}
120
131
121
132
void 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,
229
240
struct spi_s * spi = cy_get_spi (obj );
230
241
spi -> async_handler = (void (* )(void ))handler ;
231
242
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
+
232
248
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 )) {
233
249
MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_SPI , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_spi_transfer_async" );
234
250
}
251
+ spi -> async_in_progress = true;
235
252
}
236
253
237
254
uint32_t spi_irq_handler_asynch (spi_t * obj )
0 commit comments