添加一些关于midi播放的项目

This commit is contained in:
terryLP
2025-03-24 14:30:56 +08:00
parent e31eb22077
commit 498b4ef13b
699 changed files with 186162 additions and 1 deletions
@@ -0,0 +1,297 @@
/**************************************************************************!
* 技术讨论:QQ群 123763203
* 官网 :www.navota.com
*
* @file spi.c
* @brief 串行外设接口模块(SPI)函数库
* @author Navota
* @date 2017-1-1
****************************************************************************/
#include "common.h"
#include "spi.h"
/****************************************************************************!
* @ 存放SPI回调函数接口
****************************************************************************/
SPI_CallbackType SPI_Callback[MAX_SPI_NO] = {(SPI_CallbackType)NULL};
/*****************************************************************************//*!
*
* @brief 初始化SPI模块
*
* @param[in] pSPI 指向SPI模块.
* @param[in] pConfig 指向SPI配置参数.
*
* @return none.
*
*****************************************************************************/
void SPI_Init(SPI_Type *pSPI, SPI_ConfigType *pConfig)
{
#if defined(CPU_NV32M3)
/* sanity check */
ASSERT((pSPI == SPI0));
SIM->SCGC |= SIM_SCGC_SPI0_MASK;
#else
/* sanity check */
ASSERT((pSPI == SPI0) || (pSPI == SPI1));
/*使能SPI模块总线时钟*/
if( pSPI == SPI0)
{
SIM->SCGC |= SIM_SCGC_SPI0_MASK;
}
else
{
SIM->SCGC |= SIM_SCGC_SPI1_MASK;
}
#endif
/*配置SPI控制寄存器 */
if( pConfig->sSettings.bIntEn) //使能SPI中断
{
SPI_IntEnable(pSPI);
#if defined(CPU_NV32M3)
NVIC_EnableIRQ(SPI0_IRQn);
#else
if( pSPI == SPI0 )
{
NVIC_EnableIRQ(SPI0_IRQn);
}
else
{
NVIC_EnableIRQ(SPI1_IRQn);
}
#endif
}
if( pConfig->sSettings.bTxIntEn) //使能SPI发送中断
{
SPI_TxIntEnable(pSPI);
#if defined(CPU_NV32M3)
NVIC_EnableIRQ(SPI0_IRQn);
#else
if( pSPI == SPI0 )
{
NVIC_EnableIRQ(SPI0_IRQn);
}
else
{
NVIC_EnableIRQ(SPI1_IRQn);
}
#endif
}
if( pConfig->sSettings.bMasterMode) //主/从机选择
{
SPI_SetMasterMode(pSPI); //SPI设置为主机模式
}
else
{
SPI_SetSlaveMode(pSPI); //SPI设置为从机模式
}
if( pConfig->sSettings.bClkPolarityLow) //时钟极性配置
{
SPI_SetClockPol(pSPI,1);
}
if( pConfig->sSettings.bClkPhase1) //时钟相位配置
{
SPI_SetClockPhase(pSPI,1);
}
if( pConfig->sSettings.bShiftLSBFirst) //设置SPI串行数据传输开始位
{
SPI_SetLSBFirst(pSPI); // SPI串行数据传输从最低位开始(LSB)
}
if( pConfig->sSettings.bMatchIntEn)
{
SPI_MatchIntEnable(pSPI); //使能SPI匹配中断
}
if( pConfig->sSettings.bModeFaultEn)
{
SPI_ModfEnable(pSPI); //使能主机模式模式错误功能.
}
if( pConfig->sSettings.bMasterAutoDriveSS)
{
/*设置SSOE和MODFEN位,从机模式中SS引脚为从机输出,自动驱动从机SS引脚使能*/
SPI_SSOutputEnable(pSPI);
SPI_ModfEnable(pSPI);
}
if( pConfig->sSettings.bPinAsOuput)
{
SPI_BidirPinEnable(pSPI); //使能双向引脚配置.
}
if( pConfig->sSettings.bBidirectionModeEn)
{
SPI_BidirOutEnable(pSPI); //使能双向模式输出.
}
if( pConfig->sSettings.bStopInWaitMode)
{
SPI_ClockStopEnable(pSPI); //SPI时钟在等待模式下关闭
}
if(pConfig->sSettings.bMasterMode) //设置波特率
{
SPI_SetBaudRate(pSPI,pConfig->u32BusClkHz,pConfig->u32BitRate);
}
/*使能SPI模块*/
if( pConfig->sSettings.bModuleEn)
{
SPI_Enable(pSPI);
}
}
/*****************************************************************************//*!
*
* @brief 设置SPI波特率.
*
* @param[in] pSPI 指向SPI模块
* @param[in] u32BusClock 总线时钟.
* @param[in] u32Bps SPI波特率.
*
* @return none.
*
*****************************************************************************/
void SPI_SetBaudRate(SPI_Type *pSPI,uint32_t u32BusClock,uint32_t u32Bps)
{
uint32_t u32BitRateDivisor;
uint8_t u8Sppr;
uint8_t u8Spr;
uint8_t u8ReadFlag;
u32BitRateDivisor = u32BusClock/u32Bps; /* 计算波特率因子 */
u8ReadFlag = 0;
/* 计算最适合的 SPPR 和 SPR */
for (u8Spr = 0; u8Spr <= 8; u8Spr++)
{
for(u8Sppr = 0; u8Sppr <= 7; u8Sppr++)
{
if((u32BitRateDivisor>>(u8Spr+1))<=(u8Sppr+1))
{
u8ReadFlag = 1;
break;
}
}
if(u8ReadFlag)
{
break;
}
}
if(u8Sppr >=8)
{
u8Sppr = 7;
}
if(u8Spr >8)
{
u8Spr = 8;
}
/* 设置波特率 */
pSPI->BR = SPI_BR_SPPR(u8Sppr) | SPI_BR_SPR(u8Spr);
}
/*****************************************************************************//*!
*
* @brief 读/写数据寄存器.
*
* @param[in] pSPI 指向SPI模块.
* @param[in] pWrBuff -- 发送(写)数组指针
* @param[in] uiLength -- 读/写数据长度.
* @param[out] pRdBuff -- 接收(读)数组指针.
*
* @return if <0, means error, 0: success.
*
*****************************************************************************/
ResultType SPI_TransferWait(SPI_Type *pSPI, SPI_WidthType* pRdBuff, SPI_WidthType *pWrBuff,uint32 uiLength)
{
ResultType err = SPI_ERR_SUCCESS;
uint32_t i;
if(!uiLength)
{
return (err);
}
for(i = 0; i < uiLength; i++)
{
while(!SPI_IsSPTEF(pSPI));
SPI_WriteDataReg(pSPI,pWrBuff[i]);
while(!SPI_IsSPRF(pSPI));
pRdBuff[i] = SPI_ReadDataReg(pSPI);
}
return (err);
}
/*****************************************************************************//*!
*
* @brief 复位SPI模块
*
* @param[in] pSPI 指向SPI模块
*
* @return none.
*
*****************************************************************************/
void SPI_DeInit(SPI_Type *pSPI)
{
int16 i;
pSPI->C1 = SPI_C1_DEFAULT;
pSPI->C2 = SPI_C2_DEFAULT;
pSPI->BR = SPI_BR_DEFAULT;
pSPI->M = SPI_M_DEFAULT;
for(i = 0; i<100; i++); /*延时一段时间,等待SPI退出中断 */
}
/*****************************************************************************//*!
*
* @brief 设置SPI回调函数,在中断服务函数中调用
*
* @param[in] pSPI 指向SPI模块
* @param[in] pfnCallback 回调函数.
*
* @return none.
*
*****************************************************************************/
void SPI_SetCallback(SPI_Type *pSPI,SPI_CallbackType pfnCallback)
{
uint32_t u32Port = ((uint32_t)pSPI-(uint32_t)SPI0)>>12;
ASSERT(u32Port <2);
SPI_Callback[u32Port] = pfnCallback;
}
/*****************************************************************************//*!
*
* @brief SPI0 中断服务函数.
*
* @param none.
* @return none.
*
*****************************************************************************/
void SPI0_Isr(void)
{
if( SPI_Callback[0] )
{
SPI_Callback[0]();
}
}
#ifndef CPU_NV32M3
/*****************************************************************************//*!
*
* @brief SPI1 中断服务函数
*
* @param none.
* @return none.
*
*****************************************************************************/
void SPI1_Isr(void)
{
if( SPI_Callback[1] )
{
SPI_Callback[1]();
}
}
#endif
@@ -0,0 +1,567 @@
/******************************************************************************
*
* @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