/*
 * Copyright (c) 2022 OpenLuat & AirM2M
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */


 
#ifndef __AIR105_HSPIM_H
#define __AIR105_HSPIM_H

#ifdef __cplusplus
extern "C"
{
#endif

#include "air105.h"

typedef struct 
{
	uint8_t HSPIM_Enable;
	uint8_t HSPIM_Mode;
	uint8_t HSPIM_FirstBit;
	uint8_t HSPIM_CPOL;
	uint8_t HSPIM_CPHA;
	uint8_t HSPIM_DivideEnable;	
	uint8_t HSPIM_BaudRatePrescaler;
	uint8_t HSPIM_ReceiveDataLength;
	uint8_t HSPIM_RXFIFOFullThreshold;
	uint8_t HSPIM_TXFIFOEmptyThreshold;
}HSPIM_InitTypeDef;

typedef struct 
{
	uint8_t HSPIM_DMAReceiveEnable;
	uint8_t HSPIM_DMATransmitEnable;
	uint8_t HSPIM_DMAReceiveLevel;
	uint8_t HSPIM_DMATransmitLevel;
}HSPIM_DMAInitTypeDef;


/** @defgroup HSPIM_Mode 
  * @{
  */
  
#define HSPIM_MODE_STANDARD											(0x01)
#define HSPIM_MODE_DUAL_RECEIVE										(0x02)
#define HSPIM_MODE_DUAL_TRANSMIT									(0x03)
#define HSPIM_MODE_QUAD_RECEIVE										(0x04)
#define HSPIM_MODE_QUAD_TRANSMIT									(0x05)
#define IS_HSPIM_MODE(MODE)											(((MODE) == HSPIM_MODE_STANDARD)			|| \
																	((MODE) == HSPIM_MODE_DUAL_RECEIVE)			|| \
																	((MODE) == HSPIM_MODE_DUAL_TRANSMIT)		|| \
																	((MODE) == HSPIM_MODE_QUAD_RECEIVE)			|| \
																	((MODE) == HSPIM_MODE_QUAD_TRANSMIT))																
/**
  * @}
  */  

/** @defgroup HSPIM_Clock_Polarity 
  * @{
  */

#define HSPIM_CPOL_LOW												(0x00)
#define HSPIM_CPOL_HIGH												(0x01)
#define IS_HSPIM_CPOL(CPOL)											(((CPOL) == HSPIM_CPOL_LOW)|| \
																	((CPOL) == HSPIM_CPOL_HIGH)) 
/**
  * @}
  */				
  
																
/** @defgroup HSPIM_Clock_Phase 
  * @{
  */
  
#define HSPIM_CPHA_1EDGE											(0x00)
#define HSPIM_CPHA_2EDGE											(0x01)
#define IS_HSPIM_CPHA(CPHA)											(((CPHA) == HSPIM_CPHA_1EDGE) || \
																	(CPHA) == HSPIM_CPHA_2EDGE)
/**
  * @}
  */	

/** @defgroup HSPIM_First_Bit 
  * @{
  */
  
#define HSPIM_FIRST_BIT_MSB											(0x00)
#define HSPIM_FIRST_BIT_LSB											(0x01)
#define IS_HSPIM_FIRST_BIT(BIT)   									(((BIT) == HSPIM_FIRST_BIT_MSB) || \
																	((BIT) == HSPIM_FIRST_BIT_LSB))
/**
  * @}
  */	
															 
/** @defgroup HSPIM_BaudRate_Prescaler 
  * @{
  */
#define HSPIM_BAUDRATE_PRESCALER_2         							(0x01)
#define HSPIM_BAUDRATE_PRESCALER_4        							(0x02)
#define HSPIM_BAUDRATE_PRESCALER_8        							(0x04)
#define HSPIM_BAUDRATE_PRESCALER_16        							(0x08)
#define HSPIM_BAUDRATE_PRESCALER_32        							(0x10)
#define IS_HSPIM_BAUDRATE_PRESCALER(PRESCALER)  					(((PRESCALER) == HSPIM_BAUDRATE_PRESCALER_2) || \
																	((PRESCALER) == HSPIM_BAUDRATE_PRESCALER_4)	|| \
																	((PRESCALER) == HSPIM_BAUDRATE_PRESCALER_8)	|| \
																	((PRESCALER) == HSPIM_BAUDRATE_PRESCALER_16) || \
                                                                    ((PRESCALER) == HSPIM_BAUDRATE_PRESCALER_32))
