From fa63b6703f6f25fff2f8eaf65ce4b5eb5e82c9dc Mon Sep 17 00:00:00 2001 From: Sissors Date: Sun, 3 May 2015 17:37:16 +0200 Subject: [PATCH 1/2] [HAL][KSDK] Fix issue with KSDK SPI timing Depending on the format by default the Freescale SPI peripheral does not give proper delay between SPI transfers. So code has been added which sets half a period delay between SPI transfers. --- .../targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c index 0826cd43db..ebdec55e76 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c @@ -91,6 +91,7 @@ void spi_frequency(spi_t *obj, int hz) { CLOCK_SYS_GetFreq(kBusClock, &busClock); uint32_t spi_address[] = SPI_BASE_ADDRS; DSPI_HAL_SetBaudRate(spi_address[obj->instance], kDspiCtar0, (uint32_t)hz, busClock); + DSPI_HAL_CalculateDelay(spi_address[obj->instance], kDspiCtar0, kDspiAfterTransfer, busClock, 500000000 / hz); //Half clock period delay after SPI transfer } static inline int spi_writeable(spi_t * obj) { From 9f16e756872497671b34765e0e4ef70ecaafc8b2 Mon Sep 17 00:00:00 2001 From: Sissors Date: Sun, 3 May 2015 21:09:15 +0200 Subject: [PATCH 2/2] [HAL][KSDK] Switched delay type of SPI Even though it does not actually toggle the CS signal, we can also use the delay to CS toggle to get proper waveforms. This also fixes SPI in mode 3. --- .../targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c index ebdec55e76..be59ae21b6 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/spi_api.c @@ -91,7 +91,7 @@ void spi_frequency(spi_t *obj, int hz) { CLOCK_SYS_GetFreq(kBusClock, &busClock); uint32_t spi_address[] = SPI_BASE_ADDRS; DSPI_HAL_SetBaudRate(spi_address[obj->instance], kDspiCtar0, (uint32_t)hz, busClock); - DSPI_HAL_CalculateDelay(spi_address[obj->instance], kDspiCtar0, kDspiAfterTransfer, busClock, 500000000 / hz); //Half clock period delay after SPI transfer + DSPI_HAL_CalculateDelay(spi_address[obj->instance], kDspiCtar0, kDspiLastSckToPcs, busClock, 500000000 / hz); //Half clock period delay after SPI transfer } static inline int spi_writeable(spi_t * obj) {