/**********************************SPI**************************************
Данный файл содержит объявления базовых функции и дефайны для инициализации 
SPI.
***************************************************************************/
#ifndef __SPI_GENERAL_H_
#define __SPI_GENERAL_H_

//////////////////////////////////////////////////////////////////////
/////////////////////////---USER SETTINGS---/////////////////////////
#define HAL_SPI_MODULE_ENABLED 	// need to uncomment these defines in stm32f4xx_hal_conf.h
																// also need to add hal_spi.c (source code)

//#define USE_SPI1
#define USE_SPI2
//#define USE_SPI3

/////////////////////////---USER SETTINGS---/////////////////////////
#include "periph_general.h"



/////////////////////////////////////////////////////////////////////
////////////////////////////---DEFINES---////////////////////////////


															
////////////////////////////---DEFINES---////////////////////////////


/////////////////////////////////////////////////////////////////////
///////////////////////---STRUCTURES & ENUMS---//////////////////////
typedef struct // struct with settings for custom function
{
	SPI_HandleTypeDef hspi;
	
	GPIO_TypeDef 	*CLK_GPIOx;
	uint32_t			CLK_PIN;
	GPIO_TypeDef 	*MISO_GPIOx;
	uint32_t			MISO_PIN;
	GPIO_TypeDef 	*MOSI_GPIOx;
	uint32_t			MOSI_PIN;	
	
}SPI_SettingsTypeDef;
///////////////////////---STRUCTURES & ENUMS---//////////////////////


/////////////////////////////////////////////////////////////////////
///////////////////////////---FUNCTIONS---///////////////////////////
/**  
	* @brief 	Initialize SPI with SPI_SettingsTypeDef structure.
	* @param 	sspi - указатель на структуру с настройками SPI.
  * @return HAL status.
	* @note 	Данная структура содержит хендл ЮАРТ и настройки перефирии (GPIO)
	*/
HAL_StatusTypeDef SPI_Base_Init(SPI_SettingsTypeDef *sspi);
/**  
	* @brief 	Initialize GPIO for SPI.
	* @param 	GPIOx 			- порт для настройки.
	* @param 	GPIO_PIN_RX - пин для настройки на прием.
	* @param 	GPIO_PIN_TX - пин для настройки на передачу.
	*/
void SPI_GPIO_Init(SPI_SettingsTypeDef *sspi);
/**  
	* @brief 	Initialize DMA for SPI.
	* @param 	hspi 				- указатель на хендл SPI для настройки DMA.
	* @param 	hdma_rx 			- указатель на хендл DMA для линии приема SPI.
	* @param 	DMAChannel 		- указатель на канал DMA/поток DMA в STM32F407.
	* @param 	DMA_CHANNEL_X - канал DMA.
	*/
void SPI_DMA_Init(SPI_HandleTypeDef *hspi, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X);
/**  
	* @brief 	Initialize SPI & DMA clock and interrupt.
	* @param 	hspi - указатель на хендл SPI для инициализации.
	* @note 	Чтобы не генерировать функцию с иницилизацией неиспользуемых SPI,
						дефайнами определяются используемые SPI.
	*/
void SPI_MspInit(SPI_HandleTypeDef *hspi);
/**  
	* @brief 	Deinitialize SPI & DMA clock and interrupt.
	* @param 	hspi - указатель на хендл SPI для деинициализации.
	* @note 	Чтобы не генерировать функцию с деиницилизацией неиспользуемых SPI,
						дефайнами в rs_message.h определяются используемые SPI.
	*/
void SPI_MspDeInit(SPI_HandleTypeDef *hspi);

/**  
	* @brief 	Check that spi init structure have correct values.
	* @param 	sspi - указатель на структуру с настройками SPI.
  * @return HAL status.
	*/
HAL_StatusTypeDef Check_SPI_Init_Struct(SPI_SettingsTypeDef *sspi);
///////////////////////////---FUNCTIONS---///////////////////////////

#endif // __SPI_GENERAL_H_