/**
  * @}
  */ 

/** @defgroup HSPIM_Receive_Data_Length 
  * @{
  */
#define HSPIM_RECEIVE_DATA_LENGTH_1_BYTE         					(0x00)
#define HSPIM_RECEIVE_DATA_LENGTH_2_BYTE         					(0x01)
#define HSPIM_RECEIVE_DATA_LENGTH_3_BYTE         					(0x02)
#define HSPIM_RECEIVE_DATA_LENGTH_4_BYTE         					(0x03)
#define HSPIM_RECEIVE_DATA_LENGTH_5_BYTE         					(0x04)
#define HSPIM_RECEIVE_DATA_LENGTH_6_BYTE         					(0x05)
#define HSPIM_RECEIVE_DATA_LENGTH_7_BYTE         					(0x06)
#define HSPIM_RECEIVE_DATA_LENGTH_8_BYTE         					(0x07)
#define HSPIM_RECEIVE_DATA_LENGTH_9_BYTE         					(0x08)
#define HSPIM_RECEIVE_DATA_LENGTH_10_BYTE         					(0x09
#define HSPIM_RECEIVE_DATA_LENGTH_11_BYTE         					(0x0A)
#define HSPIM_RECEIVE_DATA_LENGTH_12_BYTE         					(0x0B)
#define HSPIM_RECEIVE_DATA_LENGTH_13_BYTE         					(0x0C)
#define HSPIM_RECEIVE_DATA_LENGTH_14_BYTE         					(0x0D)
#define HSPIM_RECEIVE_DATA_LENGTH_15_BYTE         					(0x0E)
#define HSPIM_RECEIVE_DATA_LENGTH_16_BYTE         					(0x0F)
#define HSPIM_RECEIVE_DATA_LENGTH_32_BYTE							(0x1F)

/**
  * @}
  */

/** @defgroup HSPIM_TXFIFOEmptyThreshold
  * @{
  */
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_1       				 		((uint32_t)0x0001)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_2        						((uint32_t)0x0002)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_3        						((uint32_t)0x0003)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_4        						((uint32_t)0x0004)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_5        						((uint32_t)0x0005)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_6        						((uint32_t)0x0006)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_7        						((uint32_t)0x0007)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_8        						((uint32_t)0x0008)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_9        						((uint32_t)0x0009)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_10       						((uint32_t)0x000A)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_11       						((uint32_t)0x000B)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_12       						((uint32_t)0x000C)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_13       						((uint32_t)0x000D)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_14       						((uint32_t)0x000E)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_15       						((uint32_t)0x000F)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_31		  					((uint32_t)0x001F)
#define HSPIM_TX_FIFO_EMPTY_THRESHOLD_63       						((uint32_t)0x003F)

#define IS_HSPIM_TX_FIFO_EMPTY_THRESHOLD(THRESHOLD)					((((int32_t)(THRESHOLD)) >= HSPIM_TX_FIFO_EMPTY_THRESHOLD_1) && \
																	(((uint32_t)(THRESHOLD)) <= HSPIM_TX_FIFO_EMPTY_THRESHOLD_63))
/**
  * @}
  */ 

   
/** @defgroup HSPIM_RXFIFOFullThreshold 
  * @{
  */
