- MyLibs - максимально платформонезависимые библиотеки (кроме разве что RTT) - RTT - STM32_General - библиотеки для периферии stm32
		
			
				
	
	
		
			170 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** 
 | 
						||
**************************************************************************
 | 
						||
* @file general_spi.h
 | 
						||
* @brief Заголовочный файл для модуля инициализации SPI.
 | 
						||
**************************************************************************
 | 
						||
* @defgroup MY_LIBS_SPI      SPI Tools
 | 
						||
* @ingroup  MYLIBS_PERIPHERAL
 | 
						||
* @brief    Функции и макросы для удобной работы с SPI.
 | 
						||
* @details
 | 
						||
Модуль предоставляет функции для базовой инициализации SPI
 | 
						||
 | 
						||
 | 
						||
@par Пример использования:
 | 
						||
@code
 | 
						||
// Структура настроек SPI
 | 
						||
SPI_SettingsTypeDef spi1Settings;
 | 
						||
 | 
						||
void SPI1_Init(void)
 | 
						||
{
 | 
						||
    // Настройка SPI1 как Master, 8 бит, полный дуплекс
 | 
						||
    spi1Settings.hspi.Instance = SPI1;
 | 
						||
    spi1Settings.hspi.Init.Mode = SPI_MODE_MASTER;
 | 
						||
    spi1Settings.hspi.Init.Direction = SPI_DIRECTION_2LINES;
 | 
						||
    spi1Settings.hspi.Init.DataSize = SPI_DATASIZE_8BIT;
 | 
						||
    spi1Settings.hspi.Init.CLKPolarity = SPI_POLARITY_LOW;
 | 
						||
    spi1Settings.hspi.Init.CLKPhase = SPI_PHASE_1EDGE;
 | 
						||
    spi1Settings.hspi.Init.NSS = SPI_NSS_SOFT;
 | 
						||
    spi1Settings.hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
 | 
						||
    spi1Settings.hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;
 | 
						||
    spi1Settings.hspi.Init.TIMode = SPI_TIMODE_DISABLE;
 | 
						||
    spi1Settings.hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
 | 
						||
 | 
						||
    // Настройка GPIO
 | 
						||
    spi1Settings.CLK_GPIOx = GPIOA;
 | 
						||
    spi1Settings.CLK_PIN = GPIO_PIN_5;
 | 
						||
    spi1Settings.CLK_GPIO_AlternageFunc = GPIO_AF5_SPI1;
 | 
						||
 | 
						||
    spi1Settings.MISO_GPIOx = GPIOA;
 | 
						||
    spi1Settings.MISO_PIN = GPIO_PIN_6;
 | 
						||
    spi1Settings.MISO_GPIO_AlternageFunc = GPIO_AF5_SPI1;
 | 
						||
 | 
						||
    spi1Settings.MOSI_GPIOx = GPIOA;
 | 
						||
    spi1Settings.MOSI_PIN = GPIO_PIN_7;
 | 
						||
    spi1Settings.MOSI_GPIO_AlternageFunc = GPIO_AF5_SPI1;
 | 
						||
 | 
						||
    // Инициализация SPI
 | 
						||
    if(SPI_Base_Init(&spi1Settings) != HAL_OK)
 | 
						||
    {
 | 
						||
        // Обработка ошибки
 | 
						||
        Error_Handler();
 | 
						||
    }
 | 
						||
}
 | 
						||
@endcode
 | 
						||
 | 
						||
 | 
						||
 | 
						||
*  @note Требуется подключение модуля SPI в библиотеке HAL 
 | 
						||
@code 
 | 
						||
#define HAL_SPI_MODULE_ENABLED
 | 
						||
@endcode
 | 
						||
