From 422fab12a37e8bb93f6307d1587ff052b02445b3 Mon Sep 17 00:00:00 2001 From: Dominik Sliwa Date: Wed, 6 Jul 2016 10:22:55 +0200 Subject: spi: spi communication and testing support --- .cproject | 9 ++++-- .gitignore | 1 + .settings/language.settings.xml | 2 +- CMSIS/MK20D10_features.h | 2 +- board/pin_mux.c | 4 +-- k20_tester_Debug_Segger.launch | 1 + source/main.c | 70 ++++++++++++++++++++++++++++++++++++----- 7 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 .gitignore diff --git a/.cproject b/.cproject index 63068ae..77d7c49 100644 --- a/.cproject +++ b/.cproject @@ -17,7 +17,7 @@ - + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3df573f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/Debug/ diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 1542f4d..b8c5a53 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + diff --git a/CMSIS/MK20D10_features.h b/CMSIS/MK20D10_features.h index 3729f04..d42d831 100644 --- a/CMSIS/MK20D10_features.h +++ b/CMSIS/MK20D10_features.h @@ -127,7 +127,7 @@ /* @brief DRY availability on the SoC. */ #define FSL_FEATURE_SOC_DRY_COUNT (0) /* @brief DSPI availability on the SoC. */ - #define FSL_FEATURE_SOC_DSPI_COUNT (2) + #define FSL_FEATURE_SOC_DSPI_COUNT (3) /* @brief EMVSIM availability on the SoC. */ #define FSL_FEATURE_SOC_EMVSIM_COUNT (0) /* @brief ENC availability on the SoC. */ diff --git a/board/pin_mux.c b/board/pin_mux.c index 6c536cc..910b4eb 100644 --- a/board/pin_mux.c +++ b/board/pin_mux.c @@ -92,7 +92,7 @@ void BOARD_InitPins(void) PORT_SetPinMux(PORTB, 21u, kPORT_MuxAlt2); /* SPI2_SCK */ PORT_SetPinMux(PORTB, 22u, kPORT_MuxAlt2); /* SPI2_SOUT */ PORT_SetPinMux(PORTB, 23u, kPORT_MuxAlt2); /* SPI2_SIN */ - PORT_SetPinMux(PORTB, 20u, kPORT_MuxAsGpio); /* SPI2_SS */ + PORT_SetPinMux(PORTB, 20u, kPORT_MuxAlt2); /* SPI2_SS */ /* Open Drain INT pins config */ od_config.mux = kPORT_MuxAsGpio; @@ -104,7 +104,7 @@ void BOARD_InitPins(void) od_config.lockRegister = kPORT_UnlockRegister; GPIO_PinInit(GPIOA, 16u, &gpio_out_hi_config); PORT_SetPinConfig(PORTA, 16u, &od_config); /* MCU_INT1 */ - GPIO_PinInit(GPIOA, 29u, &gpio_out_config); + GPIO_PinInit(GPIOA, 29u, &gpio_out_hi_config); PORT_SetPinConfig(PORTA, 29u, &od_config); /* MCU_INT2 */ GPIO_PinInit(GPIOB, 8u, &gpio_out_config); PORT_SetPinConfig(PORTB, 8u, &od_config); /* MCU_INT3 */ diff --git a/k20_tester_Debug_Segger.launch b/k20_tester_Debug_Segger.launch index 1b1b5ae..4c60bc3 100644 --- a/k20_tester_Debug_Segger.launch +++ b/k20_tester_Debug_Segger.launch @@ -74,4 +74,5 @@ + diff --git a/source/main.c b/source/main.c index 5d4304a..6649944 100644 --- a/source/main.c +++ b/source/main.c @@ -41,6 +41,7 @@ #include "fsl_mpu.h" #include "fsl_flexcan.h" #include "fsl_dspi.h" +#include "fsl_gpio.h" #include "usb_host_config.h" #include "usb.h" #include "usb_host.h" @@ -415,25 +416,30 @@ static void can_test_task(void *pvParameters) { vSemaphoreDelete(cb_msg[0].sem); vSemaphoreDelete(cb_msg[1].sem); + vTaskResume(spi_task_handle); vTaskDelete(NULL); } - +#define TRANSFER_SIZE 32U dspi_slave_handle_t spi_handle; +uint8_t slaveRxData[TRANSFER_SIZE] = {0U}; +uint8_t slaveTxData[TRANSFER_SIZE] = {0U}; void SPI_callback(SPI_Type *base, dspi_slave_handle_t *handle, status_t status, void *userData) { + callback_message_t * cb = (callback_message_t*) userData; + BaseType_t reschedule = pdFALSE; + if (status == kStatus_Success) { - __NOP(); + xSemaphoreGiveFromISR(cb->sem, &reschedule); } if (status == kStatus_DSPI_Error) { __NOP(); } - - PRINTF("This is DSPI slave call back . \r\n"); + portYIELD_FROM_ISR(reschedule); } void SPI_init() { @@ -449,21 +455,71 @@ void SPI_init() { slaveConfig.samplePoint = kDSPI_SckToSin0Clock; DSPI_SlaveInit(SPI2, &slaveConfig); - DSPI_TransferCreateHandle(SPI2, &spi_handle, SPI_callback, spi_handle.userData); + DSPI_SlaveTransferCreateHandle(SPI2, &spi_handle, SPI_callback, spi_handle.userData); /* Set dspi slave interrupt priority higher. */ NVIC_SetPriority(SPI2_IRQn, 5U); + PRINTF("SPI init done \r\n"); } static void spi_task(void *pvParameters) { callback_message_t cb_msg; + dspi_transfer_t slaveXfer; cb_msg.sem = xSemaphoreCreateBinary(); spi_handle.userData = &cb_msg; SPI_init(); - while(1){ + GPIO_ClearPinsOutput(GPIOA, 1u << 29u); // INT2 active + while(1){ + slaveXfer.txData = slaveTxData; + slaveXfer.rxData = slaveRxData; + slaveXfer.dataSize = 16; + slaveXfer.configFlags = kDSPI_SlaveCtar0; + //Wait for instructions from SoC + DSPI_SlaveTransferNonBlocking(SPI2, &spi_handle, &slaveXfer); + PRINTF("Waiting for SPI transfer\r\n"); + xSemaphoreTake(cb_msg.sem, portMAX_DELAY); + for (int i = 0; i< 16; i++) + PRINTF("Transfer received Rx[%d]= 0x%X\r\n", i, slaveRxData[i]); + switch (slaveRxData[0]){ + case 0x01: //echo test echo remaining 15 characters + slaveTxData[0] = 42; + memcpy(&slaveTxData[1], &slaveRxData[1], 15); + break; + case 0x02: // forward USB state + slaveTxData[0] = 0x02; + slaveTxData[1] = test_status.enumerated; + slaveTxData[2] = test_status.vid & 0xFF; + slaveTxData[3] = (test_status.vid >> 8) & 0xFF; + slaveTxData[4] = test_status.pid & 0xFF; + slaveTxData[5] = (test_status.pid >> 8) & 0xFF; + memset(&slaveTxData[6], 0, 10); + break; + case 0x03: // execute CAN test; + vTaskResume(can_task_handle); + vTaskSuspend(NULL); // wait for can_test to finish + slaveTxData[0] = 0x03; + slaveTxData[1] = test_status.can_test_status; + memset(&slaveTxData[2], 0, 15); + break; + case 0x04: // execute touch screen test; +// vTaskResume(ts_task_handle); +// vTaskSuspend(NULL); // wait for ts_test to finish + slaveTxData[0] = 0x04; + slaveTxData[1] = 0x01;//test_status.ts_test_status; + memset(&slaveTxData[2], 0, 14); + break; + default: + memset(slaveTxData, 0x33, 16); + ; + } + //Prepare out transfer and signal on the INT pin + DSPI_SlaveTransferNonBlocking(SPI2, &spi_handle, &slaveXfer); + GPIO_ClearPinsOutput(GPIOA, 1u << 16u); // INT1 active + xSemaphoreTake(cb_msg.sem, portMAX_DELAY); + GPIO_SetPinsOutput(GPIOA, 1u << 16u); // INT1 idle } } @@ -491,7 +547,7 @@ int main(void) { { usb_echo("create host task error\r\n"); } - if(xTaskCreate(hello_task, "SPI_task", 2000L / sizeof(portSTACK_TYPE), NULL, 4, &spi_task_handle) != pdPASS) + if(xTaskCreate(spi_task, "SPI_task", 2000L / sizeof(portSTACK_TYPE), NULL, 4, &spi_task_handle) != pdPASS) { usb_echo("create hello task error\r\n"); } -- cgit v1.2.3