#define HSPIM_RX_FIFO_FULL_THRESHOLD_1       						((uint32_t)0x0001)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_2        					 	((uint32_t)0x0002)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_3       						((uint32_t)0x0003)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_4        						((uint32_t)0x0004)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_5        						((uint32_t)0x0005)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_6        						((uint32_t)0x0006)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_7        						((uint32_t)0x0007)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_8        						((uint32_t)0x0008)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_9        						((uint32_t)0x0009)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_10       						((uint32_t)0x000A)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_11       						((uint32_t)0x000B)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_12       						((uint32_t)0x000C)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_13       						((uint32_t)0x000D)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_14       						((uint32_t)0x000E)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_15       						((uint32_t)0x000F)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_16       						((uint32_t)0x0010)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_32       						((uint32_t)0x0020)
#define HSPIM_RX_FIFO_FULL_THRESHOLD_63       						((uint32_t)0x003F)


#define IS_HSPIM_RX_FIFO_FULL_THRESHOLD(THRESHOLD)					((((uint32_t)(THRESHOLD)) >= HSPIM_RX_FIFO_FULL_THRESHOLD_1) && \
																	(((uint32_t)(THRESHOLD)) <= HSPIM_RX_FIFO_FULL_THRESHOLD_63))
														
/**
  * @}
  */ 
   
/** @defgroup SPI_DMAReceiveLevel 
  * @{
  */
#define HSPIM_DMA_RECEIVE_LEVEL_1				    				((uint32_t)0x0001)
#define HSPIM_DMA_RECEIVE_LEVEL_2			        				((uint32_t)0x0002)
#define HSPIM_DMA_RECEIVE_LEVEL_3									((uint32_t)0x0003)
#define HSPIM_DMA_RECEIVE_LEVEL_4									((uint32_t)0x0004)
#define HSPIM_DMA_RECEIVE_LEVEL_5									((uint32_t)0x0005)
#define HSPIM_DMA_RECEIVE_LEVEL_6									((uint32_t)0x0006)
#define HSPIM_DMA_RECEIVE_LEVEL_7									((uint32_t)0x0007)
#define HSPIM_DMA_RECEIVE_LEVEL_8									((uint32_t)0x0008)
#define HSPIM_DMA_RECEIVE_LEVEL_9									((uint32_t)0x0009)
#define HSPIM_DMA_RECEIVE_LEVEL_10									((uint32_t)0x000A)
#define HSPIM_DMA_RECEIVE_LEVEL_11									((uint32_t)0x000B)
#define HSPIM_DMA_RECEIVE_LEVEL_12									((uint32_t)0x000C)
#define HSPIM_DMA_RECEIVE_LEVEL_13									((uint32_t)0x000D)
#define HSPIM_DMA_RECEIVE_LEVEL_14									((uint32_t)0x000E)
#define HSPIM_DMA_RECEIVE_LEVEL_15									((uint32_t)0x000F)
#define HSPIM_DMA_RECEIVE_LEVEL_16									((uint32_t)0x0010)
#define HSPIM_DMA_RECEIVE_LEVEL_32									((uint32_t)0x0020)
#define HSPIM_DMA_RECEIVE_LEVEL_64									((uint32_t)0x0040)

#define IS_HSPIM_DMA_RECEIVE_LEVEL(LEVEL)							((((uint32_t)(LEVEL)) >= HSPIM_DMA_RECEIVE_LEVEL_1) && \
																	(((uint32_t)(LEVEL)) <= HSPIM_DMA_RECEIVE_LEVEL_64))
/**
  * @}
  */ 

/** @defgroup SPI_DMATransmitLevel 
  * @{
  */
#define HSPIM_DMA_TRANSMIT_LEVEL_1									((uint32_t)0x0001)
#define HSPIM_DMA_TRANSMIT_LEVEL_2									((uint32_t)0x0002)
#define HSPIM_DMA_TRANSMIT_LEVEL_3									((uint32_t)0x0003)
#define HSPIM_DMA_TRANSMIT_LEVEL_4									((uint32_t)0x0004)
#define HSPIM_DMA_TRANSMIT_LEVEL_5									((uint32_t)0x0005)
#define HSPIM_DMA_TRANSMIT_LEVEL_6									((uint32_t)0x0006)
#define HSPIM_DMA_TRANSMIT_LEVEL_7									((uint32_t)0x0007)
#define HSPIM_DMA_TRANSMIT_LEVEL_8									((uint32_t)0x0008)
#define HSPIM_DMA_TRANSMIT_LEVEL_9									((uint32_t)0x0009)
#define HSPIM_DMA_TRANSMIT_LEVEL_10									((uint32_t)0x000A)
#define HSPIM_DMA_TRANSMIT_LEVEL_11									((uint32_t)0x000B)
#define HSPIM_DMA_TRANSMIT_LEVEL_12									((uint32_t)0x000C)
#define HSPIM_DMA_TRANSMIT_LEVEL_13									((uint32_t)0x000D)
#define HSPIM_DMA_TRANSMIT_LEVEL_14									((uint32_t)0x000E)
#define HSPIM_DMA_TRANSMIT_LEVEL_15									((uint32_t)0x000F)
#define HSPIM_DMA_TRANSMIT_LEVEL_31									((uint32_t)0x001F)
#define HSPIM_DMA_TRANSMIT_LEVEL_63									((uint32_t)0x003F)

