rt-thread-official/bsp/mm32f327x/Libraries/MM32F327x/Include/reg_spi.h

360 lines
22 KiB
C

////////////////////////////////////////////////////////////////////////////////
/// @file reg_spi.h
/// @author AE TEAM
/// @brief THIS FILE CONTAINS ALL THE FUNCTIONS PROTOTYPES FOR THE SERIES OF
/// MM32 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>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
////////////////////////////////////////////////////////////////////////////////
// Define to prevent recursive inclusion
#ifndef __REG_SPI_H
#define __REG_SPI_H
// Files includes
#include <stdint.h>
#include <stdbool.h>
#include "types.h"
#if defined ( __CC_ARM )
#pragma anon_unions
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI Base Address Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) ///< Base Address: 0x40003800
#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) ///< Base Address: 0x400013000
#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) ///< Base Address: 0x40003C000
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI Register Structure Definition
////////////////////////////////////////////////////////////////////////////////
#undef USENCOMBINEREGISTER
#undef USENNEWREGISTER
#undef USENOLDREGISTER
#define USENCOMBINEREGISTER
#ifdef USENCOMBINEREGISTER
typedef struct {
union {
__IO u32 TDR; ///< SPI transmit data register, offset: 0x00
__IO u32 TXREG;
};
union {
__IO u32 RDR; ///< SPI receive data register, offset: 0x04
__IO u32 RXREG;
};
union {
__IO u32 SR; ///< SPI current state register, offset: 0x08
__IO u32 CSTAT;
};
union {
__IO u32 ISR; ///< SPI interruput state register, offset: 0x0C
__IO u32 INTSTAT;
};
union {
__IO u32 IER; ///< SPI interruput enable register, offset: 0x10
__IO u32 INTEN;
};
union {
__IO u32 ICR; ///< SPI interruput control register, offset: 0x14
__IO u32 INTCLR;
};
union {
__IO u32 GCR; ///< SPI global control register, offset: 0x18
__IO u32 GCTL;
};
union {
__IO u32 CCR; ///< SPI common control register, offset: 0x1C
__IO u32 CCTL;
};
union {
__IO u32 BRR; ///< SPI baud rate control register, offset: 0x20
__IO u32 SPBRG;
};
union {
__IO u32 RDNR; ///< SPI receive data number register, offset: 0x24
__IO u32 RXDNR;
};
union {
__IO u32 NSSR; ///< SPI chip select register, offset: 0x28
__IO u32 SCSR;
};
union {
__IO u32 ECR; ///< SPI extand control register, offset: 0x2C
__IO u32 EXTCTL;
};
__IO u32 CFGR; ///< I2S configuration register, offset: 0x30
} SPI_TypeDef;
#endif
#ifdef USENNEWREGISTER
typedef struct {
__IO u32 TDR; ///< SPI transmit data register, offset: 0x00
__IO u32 RDR; ///< SPI receive data register, offset: 0x04
__IO u32 SR; ///< SPI current state register, offset: 0x08
__IO u32 ISR; ///< SPI interruput state register, offset: 0x0C
__IO u32 IER; ///< SPI interruput enable register, offset: 0x10
__IO u32 ICR; ///< SPI interruput control register, offset: 0x14
__IO u32 GCR; ///< SPI global control register, offset: 0x18
__IO u32 CCR; ///< SPI common control register, offset: 0x1C
__IO u32 BRR; ///< SPI baud rate control register, offset: 0x20
__IO u32 RDNR; ///< SPI receive data number register, offset: 0x24
__IO u32 NSSR; ///< SPI chip select register, offset: 0x28
__IO u32 ECR; ///< SPI extand control register, offset: 0x2C
} SPI_TypeDef;
#endif
#ifdef USENOLDREGISTER
typedef struct {
__IO u32 TXREG; ///< SPI transmit data register, offset: 0x00
__IO u32 RXREG; ///< SPI receive data register, offset: 0x04
__IO u32 CSTAT; ///< SPI current state register, offset: 0x08
__IO u32 INTSTAT; ///< SPI interruput state register, offset: 0x0C
__IO u32 INTEN; ///< SPI interruput enable register, offset: 0x10
__IO u32 INTCLR; ///< SPI interruput control register, offset: 0x14
__IO u32 GCTL; ///< SPI global control register, offset: 0x18
__IO u32 CCTL; ///< SPI common control register, offset: 0x1C
__IO u32 SPBRG; ///< SPI baud rate control register, offset: 0x20
__IO u32 RXDNR; ///< SPI receive data number register, offset: 0x24
__IO u32 NSSR; ///< SPI chip select register, offset: 0x28
__IO u32 EXTCTL; ///< SPI extand control register, offset: 0x2C
} SPI_TypeDef;
#endif
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI type pointer Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI2 ((SPI_TypeDef*) SPI2_BASE)
#define SPI1 ((SPI_TypeDef*) SPI1_BASE)
#define SPI3 ((SPI_TypeDef*) SPI3_BASE)
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_TDR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_TDR_TXREG_Pos (0)
#define SPI_TDR_TXREG (0xFFFFFFFFU << SPI_TDR_TXREG_Pos) ///< Transmit data register
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_RDR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_RDR_RXREG_Pos (0)
#define SPI_RDR_RXREG (0xFFFFFFFFU << SPI_RDR_RXREG_Pos) ///< Receive data register
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_SR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_SR_TXEPT_Pos (0)
#define SPI_SR_TXEPT (0x01U << SPI_SR_TXEPT_Pos) ///< Transmitter empty bit
#define SPI_SR_RXAVL_Pos (1)
#define SPI_SR_RXAVL (0x01U << SPI_SR_RXAVL_Pos) ///< Receive available byte data message
#define SPI_SR_TXFULL_Pos (2)
#define SPI_SR_TXFULL (0x01U << SPI_SR_TXFULL_Pos) ///< Transmitter FIFO full status bit
#define SPI_SR_RXAVL_4BYTE_Pos (3)
#define SPI_SR_RXAVL_4BYTE (0x01U << SPI_SR_RXAVL_4BYTE_Pos) ///< Receive available 4 byte data message
#define SPI_SR_TXFADDR_Pos (4)
#define SPI_SR_TXFADDR (0x0FU << SPI_SR_TXFADDR_Pos) ///< Transmit FIFO address
#define SPI_SR_RXFADDR_Pos (8)
#define SPI_SR_RXFADDR (0x0FU << SPI_SR_RXFADDR_Pos) ///< Receive FIFO address
#define SPI_SR_BUSY_Pos (12)
#define SPI_SR_BUSY (0x01U << SPI_SR_BUSY_Pos) ///< Data transfer flag
#define SPI_SR_CHSIDE_Pos (13)
#define SPI_SR_CHSIDE (0x01U << SPI_SR_CHSIDE_Pos) ///< transmission channel
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_ISR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_ISR_TX_INTF_Pos (0)
#define SPI_ISR_TX_INTF (0x01U << SPI_ISR_TX_INTF_Pos) ///< Transmit FIFO available interrupt flag bit
#define SPI_ISR_RX_INTF_Pos (1)
#define SPI_ISR_RX_INTF (0x01U << SPI_ISR_RX_INTF_Pos) ///< Receive data available interrupt flag bit
#define SPI_ISR_UNDERRUN_INTF_Pos (2)
#define SPI_ISR_UNDERRUN_INTF (0x01U << SPI_ISR_UNDERRUN_INTF_Pos) ///< SPI underrun interrupt flag bit
#define SPI_ISR_RXOERR_INTF_Pos (3)
#define SPI_ISR_RXOERR_INTF (0x01U << SPI_ISR_RXOERR_INTF_Pos) ///< Receive overrun error interrupt flag bit
#define SPI_ISR_RXMATCH_INTF_Pos (4)
#define SPI_ISR_RXMATCH_INTF (0x01U << SPI_ISR_RXMATCH_INTF_Pos) ///< Receive data match the RXDNR number, the receive process will be completed and generate the interrupt
#define SPI_ISR_RXFULL_INTF_Pos (5)
#define SPI_ISR_RXFULL_INTF (0x01U << SPI_ISR_RXFULL_INTF_Pos) ///< RX FIFO full interrupt flag bit
#define SPI_ISR_TXEPT_INTF_Pos (6)
#define SPI_ISR_TXEPT_INTF (0x01U << SPI_ISR_TXEPT_INTF_Pos) ///< Transmitter empty interrupt flag bit
#define SPI_ISR_FRE_INTF_Pos (7)
#define SPI_ISR_FRE_INTF (0x01U << SPI_ISR_FRE_INTF_Pos) ///< I2S frame transmission error flag bit
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_IER Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_IER_TX_IEN_Pos (0)
#define SPI_IER_TX_IEN (0x01U << SPI_IER_TX_IEN_Pos) ///< Transmit FIFO empty interrupt enable bit
#define SPI_IER_RX_IEN_Pos (1)
#define SPI_IER_RX_IEN (0x01U << SPI_IER_RX_IEN_Pos) ///< Receive FIFO interrupt enable bit
#define SPI_IER_UNDERRUN_IEN_Pos (2)
#define SPI_IER_UNDERRUN_IEN (0x01U << SPI_IER_UNDERRUN_IEN_Pos) ///< Transmitter underrun interrupt enable bit
#define SPI_IER_RXOERR_IEN_Pos (3)
#define SPI_IER_RXOERR_IEN (0x01U << SPI_IER_RXOERR_IEN_Pos) ///< Overrun error interrupt enable bit
#define SPI_IER_RXMATCH_IEN_Pos (4)
#define SPI_IER_RXMATCH_IEN (0x01U << SPI_IER_RXMATCH_IEN_Pos) ///< Receive data complete interrupt enable bit
#define SPI_IER_RXFULL_IEN_Pos (5)
#define SPI_IER_RXFULL_IEN (0x01U << SPI_IER_RXFULL_IEN_Pos) ///< Receive FIFO full interrupt enable bit
#define SPI_IER_TXEPT_IEN_Pos (6)
#define SPI_IER_TXEPT_IEN (0x01U << SPI_IER_TXEPT_IEN_Pos) ///< Transmit empty interrupt enable bit
#define SPI_IER_FRE_IEN_Pos (7)
#define SPI_IER_FRE_IEN (0x01U << SPI_IER_FRE_IEN_Pos) ///< I2S frame transmission interrupt enable bit
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_ICR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_ICR_TX_ICLR_Pos (0)
#define SPI_ICR_TX_ICLR (0x01U << SPI_ICR_TX_ICLR_Pos) ///< Transmitter FIFO empty interrupt clear bit
#define SPI_ICR_RX_ICLR_Pos (1)
#define SPI_ICR_RX_ICLR (0x01U << SPI_ICR_RX_ICLR_Pos) ///< Receive interrupt clear bit
#define SPI_ICR_UNDERRUN_ICLR_Pos (2)
#define SPI_ICR_UNDERRUN_ICLR (0x01U << SPI_ICR_UNDERRUN_ICLR_Pos) ///< Transmitter underrun interrupt clear bit
#define SPI_ICR_RXOERR_ICLR_Pos (3)
#define SPI_ICR_RXOERR_ICLR (0x01U << SPI_ICR_RXOERR_ICLR_Pos) ///< Overrun error interrupt clear bit
#define SPI_ICR_RXMATCH_ICLR_Pos (4)
#define SPI_ICR_RXMATCH_ICLR (0x01U << SPI_ICR_RXMATCH_ICLR_Pos) ///< Receive completed interrupt clear bit
#define SPI_ICR_RXFULL_ICLR_Pos (5)
#define SPI_ICR_RXFULL_ICLR (0x01U << SPI_ICR_RXFULL_ICLR_Pos) ///< Receiver buffer full interrupt clear bit
#define SPI_ICR_TXEPT_ICLR_Pos (6)
#define SPI_ICR_TXEPT_ICLR (0x01U << SPI_ICR_TXEPT_ICLR_Pos) ///< Transmitter empty interrupt clear bit
#define SPI_ICR_FRE_ICLR_Pos (7)
#define SPI_ICR_FRE_ICLR (0x01U << SPI_ICR_FRE_ICLR_Pos) ///< I2S frame transmission interrupt clear bit
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_GCR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_GCR_SPIEN_Pos (0)
#define SPI_GCR_SPIEN (0x01U << SPI_GCR_SPIEN_Pos) ///< SPI select bit
#define SPI_GCR_IEN_Pos (1)
#define SPI_GCR_IEN (0x01U << SPI_GCR_IEN_Pos) ///< SPI interrupt enable bit
#define SPI_GCR_MODE_Pos (2)
#define SPI_GCR_MODE (0x01U << SPI_GCR_MODE_Pos) ///< Master mode bit
#define SPI_GCR_TXEN_Pos (3)
#define SPI_GCR_TXEN (0x01U << SPI_GCR_TXEN_Pos) ///< Transmit enable bit
#define SPI_GCR_RXEN_Pos (4)
#define SPI_GCR_RXEN (0x01U << SPI_GCR_RXEN_Pos) ///< Receive enable bit
#define SPI_GCR_RXTLF_Pos (5)
#define SPI_GCR_RXTLF (0x03U << SPI_GCR_RXTLF_Pos) ///< RX FIFO trigger level bit
#define SPI_GCR_RXTLF_One (0x00U << SPI_GCR_RXTLF_Pos) ///<
#define SPI_GCR_RXTLF_Half (0x01U << SPI_GCR_RXTLF_Pos) ///<
#define SPI_GCR_TXTLF_Pos (7)
#define SPI_GCR_TXTLF (0x03U << SPI_GCR_TXTLF_Pos) ///< TX FIFO trigger level bit
#define SPI_GCR_TXTLF_One (0x00U << SPI_GCR_TXTLF_Pos) ///<
#define SPI_GCR_TXTLF_Half (0x01U << SPI_GCR_TXTLF_Pos) ///<
#define SPI_GCR_DMAEN_Pos (9)
#define SPI_GCR_DMAEN (0x01U << SPI_GCR_DMAEN_Pos) ///< DMA access mode enable
#define SPI_GCR_NSS_Pos (10)
#define SPI_GCR_NSS (0x01U << SPI_GCR_NSS_Pos) ///< NSS select signal that from software or hardware
#define SPI_GCR_DWSEL_Pos (11)
#define SPI_GCR_DWSEL (0x01U << SPI_GCR_DWSEL_Pos) ///< Valid byte or double-word data select signal
#define SPI_GCR_NSSTOG_Pos (12)
#define SPI_GCR_NSSTOG (0x01U << SPI_GCR_NSSTOG_Pos) ///< Slave select toggle
#define SPI_GCR_PAD_SEL_Pos (13)
#define SPI_GCR_PAD_SEL (0x1FU << SPI_GCR_PAD_SEL_Pos) ///< Bus mapping transformation
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_CCR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_CCR_CPHA_Pos (0)
#define SPI_CCR_CPHA (0x01U << SPI_CCR_CPHA_Pos) ///< Clock phase select bit
#define SPI_CCR_CPOL_Pos (1)
#define SPI_CCR_CPOL (0x01U << SPI_CCR_CPOL_Pos) ///< Clock polarity select bit
#define SPI_CCR_LSBFE_Pos (2)
#define SPI_CCR_LSBFE (0x01U << SPI_CCR_LSBFE_Pos) ///< LSI first enable bit
#define SPI_CCR_SPILEN_Pos (3)
#define SPI_CCR_SPILEN (0x01U << SPI_CCR_SPILEN_Pos) ///< SPI character length bit
#define SPI_CCR_RXEDGE_Pos (4)
#define SPI_CCR_RXEDGE (0x01U << SPI_CCR_RXEDGE_Pos) ///< Receive data edge select
#define SPI_CCR_TXEDGE_Pos (5)
#define SPI_CCR_TXEDGE (0x01U << SPI_CCR_TXEDGE_Pos) ///< Transmit data edge select
#define SPI_CCR_CPHASEL_Pos (6)
#define SPI_CCR_CPHASEL (0x01U << SPI_CCR_CPHASEL) ///< CPHA polarity select
#define SPI_CCR_HISPD_Pos (7)
#define SPI_CCR_HISPD (0x01U << SPI_CCR_HISPD) ///< High speed slave mode
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_BRR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_BRR_DIVF_Pos (0)
#define SPI_BRR_DIVF (0xFFFFU << SPI_BRR_DIVF_Pos) ///< SPI baud rate control register for baud rate
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_RDNR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_RDNR_RDN_Pos (0)
#define SPI_RDNR_RDN (0xFFFFU << SPI_RDNR_RDN_Pos) ///< The register is used to hold a count of to be received bytes in next receive process
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_NSSR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_NSSR_NSS_Pos (0)
#define SPI_NSSR_NSS (0xFFU << SPI_NSSR_NSS_Pos) ///< Chip select output signal in Master mode
////////////////////////////////////////////////////////////////////////////////
/// @brief SPI_ECR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define SPI_ECR_EXTLEN_Pos (0)
#define SPI_ECR_EXTLEN (0x1FU << SPI_ECR_EXTLEN_Pos) ///< control SPI data length
////////////////////////////////////////////////////////////////////////////////
/// @brief I2S_CFGR Register Bit Definition
////////////////////////////////////////////////////////////////////////////////
#define I2SCFGR_CLEAR_Mask ((u32)0xFE00F388)
#define I2S_CFGR_CHLEN_Pos (0)
#define I2S_CFGR_CHLEN (0x01U << I2S_CFGR_CHLEN_Pos) ///< Vocal tract length
#define I2S_CFGR_DATLEN_Pos (1)
#define I2S_CFGR_DATLEN_16 (0x00U << I2S_CFGR_DATLEN_Pos) ///< Audio data width 16
#define I2S_CFGR_DATLEN_24 (0x01U << I2S_CFGR_DATLEN_Pos) ///< Audio data width 24
#define I2S_CFGR_DATLEN_32 (0x02U << I2S_CFGR_DATLEN_Pos) ///< Audio data width 32
#define I2S_CFGR_I2SSTD_Pos (4)
#define I2S_CFGR_I2SSTD_PCM (0x00U << I2S_CFGR_I2SSTD_Pos) ///< I2S selection PCM standard
#define I2S_CFGR_I2SSTD_MSB_R (0x01U << I2S_CFGR_I2SSTD_Pos) ///< I2S selection Right alignment (MSB) standard
#define I2S_CFGR_I2SSTD_MSB_L (0x02U << I2S_CFGR_I2SSTD_Pos) ///< I2S selection Left aligned (MSB) standard
#define I2S_CFGR_I2SSTD_Philips (0x03U << I2S_CFGR_I2SSTD_Pos) ///< I2S selection Philips standard
#define I2S_CFGR_PCMSYNC_Pos (6)
#define I2S_CFGR_PCMSYNC (0x01U << I2S_CFGR_PCMSYNC_Pos) ///< PCM frame synchronization mode
#define I2S_CFGR_SPI_I2S_Pos (10)
#define I2S_CFGR_SPI_I2S (0x01U << I2S_CFGR_SPI_I2S_Pos) ///< SPI/I2S module function selection
#define I2S_CFGR_MCKOE_Pos (11)
#define I2S_CFGR_MCKOE (0x01U << I2S_CFGR_MCKOE_Pos) ///< I2S master clock output enable
#define I2S_CFGR_I2SDIV_Pos (16)
#define I2S_CFGR_I2SDIV (0x1FFU << I2S_CFGR_I2SDIV_Pos) ///< The frequency division
/// @}
/// @}
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
////////////////////////////////////////////////////////////////////////////////