352 lines
18 KiB
C
352 lines
18 KiB
C
////////////////////////////////////////////////////////////////////////////////
|
|
/// @file hal_spi.h
|
|
/// @author AE TEAM
|
|
/// @brief THIS FILE CONTAINS ALL THE FUNCTIONS PROTOTYPES FOR THE SPI
|
|
/// FIRMWARE LIBRARY.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @attention
|
|
///
|
|
/// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
|
|
/// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
|
|
/// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
|
|
/// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
|
|
/// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
|
|
/// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
|
|
///
|
|
/// <H2><CENTER>© COPYRIGHT MINDMOTION </CENTER></H2>
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Define to prevent recursive inclusion
|
|
#ifndef __HAL_SPI_H
|
|
#define __HAL_SPI_H
|
|
|
|
// Files includes
|
|
#include "types.h"
|
|
#include "reg_spi.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @addtogroup MM32_Hardware_Abstract_Layer
|
|
/// @{
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @defgroup SPI_HAL
|
|
/// @brief SPI HAL modules
|
|
/// @{
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @defgroup SPI_Exported_Types
|
|
/// @{
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI mode enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_Mode_Slave = 0x0000, ///< SPI slave mode
|
|
SPI_Mode_Master = SPI_GCR_MODE ///< SPI master mode
|
|
} SPI_Mode_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI data size enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_DataSize_8b = 0x0000, ///< 8 bits valid data
|
|
SPI_DataSize_32b = SPI_GCR_DWSEL ///< 32 bits valid data
|
|
} SPI_DataSize_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI clock polarity enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_CPOL_Low = 0x0000, ///< The clock is low in idle state.
|
|
SPI_CPOL_High = SPI_CCR_CPOL ///< The clock is high in idle state.
|
|
} SPI_CPOL_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI clock phase enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_CPHA_2Edge = 0x0000, ///< Data sampling starts from the second clock edge.
|
|
SPI_CPHA_1Edge = SPI_CCR_CPHA ///< Data sampling starts from the first clock edge.
|
|
} SPI_CPHA_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI nss control mode enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_NSS_Soft = 0x0000,
|
|
SPI_NSS_Hard = SPI_GCR_NSS
|
|
} SPI_NSS_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI baud rate prescaler enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_BaudRatePrescaler_2 = 0x0002, ///< SCK clock devide by 2
|
|
SPI_BaudRatePrescaler_4 = 0x0004, ///< SCK clock devide by 4
|
|
SPI_BaudRatePrescaler_8 = 0x0008, ///< SCK clock devide by 7
|
|
SPI_BaudRatePrescaler_16 = 0x0010, ///< SCK clock devide by 16
|
|
SPI_BaudRatePrescaler_32 = 0x0020, ///< SCK clock devide by 32
|
|
SPI_BaudRatePrescaler_64 = 0x0040, ///< SCK clock devide by 64
|
|
SPI_BaudRatePrescaler_128 = 0x0080, ///< SCK clock devide by 128
|
|
SPI_BaudRatePrescaler_256 = 0x0100 ///< SCK clock devide by 256
|
|
} SPI_BaudRatePrescaler_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI first bit enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_FirstBit_MSB = 0x0000, ///< Data transfers start from MSB
|
|
SPI_FirstBit_LSB = SPI_CCR_LSBFE ///< Data transfers start from LSB
|
|
} SPI_FirstBit_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI FIFO trigger level enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_RXTLF = SPI_GCR_RXTLF_Half, ///< RX FIFO trigger level
|
|
SPI_TXTLF = SPI_GCR_TXTLF_Half ///< TX FIFO trigger level
|
|
} SPI_TLF_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI bit derection enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_Direction_Rx, ///< Receive enable
|
|
SPI_Direction_Tx, ///< Transmit enable
|
|
SPI_Disable_Rx, ///< Receive disable
|
|
SPI_Disable_Tx ///< Transmit disable
|
|
} SPI_Direction_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI flag enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_FLAG_RXAVL = SPI_SR_RXAVL, ///< Receive 1 byte available data flag
|
|
SPI_FLAG_TXEPT = SPI_SR_TXEPT, ///< Transmitter empty flag
|
|
SPI_FLAG_TXFULL = SPI_SR_TXFULL, ///< Transmitter FIFO full status flag
|
|
SPI_FLAG_RXAVL_4BYTE = SPI_SR_RXAVL_4BYTE ///< Receive 4 bytes available data flag
|
|
} SPI_FLAG_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI slave mode data edge adjust enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_SlaveAdjust_LOW, ///< SPI slave mode data edge adjust in low speed mode
|
|
SPI_SlaveAdjust_FAST ///< SPI slave mode data edge adjust in fast speed mode
|
|
} SPI_SlaveAdjust_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI data edge adjust enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_DataEdgeAdjust_LOW, ///< SPI data edge adjust in low speed mode
|
|
SPI_DataEdgeAdjust_FAST ///< SPI data edge adjust in fast speed mode
|
|
} SPI_DataEdgeAdjust_TypeDef;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI interruput enum definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef enum {
|
|
SPI_IT_TXEPT = 0x40, ///< Transmitter empty interrupt
|
|
SPI_IT_RXFULL = 0x20, ///< RX FIFO full interrupt
|
|
SPI_IT_RXMATCH = 0x10, ///< Receive data match the RXDNR number interrut
|
|
SPI_IT_RXOERR = 0x08, ///< Receive overrun error interrupt
|
|
SPI_IT_UNDERRUN = 0x04, ///< Underrun interrupt
|
|
SPI_IT_RX = 0x02, ///< Receive available data interrupt
|
|
SPI_IT_TX = 0x01 ///< Transmit FIFO available interrupt
|
|
} SPI_IT_TypeDef;
|
|
|
|
|
|
typedef enum {
|
|
I2S_Standard_Phillips = 0x0000,
|
|
I2S_Standard_MSB = 0x0010,
|
|
I2S_Standard_LSB = 0x0020,
|
|
I2S_Standard_PCMShort = 0x0030,
|
|
I2S_Standard_PCMLong = 0x00B0,
|
|
} SPI_I2S_STANDARD_TypeDef;
|
|
|
|
|
|
typedef enum {
|
|
I2S_DataFormat_16b = 0x0000,
|
|
I2S_DataFormat_16bextended = 0x0001,
|
|
I2S_DataFormat_24b = 0x0003,
|
|
I2S_DataFormat_32b = 0x0005,
|
|
} SPI_I2S_DATAFORMAT_TypeDef;
|
|
typedef enum {
|
|
I2S_AudioFreq_192k = (192000),
|
|
I2S_AudioFreq_96k = (96000),
|
|
I2S_AudioFreq_48k = (48000),
|
|
I2S_AudioFreq_44k = (44100),
|
|
I2S_AudioFreq_32k = (32000),
|
|
I2S_AudioFreq_24k = (24000),
|
|
I2S_AudioFreq_22k = (22050),
|
|
I2S_AudioFreq_16k = (16000),
|
|
I2S_AudioFreq_11k = (11025),
|
|
I2S_AudioFreq_12k = (12000),
|
|
I2S_AudioFreq_8k = (8000),
|
|
I2S_AudioFreq_4k = (4000),
|
|
I2S_AudioFreq_Default = (2),
|
|
} SPI_I2S_AUDIO_FREQ_TypeDef;
|
|
typedef enum {
|
|
I2S_Mode_SlaveTx = 0x0000,
|
|
I2S_Mode_SlaveRx = 0x0100,
|
|
I2S_Mode_MasterTx = 0x0200,
|
|
I2S_Mode_MasterRx = 0x0300,
|
|
} SPI_I2S_TRANS_MODE_TypeDef;
|
|
|
|
typedef enum {
|
|
I2S_MCLKOutput_Enable = 0x0800,
|
|
I2S_MCLKOutput_Disable = 0x0000,
|
|
} SPI_I2S_MCLK_OUTPUT_TypeDef;
|
|
|
|
typedef enum {
|
|
I2S_CPOL_Low = 0x0000, ///< The clock is low in idle state.
|
|
I2S_CPOL_High = SPI_CCR_CPOL ///< The clock is high in idle state.
|
|
} SPI_I2S_CPOL_TypeDef;
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief SPI Init structure definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef struct {
|
|
SPI_Mode_TypeDef SPI_Mode; ///< Specifies the SPI operating mode
|
|
SPI_DataSize_TypeDef SPI_DataSize; ///< Specifies the SPI available data size
|
|
u8 SPI_DataWidth; ///< SPI data length
|
|
SPI_CPOL_TypeDef SPI_CPOL; ///< Specifies the serial clock steady state
|
|
SPI_CPHA_TypeDef SPI_CPHA; ///< Specifies the clock active edge for the bit capture
|
|
SPI_NSS_TypeDef SPI_NSS; ///< Specifies whether the NSS signal is managed by hardware or by software
|
|
SPI_BaudRatePrescaler_TypeDef SPI_BaudRatePrescaler; ///< Specifies the Baud Rate prescaler value which will be
|
|
///< used to configure the transmit and receive SCK clock
|
|
SPI_FirstBit_TypeDef SPI_FirstBit; ///< Specifies whether data transfers start from MSB or LSB bit
|
|
// u16 SPI_length;
|
|
} SPI_InitTypeDef;
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief I2S Init structure definition
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
typedef struct {
|
|
SPI_I2S_TRANS_MODE_TypeDef I2S_Mode; ///< Specifies the I2S operating mode.
|
|
SPI_I2S_STANDARD_TypeDef I2S_Standard; ///< Specifies the standard used for the I2S communication.
|
|
SPI_I2S_DATAFORMAT_TypeDef I2S_DataFormat; ///< Specifies the data format for the I2S communication.
|
|
SPI_I2S_MCLK_OUTPUT_TypeDef I2S_MCLKOutput; ///< Specifies whether the I2S MCLK output is enabled or not.
|
|
SPI_I2S_AUDIO_FREQ_TypeDef I2S_AudioFreq; ///< Specifies the frequency selected for the I2S communication.
|
|
SPI_I2S_CPOL_TypeDef I2S_CPOL; ///< Specifies the idle state of the I2S clock.
|
|
} I2S_InitTypeDef;
|
|
/// @}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @defgroup SPI_Exported_Constants
|
|
/// @{
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @defgroup SPI_Register_Mask
|
|
/// @{
|
|
|
|
#define GCR_Mask ((u32)0x0FFF)
|
|
#define CCR_Mask ((u32)0x003F)
|
|
#define BRR_Mask ((u32)0xFFFF)
|
|
#define ECR_Mask ((u32)0x001F)
|
|
|
|
/// @}
|
|
|
|
|
|
// SPI_7bit_8bit data width
|
|
#define SPI_DataWidth_1b ((u16)0x0001)
|
|
#define SPI_DataWidth_2b ((u16)0x0002)
|
|
#define SPI_DataWidth_3b ((u16)0x0003)
|
|
#define SPI_DataWidth_4b ((u16)0x0004)
|
|
#define SPI_DataWidth_5b ((u16)0x0005)
|
|
#define SPI_DataWidth_6b ((u16)0x0006)
|
|
#define SPI_DataWidth_7b ((u16)0x0007)
|
|
#define SPI_DataWidth_8b ((u16)0x0008)
|
|
#define SPI_DataWidth_9b ((u16)0x0009)
|
|
#define SPI_DataWidth_10b ((u16)0x000a)
|
|
#define SPI_DataWidth_11b ((u16)0x000b)
|
|
#define SPI_DataWidth_12b ((u16)0x000c)
|
|
#define SPI_DataWidth_13b ((u16)0x000d)
|
|
#define SPI_DataWidth_14b ((u16)0x000e)
|
|
#define SPI_DataWidth_15b ((u16)0x000f)
|
|
#define SPI_DataWidth_16b ((u16)0x0010)
|
|
#define SPI_DataWidth_17b ((u16)0x0011)
|
|
#define SPI_DataWidth_18b ((u16)0x0012)
|
|
#define SPI_DataWidth_19b ((u16)0x0013)
|
|
#define SPI_DataWidth_20b ((u16)0x0014)
|
|
#define SPI_DataWidth_21b ((u16)0x0015)
|
|
#define SPI_DataWidth_22b ((u16)0x0016)
|
|
#define SPI_DataWidth_23b ((u16)0x0017)
|
|
#define SPI_DataWidth_24b ((u16)0x0018)
|
|
#define SPI_DataWidth_25b ((u16)0x0019)
|
|
#define SPI_DataWidth_26b ((u16)0x001a)
|
|
#define SPI_DataWidth_27b ((u16)0x001b)
|
|
#define SPI_DataWidth_28b ((u16)0x001c)
|
|
#define SPI_DataWidth_29b ((u16)0x001d)
|
|
#define SPI_DataWidth_30b ((u16)0x001e)
|
|
#define SPI_DataWidth_31b ((u16)0x001f)
|
|
#define SPI_DataWidth_32b ((u16)0x0000)
|
|
|
|
|
|
|
|
/// @}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @defgroup SPI_Exported_Variables
|
|
/// @{
|
|
|
|
#ifdef _HAL_SPI_C_
|
|
#define GLOBAL
|
|
#else
|
|
#define GLOBAL extern
|
|
#endif
|
|
|
|
#undef GLOBAL
|
|
|
|
/// @}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @defgroup SPI_Exported_Functions
|
|
/// @{
|
|
|
|
void SPI_DeInit(SPI_TypeDef* spi);
|
|
void SPI_Init(SPI_TypeDef* spi, SPI_InitTypeDef* init_struct);
|
|
void SPI_StructInit(SPI_InitTypeDef* init_struct);
|
|
void SPI_Cmd(SPI_TypeDef* spi, FunctionalState state);
|
|
void SPI_ITConfig(SPI_TypeDef* spi, u8 interrupt, FunctionalState state);
|
|
void SPI_DMACmd(SPI_TypeDef* spi, FunctionalState state);
|
|
void SPI_FifoTrigger(SPI_TypeDef* spi, SPI_TLF_TypeDef fifo_trigger_value, FunctionalState state);
|
|
void SPI_SendData(SPI_TypeDef* spi, u32 data);
|
|
void SPI_CSInternalSelected(SPI_TypeDef* spi, FunctionalState state);
|
|
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* spi, SPI_NSS_TypeDef nss);
|
|
|
|
void SPI_BiDirectionalLineConfig(SPI_TypeDef* spi, SPI_Direction_TypeDef direction);
|
|
void SPI_ClearITPendingBit(SPI_TypeDef* spi, SPI_IT_TypeDef interrupt);
|
|
void SPI_RxBytes(SPI_TypeDef* spi, u16 number);
|
|
void SPI_SlaveAdjust(SPI_TypeDef* spi, SPI_SlaveAdjust_TypeDef adjust_value);
|
|
|
|
bool SPI_DataSizeConfig(SPI_TypeDef* spi, u8 data_size);
|
|
void SPI_DataSizeTypeConfig(SPI_TypeDef* spi, SPI_DataSize_TypeDef SPI_DataSize);
|
|
u32 SPI_ReceiveData(SPI_TypeDef* spi);
|
|
|
|
FlagStatus SPI_GetFlagStatus(SPI_TypeDef* spi, SPI_FLAG_TypeDef flag);
|
|
|
|
ITStatus SPI_GetITStatus(SPI_TypeDef* spi, SPI_IT_TypeDef interrupt);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Extended function interface
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
void exSPI_ITCmd(SPI_TypeDef* spi, FunctionalState state);
|
|
void exSPI_ITConfig(SPI_TypeDef* spi, SPI_IT_TypeDef interrput, FunctionalState state);
|
|
void exSPI_DMACmd(SPI_TypeDef* spi, FunctionalState state);
|
|
void exSPI_CSInternalSelected(SPI_TypeDef* spi, FunctionalState state);
|
|
void exSPI_DataEdgeAdjust(SPI_TypeDef* spi, SPI_DataEdgeAdjust_TypeDef adjust_value);
|
|
void I2S_Cmd(SPI_TypeDef* spi, FunctionalState state);
|
|
void I2S_Init(SPI_TypeDef* spi, I2S_InitTypeDef* I2S_InitStruct);
|
|
/// @}
|
|
|
|
/// @}
|
|
|
|
/// @}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
#endif //__HAL_SPI_H
|
|
////////////////////////////////////////////////////////////////////////////////
|