* @{
 | 
						||
*************************************************************************/
 | 
						||
#ifndef __SPI_GENERAL_H_
 | 
						||
#define __SPI_GENERAL_H_
 | 
						||
 | 
						||
 | 
						||
/////////////////////////////////////////////////////////////////////
 | 
						||
/////////////////////////---USER SETTINGS---/////////////////////////
 | 
						||
/** 
 | 
						||
  * @addtogroup SPI_INIT Init defines
 | 
						||
  * @ingroup    MY_LIBS_SPI
 | 
						||
  * @brief      Настройка SPI
 | 
						||
  * @{
 | 
						||
  */
 | 
						||
#define HAL_SPI_MODULE_ENABLED   ///< Включение HAL SPI
 | 
						||
 | 
						||
#define USE_SPI1    ///< Включить SPI1 в @ref SPI_MspInit
 | 
						||
#define USE_SPI2    ///< Включить SPI2 в @ref SPI_MspInit
 | 
						||
#define USE_SPI3    ///< Включить SPI3 в @ref SPI_MspInit
 | 
						||
/** SPI_INIT
 | 
						||
  * @}
 | 
						||
  */
 | 
						||
/////////////////////////---USER SETTINGS---/////////////////////////
 | 
						||
#include "mylibs_defs.h"
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/////////////////////////////////////////////////////////////////////
 | 
						||
////////////////////////////---DEFINES---////////////////////////////
 | 
						||
 | 
						||
 | 
						||
                              
 | 
						||
////////////////////////////---DEFINES---////////////////////////////
 | 
						||
 | 
						||
 | 
						||
/////////////////////////////////////////////////////////////////////
 | 
						||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
 | 
						||
/**
 | 
						||
  * @brief Структура настроек SPI
 | 
						||
  * @details Содержит все необходимые параметры для инициализации SPI,
 | 
						||
  * включая GPIO и DMA.
 | 
						||
  */
 | 
						||
typedef struct
 | 
						||
{
 | 
						||
  SPI_HandleTypeDef hspi;                 ///< HAL handle SPI
 | 
						||
  
 | 
						||
  GPIO_TypeDef  *CLK_GPIOx;               ///< Порт CLK
 | 
						||
  uint32_t      CLK_PIN;                  ///< Пин CLK
 | 
						||
  uint32_t      CLK_GPIO_AlternageFunc;   ///< Альтернативная функция для CLK
 | 
						||
  
 | 
						||
  GPIO_TypeDef  *MISO_GPIOx;              ///< Порт MISO
 | 
						||
  uint32_t      MISO_PIN;                 ///< Пин MISO
 | 
						||
  uint32_t      MISO_GPIO_AlternageFunc;  ///< Альтернативная функция для MISO
 | 
						||
  
 | 
						||
  GPIO_TypeDef  *MOSI_GPIOx;              ///< Порт MOSI
 | 
						||
  uint32_t      MOSI_PIN;                 ///< Пин MOSI
 | 
						||
  uint32_t      MOSI_GPIO_AlternageFunc;  ///< Альтернативная функция для MOSI
 | 
						||
 | 
						||
  DMA_Stream_TypeDef *DMAChannel;         ///< Канал DMA (NULL если не нужен)
 | 
						||
  uint32_t DMA_CHANNEL_X;                 ///< Номер канала DMA (0 если не нужен)
 | 
						||
  
 | 
						||
} SPI_SettingsTypeDef;
 | 
						||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
 | 
						||
 | 
						||
 | 
						||
/////////////////////////////////////////////////////////////////////
 | 
						||
///////////////////////////---FUNCTIONS---///////////////////////////
 | 
						||
 | 
						||
/* Инициализация SPI с использованием структуры настроек */
 | 
						||
HAL_StatusTypeDef SPI_Base_Init(SPI_SettingsTypeDef *sspi);
 | 
						||
 | 
						||
/* Проверка корректности структуры настроек SPI */
 | 
						||
HAL_StatusTypeDef SPI_Check_Init_Struct(SPI_SettingsTypeDef *sspi);
 | 
						||
 | 
						||
/* Инициализация тактирования и прерываний для выбранного SPI */
 | 
						||
void SPI_MspInit(SPI_HandleTypeDef *hspi);
 | 
						||
 | 
						||
/* Деинициализация тактирования и прерываний для выбранного SPI */
 | 
						||
void SPI_MspDeInit(SPI_HandleTypeDef *hspi);
 | 
						||
 | 
						||
  
 | 
						||
/** 
 | 
						||
 * @cond SPI_INTERNAL
 | 
						||
 */
 | 
						||
 | 
						||
/* Настройка GPIO для SPI */
 | 
						||
void SPI_GPIO_Init(SPI_SettingsTypeDef *sspi);
 | 
						||
 | 
						||
/* Настройка DMA для SPI */
 | 
						||
void SPI_DMA_Init(SPI_HandleTypeDef *hspi, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X);
 | 
						||
 | 
						||
#ifndef __USER_LINKDMA
 | 
						||
/**  
 | 
						||
  * @brief  Аналог HAL макроса для привязки DMA к UART.
 | 
						||
  * @note   @ref __HAL_LINKDMA.
 | 
						||
  */
 | 
						||
#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__)   \
 | 
						||
do{                                                                     \
 | 
						||
(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__);                     \
 | 
						||
(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
 | 
						||
#endif
 | 
						||
 | 
						||
/** @endcond */
 | 
						||
///////////////////////////---FUNCTIONS---///////////////////////////
 | 
						||
 | 
						||
#endif // __SPI_GENERAL_H_
 | 
						||
 | 
						||
/** MY_LIBS_SPI
 | 
						||
  * @}
 | 
						||
  */ |