arduino_midi_player/Midi/music-box-nv32-master/nv32lib/drivers/spi/spi.h
2025-03-24 14:30:56 +08:00

568 lines
18 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
*
* @brief SPI 驱动头文件.
*
******************************************************************************/
#ifndef SPI_H_
#define SPI_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "common.h"
/******************************************************************************
* 定义SPI模块个数
******************************************************************************/
#define MAX_SPI_NO 2
/******************************************************************************
*
* 定义SPI寄存复位值
*
*******************************************************************************/
#define SPI_C1_DEFAULT 0x04 /*!< SPI 控制寄存器1 */
#define SPI_C2_DEFAULT 0x00 /*!< SPI 控制寄存器2 */
#define SPI_BR_DEFAULT 0x00 /*!< SPI 波特率寄存器 */
#define SPI_S_DEFAULT 0x20 /*!< SPI 状态寄存器 */
#define SPI_M_DEFAULT 0x00 /*!< SPI 匹配寄存器 */
/******************************************************************************
*
* 定义SPI传输状态
*
*******************************************************************************/
#define SPI_ERR_SUCCESS 0 /*!< 成功 */
#define SPI_ERR_CODE_BASE ((uint32)SPI0 - 0x40000000L) /*!< SPI基地址错误 */
#define SPI_ERR_TXBUF_NOT_EMPTY (SPI_ERR_CODE_BASE+1) /*!< 失败由于发送缓冲区空时,标志位没有置位*/
#define SPI_ERR_RXBUF_NOT_FULL (SPI_ERR_CODE_BASE+2) /*!< 失败由于接收缓冲区满时,标志位没有置位 */
/******************************************************************************
* 数据类型别名定义
******************************************************************************/
typedef uint8_t SPI_WidthType; /* SPI 发送数据宽度类型 */
typedef uint32_t ResultType; /* SPI 收发返回状态数据类型 */
/******************************************************************************
*
* SPI回调函数声明
*
*******************************************************************************/
typedef void (*SPI_CallbackType)(void);
/******************************************************************************
*
* SPI 结构体类型
*
*******************************************************************************/
typedef struct
{
uint32_t bIntEn : 1; /*!< 1: 使能中断, 0: 禁用中断*/
uint32_t bModuleEn : 1; /*!< 1: 使能SPI模块, 0: 禁用SPI模块 */
uint32_t bTxIntEn : 1; /*!< 1: 使能发送中断, 0: 禁用发送中断 */
uint32_t bMasterMode : 1; /*!< 1: 主机模式, 0: 从机模式 */
uint32_t bClkPolarityLow : 1; /*!< 设置时钟极性 */
uint32_t bClkPhase1 : 1; /*!< 设置时钟相位 */
uint32_t bMasterAutoDriveSS : 1; /*!< 从机选择输出使能 */
uint32_t bShiftLSBFirst : 1; /*!< 1: LSB, 0: MSB */
uint32_t bMatchIntEn : 1; /*!< 1: 使能匹配中断, 0: 禁用匹配中断 */
uint32_t bModeFaultEn : 1; /*!< 使能主机模式错误功能 */
uint32_t bBidirectionModeEn : 1; /*!< 双向模式输出控制 */
uint32_t bPinAsOuput : 1; /*!< SPI引脚控制 */
uint32_t bStopInWaitMode : 1; /*!< 配置SPI时钟在等待模式下的工作状态 */
uint32_t bRsvd : 19;
} SPI_SettingType;
/******************************************************************************
*
* SPI配置结构体类型
*
*******************************************************************************/
typedef struct
{
SPI_SettingType sSettings; /*!< SPI 结构体 */
uint32_t u32BitRate; /*!< 设置波特率 */
uint32_t u32BusClkHz; /*!< 输入总线时钟 */
} SPI_ConfigType; /*!< SPI配置结构体 */
/*****************************************************************************//*!
*
* @brief SPI串行数据传输从最低位开始(LSB)
*
* @param[in] pSPI 指向SPI模块
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_SetLSBFirst(SPI_Type *pSPI)
{
pSPI->C1 |= SPI_C1_LSBFE_MASK;
}
/*****************************************************************************//*!
*
* @brief SPI串行数据传输从最高位开始(MSB)
*
* @param[in] pSPI 指向SPI模块
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_SetMSBFirst(SPI_Type *pSPI)
{
pSPI->C1 &= ~SPI_C1_LSBFE_MASK;
}
/*****************************************************************************//*!
*
* @brief 设置SPI时钟极性.
*
* @param[in] pSPI 指向SPI模块 .
* @param[in] u8PolLow 设置时钟极性. 1-SCK时钟有效状态为高无效状态为低
* 0-SCK时钟有效状态为低无效状态为高
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_SetClockPol(SPI_Type *pSPI,uint8_t u8PolLow)
{
if( u8PolLow )
{
pSPI->C1 |= SPI_C1_CPOL_MASK;
}
else
{
pSPI->C1 &= ~SPI_C1_CPOL_MASK;
}
}
/*****************************************************************************//*!
*
* @brief 设置SPI时钟相位.
*
* @param[in] pSPI 指向SPI模块
* @param[in] u8Phase 设置时钟相位, 1 - 数据在SCK下降沿输出在上升沿采样.
* 0 - 数据在SCK上升沿采样在下降沿输出
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_SetClockPhase(SPI_Type *pSPI,uint8_t u8Phase)
{
if( u8Phase )
{
pSPI->C1 |= SPI_C1_CPHA_MASK;
}
else
{
pSPI->C1 &= ~SPI_C1_CPHA_MASK;
}
}
/*****************************************************************************//*!
*
* @brief 使能SPI模块.
*
* @param[in] pSPI 指向SPI模块
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_Enable(SPI_Type *pSPI)
{
pSPI->C1 |= SPI_C1_SPE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用SPI模块
*
* @param[in] pSPI 指向SPI模块
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_Disable(SPI_Type *pSPI)
{
pSPI->C1 &= ~SPI_C1_SPE_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能SPI中断.
*
* @param[in] pSPI 指向SPI模块
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_IntEnable(SPI_Type *pSPI)
{
pSPI->C1 |= SPI_C1_SPIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用SPI中断.
*
* @param[in] pSPI 指向SPI模块
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_IntDisable(SPI_Type *pSPI)
{
pSPI->C1 &= ~SPI_C1_SPIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 设置SPI为主机模式.
*
* @param[in] pSPI 指向SPI模块
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_SetMasterMode(SPI_Type *pSPI)
{
pSPI->C1 |= SPI_C1_MSTR_MASK;
}
/*****************************************************************************//*!
*
* @brief 设置SPI为从机模式.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_SetSlaveMode(SPI_Type *pSPI)
{
pSPI->C1 &= ~SPI_C1_MSTR_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能SPI发送中断.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_TxIntEnable(SPI_Type *pSPI)
{
pSPI->C1 |= SPI_C1_SPTIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用SPI发送中断.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
__STATIC_INLINE void SPI_TxIntDisable(SPI_Type *pSPI)
{
pSPI->C1 &= ~SPI_C1_SPTIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能从机选择输出.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_SSOutputEnable(SPI_Type *pSPI )
{
pSPI->C1 |= SPI_C1_SSOE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用从机选择输出.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_SSOutputDisable(SPI_Type *pSPI )
{
pSPI->C1 &= ~SPI_C1_SSOE_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能SPI匹配中断.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_MatchIntEnable(SPI_Type *pSPI )
{
pSPI->C2 |= SPI_C2_SPMIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用SPI匹配中断.
*
* @param[in] pSPI 指向SPI模块
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_MatchIntDisable(SPI_Type *pSPI )
{
pSPI->C2 &= ~SPI_C2_SPMIE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用主机模式错误功能
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_ModfDisable(SPI_Type *pSPI )
{
pSPI->C2 &= ~SPI_C2_MODFEN_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能主机模式模式错误功能.
*
* @param[in] pSPI 指向SPI模块
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_ModfEnable(SPI_Type *pSPI )
{
pSPI->C2 |= SPI_C2_MODFEN_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能双向模式输出.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_BidirOutEnable(SPI_Type *pSPI )
{
pSPI->C2 |= SPI_C2_BIDIROE_MASK;
}
/*****************************************************************************//*!
*
* @brief 禁用双向模式输出
*
* @param[in] pSPI 指向SPI模块
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_BidirOutDisable(SPI_Type *pSPI )
{
pSPI->C2 &= ~SPI_C2_BIDIROE_MASK;
}
/*****************************************************************************//*!
*
* @brief SPI时钟在等待模式下一直运行
*
* @param[in] pSPI 指向SPI模块 .
*
* @return none.
*
*****************************************************************************/
__STATIC_INLINE void SPI_ClockStopDisable(SPI_Type *pSPI )
{
pSPI->C2 &= ~SPI_C2_SPISWAI_MASK;
}
/*****************************************************************************//*!
*
* @brief SPI时钟在等待模式下关闭
*
* @param[in] pSPI 指向SPI模块
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_ClockStopEnable(SPI_Type *pSPI )
{
pSPI->C2 |= SPI_C2_SPISWAI_MASK;
}
/*****************************************************************************//*!
*
* @brief 使能双向引脚配置.
*
* @param[in] pSPI 指向SPI模块
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_BidirPinEnable(SPI_Type *pSPI)
{
pSPI->C2 |= SPI_C2_SPC0_MASK;
}
/*****************************************************************************//*!
*
* @brief SPI使用独立的引脚用作数据的输入输出.
*
* @param[in] pSPI 指向SPI模块
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_BidirPinDisable(SPI_Type *pSPI)
{
pSPI->C2 &= ~SPI_C2_SPC0_MASK;
}
/*****************************************************************************//*!
*
* @brief 读取接收数据缓冲区满标准位.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return TRUE or FALSE.
*
*****************************************************************************/
__STATIC_INLINE uint8_t SPI_IsSPRF(SPI_Type *pSPI )
{
return(pSPI->S & SPI_S_SPRF_MASK);
}
/*****************************************************************************//*!
*
* @brief 读取SPI匹配标志位
*
* @param[in] pSPI 指向SPI模块 .
*
* @return TRUE or FALSE.
*
*****************************************************************************/
__STATIC_INLINE uint8_t SPI_IsSPMF(SPI_Type *pSPI )
{
return(pSPI->S & SPI_S_SPMF_MASK);
}
/*****************************************************************************//*!
*
* @brief 读取SPI发送数据缓冲区空标志位.
*
* @param[in] pSPI 指向SPI模块 .
*
* @return TRUE or FALSE.
*
*****************************************************************************/
__STATIC_INLINE uint8_t SPI_IsSPTEF(SPI_Type *pSPI )
{
return(pSPI->S & SPI_S_SPTEF_MASK);
}
/*****************************************************************************//*!
*
* @brief 读取主机模式错误标志位
*
* @param[in] pSPI 指向SPI模块
*
* @return TRUE or FALSE.
*
*****************************************************************************/
__STATIC_INLINE uint8_t SPI_IsMODF(SPI_Type *pSPI )
{
return(pSPI->S & SPI_S_MODF_MASK);
}
/*****************************************************************************//*!
*
* @brief 读取SPI数据寄存器.
*
* @param[in] pSPI 指向SPI模块
*
* @return 数据寄存器的值
*
*****************************************************************************/
__STATIC_INLINE uint8_t SPI_ReadDataReg(SPI_Type *pSPI )
{
return pSPI->D;
}
/*****************************************************************************//*!
*
* @brief 写数据到SPI数据寄存器.
*
* @param[in] pSPI 指向SPI模块
* @param[in] u8WrBuff 写到SPI数据寄存器的数据缓冲区
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_WriteDataReg(SPI_Type *pSPI, uint8_t u8WrBuff )
{
pSPI->D = u8WrBuff;
}
/*****************************************************************************//*!
*
* @brief 写数据到SPI匹配寄存器.
*
* @param[in] pSPI 指向SPI模块
* @param[in] u8WrBuff 写到SPI匹配寄存器的数据缓冲区
*
* @return none
*
*****************************************************************************/
__STATIC_INLINE void SPI_WriteMatchValue(SPI_Type *pSPI, uint8_t u8WrBuff )
{
pSPI->M = u8WrBuff;
}
/******************************************************************************/
void SPI_Enable(SPI_Type *pSPI);
void SPI_Disable(SPI_Type *pSPI);
void SPI_SetLSBFirst(SPI_Type *pSPI);
void SPI_SetMSBFirst(SPI_Type *pSPI);
void SPI_IntEnable(SPI_Type *pSPI);
void SPI_IntDisable(SPI_Type *pSPI);
void SPI_SetMasterMode(SPI_Type *pSPI);
void SPI_SetSlaveMode(SPI_Type *pSPI);
void SPI_TxIntEnable(SPI_Type *pSPI);
void SPI_TxIntDisable(SPI_Type *pSPI);
void SPI_SSOutputEnable(SPI_Type *pSPI );
void SPI_SSOutputDisable(SPI_Type *pSPI );
void SPI_MatchIntEnable(SPI_Type *pSPI );
void SPI_MatchIntDisable(SPI_Type *pSPI );
void SPI_ModfDisable(SPI_Type *pSPI );
void SPI_ModfEnable(SPI_Type *pSPI );
void SPI_BidirOutEnable(SPI_Type *pSPI );
void SPI_BidirOutDisable(SPI_Type *pSPI );
void SPI_ClockStopDisable(SPI_Type *pSPI );
void SPI_ClockStopEnable(SPI_Type *pSPI );
void SPI_BidirPinEnable(SPI_Type *pSPI );
void SPI_BidirPinDisable(SPI_Type *pSPI );
void SPI_SetClockPol(SPI_Type *pSPI,uint8_t u8PolLow);
void SPI_SetClockPhase(SPI_Type *pSPI,uint8_t u8Phase);
void SPI_SetBaudRate(SPI_Type *pSPI,uint32_t u32BusClock,uint32_t u32Bps );
uint8_t SPI_IsSPRF(SPI_Type *pSPI );
uint8_t SPI_IsSPMF(SPI_Type *pSPI );
uint8_t SPI_IsSPTEF(SPI_Type *pSPI );
uint8_t SPI_IsMODF(SPI_Type *pSPI );
uint8_t SPI_ReadDataReg(SPI_Type *pSPI );
void SPI_WriteDataReg(SPI_Type *pSPI, uint8_t u8WrBuff );
void SPI_WriteMatchValue(SPI_Type *pSPI, uint8_t u8WrBuff );
void SPI_Init(SPI_Type *pSPI, SPI_ConfigType *pConfig);
void SPI_DeInit(SPI_Type *pSPI);
ResultType SPI_TransferWait(SPI_Type *pSPI, SPI_WidthType* pRdBuff, SPI_WidthType *pWrBuff,uint32 uiLength);
void SPI_SetCallback(SPI_Type *pSPI,SPI_CallbackType pfnCallback);
#ifdef __cplusplus
}
#endif
#endif