/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. */ /* SPI configuration */ SPI_Config(); /* SysTick configuration */ SysTickConfig(); /* LEDs configuration */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); #ifdef SPI_MASTER /* Master board configuration */ /* Initializes the SPI communication */ SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(SPIx, &SPI_InitStructure); /* The Data transfer is performed in the SPI interrupt routine */ /* Configure the Tamper Button */ STM_EVAL_PBInit(BUTTON_TAMPER,BUTTON_MODE_GPIO); /* Wait until Tamper Button is pressed */ while (STM_EVAL_PBGetState(BUTTON_TAMPER)); /* Enable the SPI peripheral */ SPI_Cmd(SPIx, ENABLE); /* Initialize Buffer counters */ ubTxIndex = 0; ubRxIndex = 0; /* Enable the Rx buffer not empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_RXNE, ENABLE); /* Enable the Tx buffer empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE, ENABLE); #endif /* SPI_MASTER */ #ifdef SPI_SLAVE /* Slave board configuration */ /* Initializes the SPI communication */ SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; SPI_Init(SPIx, &SPI_InitStructure); /* The Data transfer is performed in the SPI interrupt routine */ /* Initialize Buffer counters */ ubTxIndex = 0; ubRxIndex = 0; /* Enable the Rx buffer not empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_RXNE, ENABLE); /* Enable the Tx empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE, ENABLE); /* Enable the SPI peripheral */ SPI_Cmd(SPIx, ENABLE); #endif /* SPI_SLAVE */ /* Waiting the end of Data transfer */ while ((ubTxIndex < BUFFERSIZE) && (ubRxIndex < BUFFERSIZE)) { } /* Disable the Rx buffer not empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_RXNE, DISABLE); /* Disable the Tx empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE, DISABLE); /* Disable the SPI peripheral */ SPI_Cmd(SPIx, DISABLE); if (Buffercmp(aTxBuffer, aRxBuffer, BUFFERSIZE) != FAILED) { /* Turn ON LED1 and LED3 */ STM_EVAL_LEDOn(LED1); STM_EVAL_LEDOn(LED3); /* Turn OFF LED2 and LED4 */ STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED4); } else { /* Turn OFF LED1 and LED3 */ STM_EVAL_LEDOff(LED1); STM_EVAL_LEDOff(LED3); /* Turn ON LED2 and LED4 */ STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED4); } /* Infinite Loop */ while (1) { } }
/** * @brief This function handles SPI interrupt request. * @param None * @retval None */ void SPI1_IRQHandler(void) { #if defined (SPI_SLAVE) /* SPI in Slave Tramitter mode--------------------------------------- */ if (SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_TXE) == SET) { SPI_SendData8(SPIx, TxBuffer[Tx_Idx++]); if (Tx_Idx == GetVar_NbrOfData()) { /* Disable the Tx buffer empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE, DISABLE); } } /* SPI in Slave Receiver mode--------------------------------------- */ if (SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_RXNE) == SET) { if (CmdReceived == 0x00) { CmdReceived = SPI_ReceiveData8(SPIx); CmdStatus = 0x01; } else { RxBuffer[Rx_Idx++] = SPI_ReceiveData8(SPIx); } } /* SPI Error interrupt--------------------------------------- */ if (SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_OVR) == SET) { SPI_ReceiveData8(SPIx); SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_OVR); } #endif /* SPI_SLAVE*/ #if defined (SPI_MASTER) /* SPI in Master Tramitter mode--------------------------------------- */ if (SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_TXE) == SET) { if (CmdStatus == 0x00) { SPI_SendData8(SPIx, CmdTransmitted); CmdStatus = 0x01; } else { SPI_SendData8(SPIx, TxBuffer[Tx_Idx++]); if (Tx_Idx == GetVar_NbrOfData()) { /* Disable the Tx buffer empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE, DISABLE); } } } /* SPI in Master Receiver mode--------------------------------------- */ if (SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_RXNE) == SET) { if (CmdReceived == 0x00) { CmdReceived = SPI_ReceiveData8(SPIx); Rx_Idx = 0x00; } else { RxBuffer[Rx_Idx++] = SPI_ReceiveData8(SPIx); } } /* SPI Error interrupt--------------------------------------- */ if (SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_OVR) == SET) { SPI_ReceiveData8(SPIx); SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_OVR); } #endif /* SPI_MASTER*/ }
static void s_hal_spi_rx_isr_disable(hal_spi_t id) { SPI_TypeDef* SPIx = HAL_spi_id2stmSPI(id); //hal_SPI4ENCODER_IT_RX_DISA(SPIx); SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_RXNE, DISABLE); }
/* while the SPI is in IDLE state. */ void SPI2_IRQHandler(void) { /* SPI in Receiver mode */ if (SPI_I2S_GetITStatus(WIFI_SPI, SPI_I2S_IT_RXNE) == SET) { if (ubRxIndex < ubRxMax && ubRxIndex < SPI_BUFFER_SIZE) { /* Receive Transaction data */ wlan_rx_buffer[ubRxIndex++] = SPI_I2S_ReceiveData(WIFI_SPI); if (wifi_state == 1 )//rx header { if(ubRxIndex == 5){ unsigned char lsb_size; int size; size=wlan_rx_buffer[3]; lsb_size=wlan_rx_buffer[4]; size = (size << 8) + lsb_size; for (int i = 0; i < size; i++) { wlan_tx_buffer[i]= 0; } wifi_state=2; //rx body ubTxMax = size; ubTxIndex = 1 ; ubRxMax = size + 5; SpiSendByte(wlan_tx_buffer[0]); //sends first byte so next are sent by interrupt SPI_I2S_ITConfig(WIFI_SPI, SPI_I2S_IT_TXE, ENABLE); } }else if (wifi_state==2)//rx body { if (ubRxIndex == ubRxMax){ //end reception WIFI_CS_HIGH(); EXTI_ClearITPendingBit(EXTI_Line8); fWlanInterruptEnable(); SPI_I2S_ITConfig(WIFI_SPI, SPI_I2S_IT_TXE, DISABLE); (*_pfRxHandler)(wlan_rx_buffer+5); } }else if (ubTxIndex == ubTxMax &&ubRxIndex == ubRxMax && wifi_state == 0){//end of transsmision WIFI_CS_HIGH(); EXTI_ClearITPendingBit(EXTI_Line8); fWlanInterruptEnable(); SPI_I2S_ITConfig(WIFI_SPI, SPI_I2S_IT_TXE, DISABLE); } } else { /* Disable the Rx buffer not empty interrupt */ SPI_I2S_ReceiveData(WIFI_SPI); //SPI_I2S_ITConfig(WIFI_SPI, SPI_I2S_IT_RXNE, DISABLE); } } /* SPI in Tramitter mode */ if (SPI_I2S_GetITStatus(WIFI_SPI, SPI_I2S_IT_TXE) == SET) { if ((ubTxIndex < ubTxMax && ubTxIndex < SPI_BUFFER_SIZE))//||wifi_state==1|| wifi_state==2) { /* Send Transaction data */ SPI_I2S_SendData(WIFI_SPI, wlan_tx_buffer[ubTxIndex++]); } else { /* Disable the Tx buffer empty interrupt */ SPI_I2S_ITConfig(WIFI_SPI, SPI_I2S_IT_TXE, DISABLE); } } //wlan_rx_buffer[0] = SpiSendByte(0); }
/* initialize the SPI internal state-machine. */ void SpiOpen(void (*pfRxHandler)) { _pfRxHandler = pfRxHandler; GPIO_InitTypeDef GPIO_InitStructure; /*!< Enable the SPI clock */ WIFI_SPI_CLK_INIT(WIFI_SPI_CLK, ENABLE); /*!< Enable GPIO clocks */ RCC_AHB1PeriphClockCmd(WIFI_SPI_SCK_GPIO_CLK | WIFI_SPI_MISO_GPIO_CLK | WIFI_SPI_MOSI_GPIO_CLK | WIFI_CS_GPIO_CLK, ENABLE); /*!< SPI pins configuration *************************************************/ // enable peripheral clock RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); /*!< Connect SPI pins to AF5 */ GPIO_PinAFConfig(WIFI_SPI_SCK_GPIO_PORT, WIFI_SPI_SCK_SOURCE, WIFI_SPI_SCK_AF); GPIO_PinAFConfig(WIFI_SPI_MISO_GPIO_PORT, WIFI_SPI_MISO_SOURCE, WIFI_SPI_MISO_AF); GPIO_PinAFConfig(WIFI_SPI_MOSI_GPIO_PORT, WIFI_SPI_MOSI_SOURCE, WIFI_SPI_MOSI_AF); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /*!< SPI SCK pin configuration */ GPIO_InitStructure.GPIO_Pin = WIFI_SPI_SCK_PIN; GPIO_Init(WIFI_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); /*!< SPI MOSI pin configuration */ GPIO_InitStructure.GPIO_Pin = WIFI_SPI_MOSI_PIN; GPIO_Init(WIFI_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); /*!< SPI MISO pin configuration */ GPIO_InitStructure.GPIO_Pin = WIFI_SPI_MISO_PIN; GPIO_Init(WIFI_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); /*!< Configure WIFI Card CS pin in output pushpull mode ********************/ GPIO_InitStructure.GPIO_Pin = WIFI_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(WIFI_CS_GPIO_PORT, &GPIO_InitStructure); SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //configuration for cc3000 wifi SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(WIFI_SPI, &SPI_InitStructure); SPI_CalculateCRC(WIFI_SPI, DISABLE); // //Initialize DMA // DMA_InitTypeDef DMA_InitStructure; // /* Enable DMA clock */ // RCC_AHB1PeriphClockCmd(WIFI_SPI_DMA_CLK, ENABLE); // // /* DMA configuration -------------------------------------------------------*/ // /* Deinitialize DMA Streams */ // DMA_DeInit(WIFI_SPI_TX_DMA_STREAM); // DMA_DeInit(WIFI_SPI_RX_DMA_STREAM); // // /* Configure DMA Initialization Structure */ // DMA_InitStructure.DMA_BufferSize = SPI_BUFFER_SIZE; // DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; // DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; // DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; // DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) (&(WIFI_SPI->DR)); // DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; // DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // DMA_InitStructure.DMA_Priority = DMA_Priority_High; // /* Configure TX DMA */ // DMA_InitStructure.DMA_Channel = WIFI_SPI_TX_DMA_CHANNEL; // DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; // DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)wlan_tx_buffer; // DMA_Init(WIFI_SPI_TX_DMA_STREAM, &DMA_InitStructure); // /* Configure RX DMA */ // DMA_InitStructure.DMA_Channel = WIFI_SPI_RX_DMA_CHANNEL; // DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; // DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)wlan_rx_buffer; // DMA_Init(WIFI_SPI_RX_DMA_STREAM, &DMA_InitStructure); // // /* Enable DMA SPI TX Stream */ // DMA_Cmd(WIFI_SPI_TX_DMA_STREAM,ENABLE); // // /* Enable DMA SPI RX Stream */ // DMA_Cmd(WIFI_SPI_RX_DMA_STREAM,ENABLE); // // /* Enable SPI DMA TX Requsts */ // SPI_I2S_DMACmd(WIFI_SPI, SPI_I2S_DMAReq_Tx, ENABLE); // // /* Enable SPI DMA RX Requsts */ // SPI_I2S_DMACmd(WIFI_SPI, SPI_I2S_DMAReq_Rx, ENABLE); /* Enable the SPI2 */ SPI_Cmd(SPI2, ENABLE); // enable SPI2 /* Configure the Priority Group to 1 bit */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_InitStructure; /* Configure the SPI interrupt priority */ NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // Configure wifi_pwr_en on PD9 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_SetBits(GPIOD, GPIO_Pin_9); /* Enable the Rx buffer not empty interrupt */ SPI_I2S_ITConfig(WIFI_SPI, SPI_I2S_IT_RXNE, ENABLE); /* Enable the Tx buffer empty interrupt */ SPI_I2S_ITConfig(WIFI_SPI, SPI_I2S_IT_TXE, ENABLE); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* System clocks configuration ---------------------------------------------*/ RCC_Configuration(); /* NVIC configuration ------------------------------------------------------*/ NVIC_Configuration(); /* GPIO configuration ------------------------------------------------------*/ GPIO_Configuration(); SPI_I2S_DeInit(SPI3); SPI_I2S_DeInit(SPI2); /* I2S peripheral configuration */ I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips; I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16bextended; I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable; I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_48k; I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; /* I2S3 Master Transmitter to I2S2 Slave Receiver communication -----------*/ /* I2S3 configuration */ I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx; I2S_Init(SPI3, &I2S_InitStructure); /* I2S2 configuration */ I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveRx; I2S_Init(SPI2, &I2S_InitStructure); /* Enable the I2S3 TxE interrupt */ SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, ENABLE); /* Enable the I2S2 RxNE interrupt */ SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE); /* Enable the I2S2 */ I2S_Cmd(SPI2, ENABLE); /* Enable the I2S3 */ I2S_Cmd(SPI3, ENABLE); /* Wait the end of communication */ while (RxIdx < 32) {} TransferStatus1 = Buffercmp(I2S2_Buffer_Rx, (uint16_t*)I2S3_Buffer_Tx, 32); /* TransferStatus1 = PASSED, if the data transmitted from I2S3 and received by I2S2 are the same TransferStatus1 = FAILED, if the data transmitted from I2S3 and received by I2S2 are different */ /* Reinitialize the buffers */ for (RxIdx = 0; RxIdx < 32; RxIdx++) { I2S2_Buffer_Rx[RxIdx] = 0; } TxIdx = 0; RxIdx = 0; SPI_I2S_DeInit(SPI3); SPI_I2S_DeInit(SPI2); /* I2S peripheral configuration */ I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips; I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_24b; I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable; I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_16k; I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; /* I2S3 Master Transmitter to I2S2 Slave Receiver communication -----------*/ /* I2S3 configuration */ I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx; I2S_Init(SPI3, &I2S_InitStructure); /* I2S2 configuration */ I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveRx; I2S_Init(SPI2, &I2S_InitStructure); /* Enable the I2S3 TxE interrupt */ SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, ENABLE); /* Enable the I2S2 RxNE interrupt */ SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE); /* Enable the I2S2 */ I2S_Cmd(SPI2, ENABLE); /* Enable the I2S3 */ I2S_Cmd(SPI3, ENABLE); /* Wait the end of communication */ while (RxIdx < 32) { } TransferStatus2 = Buffercmp24bits(I2S2_Buffer_Rx, (uint16_t*)I2S3_Buffer_Tx, 32); /* TransferStatus2 = PASSED, if the data transmitted from I2S3 and received by I2S2 are the same TransferStatus2 = FAILED, if the data transmitted from I2S3 and received by I2S2 are different */ while (1) { } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ /* SPI configuration ------------------------------------------------------*/ SPI_Config(); /* SysTick configuration ---------------------------------------------------*/ SysTickConfig(); /* Initialize LEDs mounted on STM320518-EVAL board */ STM_EVAL_LEDInit(LED1); STM_EVAL_LEDInit(LED2); STM_EVAL_LEDInit(LED3); STM_EVAL_LEDInit(LED4); /* Master board configuration ------------------------------------------------*/ #ifdef SPI_MASTER /* Initialize push-buttons mounted on STM320518-EVAL board */ STM_EVAL_PBInit(BUTTON_RIGHT, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_LEFT, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_UP, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_DOWN, BUTTON_MODE_GPIO); STM_EVAL_PBInit(BUTTON_SEL, BUTTON_MODE_GPIO); /* Initializes the SPI communication */ SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(SPIx, &SPI_InitStructure); /* Initialize the FIFO threshold */ SPI_RxFIFOThresholdConfig(SPIx, SPI_RxFIFOThreshold_QF); /* Enable the Rx buffer not empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_RXNE, ENABLE); /* Enable the SPI Error interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_ERR, ENABLE); /* Data transfer is performed in the SPI interrupt routine */ /* Enable the SPI peripheral */ SPI_Cmd(SPIx, ENABLE); while (1) { CmdTransmitted = 0x00; CmdReceived = 0x00; CmdStatus = 0x00; Tx_Idx = 0x00; Rx_Idx = 0x00; /* Clear the RxBuffer */ Fill_Buffer(RxBuffer, TXBUFFERSIZE); PressedButton = Read_Joystick(); while (PressedButton == JOY_NONE) { PressedButton = Read_Joystick(); } switch (PressedButton) { /* JOY_RIGHT button pressed */ case JOY_RIGHT: CmdTransmitted = CMD_RIGHT; break; /* JOY_LEFT button pressed */ case JOY_LEFT: CmdTransmitted = CMD_LEFT; break; /* JOY_UP button pressed */ case JOY_UP: CmdTransmitted = CMD_UP; break; /* JOY_DOWN button pressed */ case JOY_DOWN: CmdTransmitted = CMD_DOWN; break; /* JOY_SEL button pressed */ case JOY_SEL: CmdTransmitted = CMD_SEL; break; default: break; } if (CmdTransmitted != 0x00) { /* Enable the Tx buffer empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE, ENABLE); /* Wait until end of data transfer or time out*/ TimeOut = USER_TIMEOUT; while ((Rx_Idx < DATA_SIZE)&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } } /* Waiting until TX FIFO is empty */ while (SPI_GetTransmissionFIFOStatus(SPIx) != SPI_TransmissionFIFOStatus_Empty) {} /* Wait busy flag */ while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY) == SET) {} /* Waiting until RX FIFO is empty */ while (SPI_GetReceptionFIFOStatus(SPIx) != SPI_ReceptionFIFOStatus_Empty) {} switch (CmdTransmitted) { /* Right button pressed */ case CMD_RIGHT: if ((Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) == PASSED) && (CmdReceived == CMD_ACK)) { /* Turn ON LED2 and LED3 */ STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); /* Turn all other LEDs off */ STM_EVAL_LEDOff(LED4); } break; /* Left button pressed*/ case CMD_LEFT: if ((Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) == PASSED) && (CmdReceived == CMD_ACK)) { /* Turn ON LED4 */ STM_EVAL_LEDOn(LED4); /* Turn all other LEDs off */ STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); } break; /* Up button pressed */ case CMD_UP: if ((Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) == PASSED) && (CmdReceived == CMD_ACK)) { /* Turn ON LED2 */ STM_EVAL_LEDOn(LED2); /* Turn all other LEDs off */ STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } break; /* Down button pressed */ case CMD_DOWN: if ((Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) == PASSED) && (CmdReceived == CMD_ACK)) { /* Turn ON LED3 */ STM_EVAL_LEDOn(LED3); /* Turn all other LEDs off */ STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED4); } break; /* Sel button pressed */ case CMD_SEL: if ((Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) == PASSED) && (CmdReceived == CMD_ACK)) { /* Turn ON all LEDs */ STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); } break; default: break; } } #endif /* SPI_MASTER */ /* Slave board configuration ----------------------------------------------*/ #ifdef SPI_SLAVE /* Initializes the SPI communication */ SPI_I2S_DeInit(SPIx); SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; SPI_Init(SPIx, &SPI_InitStructure); /* Initialize the FIFO threshold */ SPI_RxFIFOThresholdConfig(SPIx, SPI_RxFIFOThreshold_QF); /* Enable the Rx buffer not empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_RXNE, ENABLE); /* Enable the SPI Error interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_ERR, ENABLE); /* Enable the SPI peripheral */ SPI_Cmd(SPIx, ENABLE); /* Infinite Loop */ while (1) { CmdStatus = 0x00; CmdReceived = 0x00; Rx_Idx = 0x00; Tx_Idx = 0x00; /* Write the first data in SPI shift register before enabling the interrupt this data will be transmitted when the Slave receive the generated clock by the Master */ /* Enable the Tx buffer empty interrupt */ SPI_SendData8(SPIx, CMD_ACK); SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE, ENABLE); /* Waiting Transaction code Byte */ while (CmdStatus == 0x00) {} TimeOut = USER_TIMEOUT; while ((Rx_Idx < DATA_SIZE)&&(TimeOut != 0x00)) {} if(TimeOut == 0) { TimeOut_UserCallback(); } switch (CmdReceived) { /* CMD_RIGHT command received or time out*/ case CMD_RIGHT: if (Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) != FAILED) { /* Turn ON LED2 and LED3 */ STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); /* Turn OFF LED4 */ STM_EVAL_LEDOff(LED4); } break; /* CMD_LEFT command received or time out */ case CMD_LEFT: if (Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) != FAILED) { /* Turn ON LED4 */ STM_EVAL_LEDOn(LED4); /* Turn OFF LED2 and LED3 */ STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED3); } break; /* CMD_UP command received or time out*/ case CMD_UP: if (Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) != FAILED) { /* Turn ON LED2 */ STM_EVAL_LEDOn(LED2); /* Turn OFF LED3 and LED4 */ STM_EVAL_LEDOff(LED3); STM_EVAL_LEDOff(LED4); } break; /* CMD_DOWN command received or time out */ case CMD_DOWN: if (Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) != FAILED) { /* Turn ON LED3 */ STM_EVAL_LEDOn(LED3); /* Turn OFF LED2 and LED4 */ STM_EVAL_LEDOff(LED2); STM_EVAL_LEDOff(LED4); } break; /* CMD_SEL command received or time out */ case CMD_SEL: if (Buffercmp(TxBuffer, RxBuffer, DATA_SIZE, SPI_DATAMASK) != FAILED) { /* Turn ON LED2, LED3 and LED4 */ STM_EVAL_LEDOn(LED2); STM_EVAL_LEDOn(LED3); STM_EVAL_LEDOn(LED4); } break; default: break; } /* Clear the RxBuffer */ Fill_Buffer(RxBuffer, TXBUFFERSIZE); /* Waiting until TX FIFO is empty */ while (SPI_GetTransmissionFIFOStatus(SPIx) != SPI_TransmissionFIFOStatus_Empty) {} /* Wait busy flag */ while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY) == SET) {} /* Disable the Tx buffer empty interrupt */ SPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE, DISABLE); /* Waiting until RX FIFO is empty */ while (SPI_GetReceptionFIFOStatus(SPIx) != SPI_ReceptionFIFOStatus_Empty) {} } #endif /* SPI_SLAVE */ }