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
pull/11919/head
yarb 2019-11-21 16:44:17 +02:00
parent 2bde6581a6
commit b204acbe3a
2 changed files with 18 additions and 0 deletions

View File

@ -54,6 +54,12 @@ static void cy_spi_irq_handler_internal(void *handler_arg, cyhal_spi_event_t eve
spi->async_events = 0; spi->async_events = 0;
if (0 != (event & CYHAL_SPI_IRQ_DONE)) { if (0 != (event & CYHAL_SPI_IRQ_DONE)) {
spi->async_events |= SPI_EVENT_COMPLETE; spi->async_events |= SPI_EVENT_COMPLETE;
if (spi->async_in_progress == true) {
/* Disable event CYHAL_SPI_IRQ_DONE */
cyhal_spi_enable_event(&(spi->hal_spi), CYHAL_SPI_IRQ_DONE, CYHAL_ISR_PRIORITY_DEFAULT, false);
/* Clear status */
spi->async_in_progress = false;
}
} }
if (0 != (event & CYHAL_SPI_IRQ_ERROR)) { if (0 != (event & CYHAL_SPI_IRQ_ERROR)) {
spi->async_events |= SPI_EVENT_ERROR; spi->async_events |= SPI_EVENT_ERROR;
@ -79,6 +85,8 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
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)) { 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)) {
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_DRIVER_SPI, MBED_ERROR_CODE_FAILED_OPERATION), "cyhal_spi_init"); MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_DRIVER_SPI, MBED_ERROR_CODE_FAILED_OPERATION), "cyhal_spi_init");
} }
/* Register callback mechanism */
cyhal_spi_register_callback(&(spi->hal_spi), &cy_spi_irq_handler_internal, obj); cyhal_spi_register_callback(&(spi->hal_spi), &cy_spi_irq_handler_internal, obj);
} }
@ -116,6 +124,9 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
if (spi->hz != 0) { if (spi->hz != 0) {
spi_frequency(obj, hz); spi_frequency(obj, hz);
} }
/* Register callback mechanism after second init */
cyhal_spi_register_callback(&(spi->hal_spi), &cy_spi_irq_handler_internal, obj);
} }
void spi_frequency(spi_t *obj, int hz) 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,
struct spi_s *spi = cy_get_spi(obj); struct spi_s *spi = cy_get_spi(obj);
spi->async_handler = (void (*)(void))handler; spi->async_handler = (void (*)(void))handler;
spi->async_event_mask = event; spi->async_event_mask = event;
spi->async_in_progress = false;
/* Enable event CYHAL_SPI_IRQ_DONE to know when asynchronous transfer is done */
cyhal_spi_enable_event(&(spi->hal_spi), CYHAL_SPI_IRQ_DONE, CYHAL_ISR_PRIORITY_DEFAULT, true);
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)) { 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)) {
MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_DRIVER_SPI, MBED_ERROR_CODE_FAILED_OPERATION), "cyhal_spi_transfer_async"); MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_DRIVER_SPI, MBED_ERROR_CODE_FAILED_OPERATION), "cyhal_spi_transfer_async");
} }
spi->async_in_progress = true;
} }
uint32_t spi_irq_handler_asynch(spi_t *obj) uint32_t spi_irq_handler_asynch(spi_t *obj)

View File

@ -111,6 +111,7 @@ struct spi_s {
cyhal_gpio_t sclk; cyhal_gpio_t sclk;
cyhal_gpio_t ssel; cyhal_gpio_t ssel;
int hz; int hz;
bool async_in_progress;
}; };
#endif #endif