Skip to content

Commit b204acb

Browse files
author
yarb
committed
Cypress: FPGA: Improve SPI async calls
1. Fix for FPGA async test case. 2. Enabled events in proper place 3. Added check in async operation is in progress
1 parent 2bde658 commit b204acb

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

targets/TARGET_Cypress/TARGET_PSOC6/cy_spi_api.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

121132
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,
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

237254
uint32_t spi_irq_handler_asynch(spi_t *obj)

targets/TARGET_Cypress/TARGET_PSOC6/objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ struct spi_s {
111111
cyhal_gpio_t sclk;
112112
cyhal_gpio_t ssel;
113113
int hz;
114+
bool async_in_progress;
114115
};
115116
#endif
116117

0 commit comments

Comments
 (0)