#define IS_HSPIM_DMA_TRANSMIT_LEVEL(LEVEL)							((((uint32_t)(LEVEL)) >= HSPIM_DMA_TRANSMIT_LEVEL_1) && \
																	(((uint32_t)(LEVEL)) <= HSPIM_DMA_TRANSMIT_LEVEL_63))
/**
  * @}
  */		
  																
/** @defgroup HSPIM_Interrupt Mask and Status Flag 
  * @{
  */
  
#define HSPIM_IT_RX													((uint32_t)0x8000)							
#define HSPIM_IT_TX													((uint32_t)0x4000)
#define HSPIM_IT_EN													((uint32_t)0x2000)

#define HSPIM_IT_ID_RXF												((uint32_t)0x0080)	
#define HSPIM_IT_ID_RXTF												((uint32_t)0x0040)     							
#define HSPIM_IT_ID_RXE												((uint32_t)0x0020)	 	 

#define HSPIM_IT_ID_TXF												((uint32_t)0x0008)
#define HSPIM_IT_ID_TXE												((uint32_t)0x0002)
#define HSPIM_IT_ID_TXTF												((uint32_t)0x0001)

#define HSPIM_FLAG_TXE 				   								((uint32_t)0x0004)
#define HSPIM_FLAG_TXF												((uint32_t)0x0010)
#define HSPIM_FLAG_TXTF												((uint32_t)0x0020)

#define HSPIM_FLAG_RXE												((uint32_t)0x0400)
#define HSPIM_FLAG_RXF												((uint32_t)0x1000)
#define HSPIM_FLAG_RXTF												((uint32_t)0x2000)

#define HSPIM_FIFO_TX												((uint32_t)0x0080)
#define HSPIM_FIFO_RX												((uint32_t)0x0040)

/**
  * @}
  */
	
void HSPIM_Init(HSPIM_InitTypeDef* HSPIM_InitStruct);
void HSPIM_DMAInit(HSPIM_DMAInitTypeDef* HSPIM_DMAInitStruct);	
void HSPIM_Cmd(FunctionalState NewState);
void HSPIM_TransmitCmd(FunctionalState NewState);
void HSPIM_DualQuadReceiveCmd(FunctionalState NewState);
void HSPIM_SendData(uint8_t Data);
uint8_t HSPIM_ReceiveData(void);
void HSPIM_ITConfig(uint32_t HSPIM_IT, FunctionalState NewState);
void HSPIM_FIFOReset(uint32_t HSPIM_IT);
FlagStatus HSPIM_IsTransmitDone(void);
FlagStatus HSPIM_IsReady(void);
FlagStatus HSPIM_GetFlagStatus(uint32_t HSPIM_Flag);
ITStatus HSPIM_GetITStatus(uint32_t HSPIM_IT);

void HSPIM_ModeSwitch(uint8_t Mode);
void HSPIM_WriteBuff(uint8_t Mode, uint16_t Size, uint8_t* Buff);
void HSPIM_ReadBuff(uint8_t Mode, uint16_t Size, uint8_t* Buff);

#ifdef __cplusplus
}
#endif
#endif

/**************************      (C) COPYRIGHT Megahunt    *****END OF FILE***********************************************************************/
