text: /**
    ******************************************************************************
    * File Name          : SPI.c
    * Description        : This file provides code for the configuration
    *                      of the SPI instances.
    ******************************************************************************
    *
    * Copyright (c) 2017 STMicroelectronics International N.V. 
    * All rights reserved.
    *
    * Redistribution and use in source and binary forms, with or without 
    * modification, are permitted, provided that the following conditions are met:
    *
    * 1. Redistribution of source code must retain the above copyright notice, 
    *    this list of conditions and the following disclaimer.
    * 2. Redistributions in binary form must reproduce the above copyright notice,
    *    this list of conditions and the following disclaimer in the documentation
    *    and/or other materials provided with the distribution.
    * 3. Neither the name of STMicroelectronics nor the names of other 
    *    contributors to this software may be used to endorse or promote products 
    *    derived from this software without specific written permission.
    * 4. This software, including modifications and/or derivative works of this 
    *    software, must execute solely and exclusively on microcontroller or
    *    microprocessor devices manufactured by or for STMicroelectronics.
    * 5. Redistribution and use of this software other than as permitted under 
    *    this license is void and will automatically terminate your rights under 
    *    this license. 
    *
    * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
    * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
    * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
    * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
    * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
    * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
    * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
    * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
    * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
    * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
    * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    *
    ******************************************************************************
    */
  
  /* Includes ------------------------------------------------------------------*/
  #include "spi.h"
  
  #include "gpio.h"
  #include "dma.h"
  
  /* USER CODE BEGIN 0 */
  
  /* USER CODE END 0 */
  
  SPI_HandleTypeDef hspi2;
  SPI_HandleTypeDef hspi3;
  DMA_HandleTypeDef hdma_spi2_tx;
  DMA_HandleTypeDef hdma_spi3_rx;
  DMA_HandleTypeDef hdma_spi3_tx;
  
  /* SPI2 init function */
  void MX_SPI2_Init(void)
  {
  
    hspi2.Instance = SPI2;
    hspi2.Init.Mode = SPI_MODE_MASTER;
    hspi2.Init.Direction = SPI_DIRECTION_1LINE;
    hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi2.Init.NSS = SPI_NSS_SOFT;
    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//SPI_BAUDRATEPRESCALER_64;
    hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi2.Init.CRCPolynomial = 7;
    hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
    hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
    if (HAL_SPI_Init(&hspi2) != HAL_OK)
    {
      Error_Handler();
    }
  
  }
  /* SPI3 init function */
  void MX_SPI3_Init(void)
  {
  
    hspi3.Instance = SPI3;
    hspi3.Init.Mode = SPI_MODE_MASTER;
    hspi3.Init.Direction = SPI_DIRECTION_2LINES;
    hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi3.Init.NSS = SPI_NSS_HARD_OUTPUT;
    hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
    hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi3.Init.CRCPolynomial = 10;
    //hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
    //hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
    if (HAL_SPI_Init(&hspi3) != HAL_OK)
    {
      Error_Handler();
    }
  
  }
  
  void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
  {
  
    GPIO_InitTypeDef GPIO_InitStruct;
    if(spiHandle->Instance==SPI2)
    {
    /* USER CODE BEGIN SPI2_MspInit 0 */
  
    /* USER CODE END SPI2_MspInit 0 */
      /* Peripheral clock enable */
      __HAL_RCC_SPI2_CLK_ENABLE();
    
      /**SPI2 GPIO Configuration    
      PB13     ------> SPI2_SCK
      PB15     ------> SPI2_MOSI 
      */
      GPIO_InitStruct.Pin = LCD_SPI2_SCK_Pin|LCD_SPI2_MOSI_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  
      /* Peripheral DMA init*/
    
      hdma_spi2_tx.Instance = DMA1_Channel5;
      hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
      hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
      hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE;
      hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
      hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
      hdma_spi2_tx.Init.Mode = DMA_NORMAL;
      hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW;
      if (HAL_DMA_Init(&hdma_spi2_tx) != HAL_OK)
      {
        Error_Handler();
      }
  
      __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi2_tx);
  
    /* USER CODE BEGIN SPI2_MspInit 1 */
  
    /* USER CODE END SPI2_MspInit 1 */
    }
    else if(spiHandle->Instance==SPI3)
    {
    /* USER CODE BEGIN SPI3_MspInit 0 */
  
    /* USER CODE END SPI3_MspInit 0 */
      /* Peripheral clock enable */
      __HAL_RCC_SPI3_CLK_ENABLE();
    
      /**SPI3 GPIO Configuration    
      PA15     ------> SPI3_NSS
      PC10     ------> SPI3_SCK
      PC11     ------> SPI3_MISO
      PC12     ------> SPI3_MOSI 
      */
      GPIO_InitStruct.Pin = RADIO_SPI3_NSS_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      //MAking this manual
      //GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      //GPIO_InitStruct.Pull = GPIO_NOPULL;
      //GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      //GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
      HAL_GPIO_Init(RADIO_SPI3_NSS_GPIO_Port, &GPIO_InitStruct);
      //setting high
      HAL_GPIO_WritePin(RADIO_SPI3_NSS_GPIO_Port,RADIO_SPI3_NSS_Pin,GPIO_PIN_SET);
  
      GPIO_InitStruct.Pin = RADIO_SPI3_SCK_Pin|RADIO_SPI3_MISO_Pin|RADIO_SPI3_MOSI_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
      HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  
      /* Peripheral DMA init*/
    
      hdma_spi3_rx.Instance = DMA2_Channel1;
      hdma_spi3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
      hdma_spi3_rx.Init.PeriphInc = DMA_PINC_DISABLE;
      hdma_spi3_rx.Init.MemInc = DMA_MINC_ENABLE;
      hdma_spi3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
      hdma_spi3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
      hdma_spi3_rx.Init.Mode = DMA_NORMAL;
      hdma_spi3_rx.Init.Priority = DMA_PRIORITY_LOW;
      if (HAL_DMA_Init(&hdma_spi3_rx) != HAL_OK)
      {
        Error_Handler();
      }
  
      __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi3_rx);
  
      hdma_spi3_tx.Instance = DMA2_Channel2;
      hdma_spi3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
      hdma_spi3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
      hdma_spi3_tx.Init.MemInc = DMA_MINC_ENABLE;
      hdma_spi3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
      hdma_spi3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
      hdma_spi3_tx.Init.Mode = DMA_NORMAL;
      hdma_spi3_tx.Init.Priority = DMA_PRIORITY_LOW;
      if (HAL_DMA_Init(&hdma_spi3_tx) != HAL_OK)
      {
        Error_Handler();
      }
  
      __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi3_tx);
  
    /* USER CODE BEGIN SPI3_MspInit 1 */
  
    /* USER CODE END SPI3_MspInit 1 */
    }
  }
  
  void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
  {
  
    if(spiHandle->Instance==SPI2)
    {
    /* USER CODE BEGIN SPI2_MspDeInit 0 */
  
    /* USER CODE END SPI2_MspDeInit 0 */
      /* Peripheral clock disable */
      __HAL_RCC_SPI2_CLK_DISABLE();
    
      /**SPI2 GPIO Configuration    
      PB13     ------> SPI2_SCK
      PB15     ------> SPI2_MOSI 
      */
      HAL_GPIO_DeInit(GPIOB, LCD_SPI2_SCK_Pin|LCD_SPI2_MOSI_Pin);
  
      /* Peripheral DMA DeInit*/
      HAL_DMA_DeInit(spiHandle->hdmatx);
    /* USER CODE BEGIN SPI2_MspDeInit 1 */
  
    /* USER CODE END SPI2_MspDeInit 1 */
    }
    else if(spiHandle->Instance==SPI3)
    {
    /* USER CODE BEGIN SPI3_MspDeInit 0 */
  
    /* USER CODE END SPI3_MspDeInit 0 */
      /* Peripheral clock disable */
      __HAL_RCC_SPI3_CLK_DISABLE();
    
      /**SPI3 GPIO Configuration    
      PA15     ------> SPI3_NSS
      PC10     ------> SPI3_SCK
      PC11     ------> SPI3_MISO
      PC12     ------> SPI3_MOSI 
      */
      HAL_GPIO_DeInit(RADIO_SPI3_NSS_GPIO_Port, RADIO_SPI3_NSS_Pin);
  
      HAL_GPIO_DeInit(GPIOC, RADIO_SPI3_SCK_Pin|RADIO_SPI3_MISO_Pin|RADIO_SPI3_MOSI_Pin);
  
      /* Peripheral DMA DeInit*/
      HAL_DMA_DeInit(spiHandle->hdmarx);
      HAL_DMA_DeInit(spiHandle->hdmatx);
    /* USER CODE BEGIN SPI3_MspDeInit 1 */
  
    /* USER CODE END SPI3_MspDeInit 1 */
    }
  } 
  
  /* USER CODE BEGIN 1 */
  
  /* USER CODE END 1 */
  
  /**
    * @}
    */
  
  /**
    * @}
    */
  
  /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  