/**
  **********************************************************************************
  * @file    spi_hal.c
  * @author  Product application department
  * @version V1.0
  * @date    2020.02.13
  * @brief   SPI模块HAL层驱动.
  *
  @verbatim
  ===================================================================================
                                  ##### 更新 #####
  ===================================================================================
  [..] 更新时间:
  [..] 更新人:
  [..] 更新内容:
        1. nothing.
  @endverbatim
*/

#include "spi_hal.h"

/*** 全局变量定义 ***************************************************************/
/** @
  * @{volatile
  */
/** @ 
  * @}
  */
/** @ 
  * @{static
  */
/** @ 
  * @}
  */
/*** 常量定义 *******************************************************************/
/** @
  * @{const
  */
/** @ 
  * @}
  */

/*** 函数定义 *******************************************************************/

static HAL_StatusTypeDef DrvStatusToHalStatus(DRV_SPI_StatusTypeDef DrvStatus)
{
    switch(DrvStatus)
    {
        case DRV_SPI_OK:
        {
            return(HAL_OK);
        }

        case DRV_SPI_ERROR:
        {
            return(HAL_ERROR);
        }

        case DRV_SPI_BUSY:
        {
            return(HAL_BUSY);
        }

        case DRV_SPI_TIMEOUT:
        {
            return(HAL_TIMEOUT);
        }
    }
}
/**
  *@brief 恢复SPI_HandleTypeDef结构体指定的SPI模块的管脚、时钟、中断、EDMAC等为默认配置.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)
{

}
/**
  *@brief 初始化SPI_HandleTypeDef结构体指定的SPI模块的管脚、时钟、中断、EDMAC等配置.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{

//    return(HAL_OK);
}
/**
  *@brief 恢复SPI模块到初始状态.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi)
{
    hspi->State = HAL_SPI_STATE_BUSY;

    /**/
    DRV_SPI_DeInit(hspi->Instance);

    hspi->pRxBuf = NULL;
    hspi->RxCnt = 0;
    hspi->RxSize = 0;
    hspi->pTxBuf = NULL;
    hspi->TxCnt = 0;
    hspi->TxSize = 0;

    hspi->ErrorCode = HAL_SPI_ERROR_NONE;
    hspi->State = HAL_SPI_STATE_RESET;

    hspi->ErrCallback = NULL;
    hspi->XferCpltCallback = NULL;

    return(HAL_OK);
}
/**
  *@brief 根据SPI_InitTypeDef指定的参数初始化SPI模块,并初始化相关handle..
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
{

    if(hspi->State == HAL_SPI_STATE_RESET)
    {
        HAL_SPI_MspInit(hspi);
    }

    hspi->State = HAL_SPI_STATE_BUSY;

    /**/
    DRV_SPI_Init(hspi->Instance, &hspi->Init);

    hspi->RxCnt = 0;
    hspi->RxSize = 0;
    hspi->TxCnt = 0;
    hspi->TxSize = 0;

    hspi->ErrorCode = HAL_SPI_ERROR_NONE;
    hspi->State = HAL_SPI_STATE_READY;

    return(HAL_OK);
}
/**
  *@brief 查询方式通过指定的SPI端口发送数据.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  @param[in] pData   待发送数据指针;
  @param[in] Size     待发送数据长度;
  @param[in] Timeout 超时时间;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
    DRV_SPI_StatusTypeDef DrvStatus = DRV_SPI_OK;

    if(hspi->State != HAL_SPI_STATE_READY)
    {
        return(HAL_ERROR);
    }

    hspi->State = HAL_SPI_STATE_BUSY_TX;
    hspi->ErrorCode = HAL_SPI_ERROR_NONE;
    hspi->pTxBuf = pData;
    hspi->TxCnt = 0;
    hspi->TxSize = Size;


    hspi->pRxBuf = NULL;
    hspi->RxCnt = 0;
    hspi->RxSize = 0;

    /*是否已经使能*/
    if(_spi_get_en(hspi->Instance) == 0)
    {
        _spi_en(hspi->Instance);
    }

    if(hspi->Init.Mode == SPI_MASTER)
    {
        DRV_SPI_TransmitBytes(hspi->Instance, pData, Size);

        hspi->State = HAL_SPI_STATE_READY;
    }
    else if(hspi->Init.Mode == SPI_SLAVE)
    {
        DrvStatus = DRV_SPI_SlaveTransmitBytes(hspi->Instance, pData, Size, Timeout);

        if(DrvStatus != DRV_SPI_OK)
        {
            return(DrvStatusToHalStatus(DrvStatus));
        }

        hspi->State = HAL_SPI_STATE_READY;
    }

    return(HAL_OK);
}
/**
  *@brief 查询方式读取指定的SPI端口数据.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  @param[in] pData   待接收数据指针;
  @param[in] Size    待接收数据长度;
  @param[in] Timeout 超时时间;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
    DRV_SPI_StatusTypeDef DrvStatus = DRV_SPI_OK;

    if(hspi->State != HAL_SPI_STATE_READY)
    {
        return(HAL_ERROR);
    }

    hspi->State = HAL_SPI_STATE_BUSY_RX;
    hspi->ErrorCode = HAL_SPI_ERROR_NONE;
    hspi->pTxBuf = NULL;
    hspi->TxCnt = 0;
    hspi->TxSize = 0;

    hspi->pRxBuf = pData;
    hspi->RxCnt = 0;
    hspi->RxSize = Size;

    /*是否已经使能*/
    if(_spi_get_en(hspi->Instance) == 0)
    {
        _spi_en(hspi->Instance);
    }

    if(hspi->Init.Mode == SPI_MASTER)
    {
        DRV_SPI_ReceiveBytes(hspi->Instance, pData, Size);
        hspi->State = HAL_SPI_STATE_READY;
    }
    else if(hspi->Init.Mode == SPI_SLAVE)
    {
    	_spi_clr_rx_fifo(hspi->Instance);
        DrvStatus = DRV_SPI_SlaveReceiveBytes(hspi->Instance, pData, Size, Timeout);

        if(DrvStatus != DRV_SPI_OK)
        {
            return(DrvStatusToHalStatus(DrvStatus));
        }

        hspi->State = HAL_SPI_STATE_READY;
    }

    return(HAL_OK);
}
/**
  *@brief 查循方式收发数据.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  @param[in] pTxData 待发送数据指针;
  @param[in] pRxData 待接收数据指针;
  @param[in] Size     数据长度;
  @param[in] Timeout 超时时间;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
{
    HAL_StatusTypeDef HalStatus = HAL_OK;

    HalStatus = HAL_SPI_Transmit(hspi, pTxData, Size, Timeout);

    if(HalStatus != HAL_OK)
    {
        return(HalStatus);
    }

    /*发送之后读取*/
    HalStatus = HAL_SPI_Receive(hspi, pRxData, Size, Timeout);

    if(HalStatus != HAL_OK)
    {
        return(HalStatus);
    }

    return(HAL_OK);
}
/**
  *@brief 中断方式通过指定的SPI端口发送数据.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  @param[in] pData   待发送数据指针;
  @param[in] Size     待发送数据长度;
  @retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SPI_TransmitIT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
    DRV_SPI_StatusTypeDef DrvStatus = DRV_SPI_OK;

    if(hspi->State != HAL_SPI_STATE_READY)
    {
        return(HAL_ERROR);
    }

    hspi->State = HAL_SPI_STATE_BUSY_TX;
    hspi->ErrorCode = HAL_SPI_ERROR_NONE;
    hspi->pTxBuf = pData;
    hspi->TxCnt = 0;
    hspi->TxSize = Size;

    hspi->pRxBuf = NULL;
    hspi->RxCnt = 0;
    hspi->RxSize = 0;

    /*是否已经使能*/
    if(_spi_get_en(hspi->Instance) == 0)
    {
        _spi_en(hspi->Instance);
    }

    /*第一个字节*/
    DRV_SPI_SetDR(hspi->Instance,*pData);

    /*使能SPI的中断*/
    _spi_en_it(hspi->Instance);

    /*后续的数据在ISR中处理*/
    return(HAL_OK);
}
/**
  *@brief 中断方式读取指定的SPI端口数据.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  @param[in] pData   待接收数据指针;
  @param[in] Size    待接收数据长度;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SPI_ReceiveIT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
    DRV_SPI_StatusTypeDef DrvStatus = DRV_SPI_OK;

    if(hspi->State != HAL_SPI_STATE_READY)
    {
        return(HAL_ERROR);
    }

    hspi->State = HAL_SPI_STATE_BUSY_RX;
    hspi->ErrorCode = HAL_SPI_ERROR_NONE;
    hspi->pTxBuf = NULL;
    hspi->TxCnt = 0;
    hspi->TxSize = 0;

    hspi->pRxBuf = pData;
    hspi->RxCnt = 0;
    hspi->RxSize = Size;

    /*是否已经使能*/
    if(_spi_get_en(hspi->Instance) == 0)
    {
        _spi_en(hspi->Instance);
    }

    _spi_en_it(hspi->Instance);

    return(HAL_OK);
}
/**
  *@brief EDMAC方式通过指定的SPI端口发送数据.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  @param[in] pedmac EDMAC指针:可取
  *- EDMAC0;
  *- EDMAC1;
  @param[in] pData   待发送数据指针;
  @param[in] Size     待发送数据长度;
  @param[in] Timeout 超时时间;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SPI_TransmitEDMAC(SPI_HandleTypeDef *hspi, EDMAC_TypeDef *pemdac, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
    return(HAL_OK);
}
/**
  *@brief EDMAC方式通过指定的SPI端口发送数据.
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  @param[in] pedmac EDMAC指针:可取
  *- EDMAC0;
  *- EDMAC1;
  @param[in] pData   待接收数据指针;
  @param[in] Size    待接收数据长度;
  @param[in] Timeout 超时时间;
  *@retval @ref HAL_StatusTypeDef
  *@pre SPI已初始化\EDMAC配置完毕.
  */
HAL_StatusTypeDef HAL_SPI_ReceiveEDMAC(SPI_HandleTypeDef *hspi, EDMAC_TypeDef *pemdac, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{

    return(HAL_OK);
}
__weak void HAL_SPI_IRQ(SPI_HandleTypeDef *hspi)
{
	/*如果中断源是SPIF且使能了中断*/
    if(_spi_get_flag_finish(hspi->Instance))
    {
		if(_spi_get_it(hspi->Instance))
		{
			/*接收还是发送查式*/
			if(hspi->State == HAL_SPI_STATE_BUSY_TX)
			{
				if(hspi->TxIsrCallback)
				{
					hspi->TxIsrCallback((void*)hspi);
				}
				else
				{
				    hspi->TxCnt++;
					if(hspi->TxCnt == hspi->TxSize)
					{
						/*发送完毕*/
						_spi_dis_it(hspi->Instance);
						hspi->State = HAL_SPI_STATE_READY;
					}
					else
					{
						/*发送下一个数据*/
						DRV_SPI_SetDR(hspi->Instance,hspi->pTxBuf[hspi->TxCnt]);
					}
				}
				
			}
			else
			{
				/*接收模式*/
				if(hspi->RxIsrCallback)
				{
					hspi->RxIsrCallback((void*)hspi);
				}
				else
				{

				}
			}
		}
	}
}
HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef * hspi,uint8_t CallbackID,HAL_SPI_CALLBACK CallbackISRFun)
{
	switch(CallbackID)
	{
		case SPI_CALLBACK_ID_TXISR:
		{
			hspi->TxIsrCallback = CallbackISRFun;
			break;
		}
		case SPI_CALLBACK_ID_RXISR:
		{
			hspi->RxIsrCallback = CallbackISRFun;
			break;
		}
		default:
		{
			return(HAL_ERROR);
		}
	}

	return(HAL_OK);
}
/**
  *@brief 获取当前状态.
  *
  *@param[in] hspi 指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@retval 当前状态 @ref HAL_SPI_StateTypeDef
  */
HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi)
{
	return(hspi->State);
}
/**
  *@brief 获取当前错误码.
  *
  *@param[in] hspi 指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@retval 错误码
  */
uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi)
{
	return(hspi->ErrorCode);
}
/**
  *@brief 获取标志状态.
  *
  *@param[in]  hspi 指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@param[in]  FlagIndex SPI标志索引;
  	*- SPI_FLAG_INDEX_RXFEMP
	*- SPI_FLAG_INDEX_RXFFULL
	*- SPI_FLAG_INDEX_XFEMP
	*- SPI_FLAG_INDEX_TXFFFUL
	*- SPI_FLAG_INDEX_MODE
	*- SPI_FLAG_INDEX_EOTF
	*- SPI_FLAG_INDEX_FLOST
	*- SPI_FLAG_INDEX_SPIF
	*- SPI_FLAG_INDEX_RXFSER
	*- SPI_FLAG_INDEX_RXFUDF
	*- SPI_FLAG_INDEX_RXFOVFM
	*- SPI_FLAG_INDEX_RXFTO
	*- SPI_FLAG_INDEX_TXFSER
	*- SPI_FLAG_INDEX_TXFUDF
	*- SPI_FLAG_INDEX_TXFOVFM
	*- SPI_FLAG_INDEX_TXFTO 
  *@param[out] pflag 标志状态指针;
  *@retval 当前状态 @ref HAL_SPI_StateTypeDef
  */
HAL_StatusTypeDef HAL_SPI_GetFlag(SPI_HandleTypeDef *hspi,SPI_FlagIndexTypeDef FlagIndex,uint8_t*pflag)
{
	DRV_SPI_StatusTypeDef DrvStatus;
	HAL_StatusTypeDef HalStatus;

	DrvStatus = DRV_SPI_GetFlag(hspi->Instance,FlagIndex,pflag);

	if(DrvStatus!=DRV_SPI_OK)
	{
		return(DrvStatusToHalStatus(DrvStatus));
	}

	return(HAL_OK);
}
/**
  *@brief 清除标志状态.
  *
  *@param[in]  hspi 指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@param[in]  FlagIndex SPI标志索引;
  	*- SPI_FLAG_INDEX_RXFEMP
	*- SPI_FLAG_INDEX_RXFFULL
	*- SPI_FLAG_INDEX_XFEMP
	*- SPI_FLAG_INDEX_TXFFFUL
	*- SPI_FLAG_INDEX_MODE
	*- SPI_FLAG_INDEX_EOTF
	*- SPI_FLAG_INDEX_FLOST
	*- SPI_FLAG_INDEX_SPIF
	*- SPI_FLAG_INDEX_RXFSER
	*- SPI_FLAG_INDEX_RXFUDF
	*- SPI_FLAG_INDEX_RXFOVFM
	*- SPI_FLAG_INDEX_RXFTO
	*- SPI_FLAG_INDEX_TXFSER
	*- SPI_FLAG_INDEX_TXFUDF
	*- SPI_FLAG_INDEX_TXFOVFM
	*- SPI_FLAG_INDEX_TXFTO 
  *@retval 当前状态 @ref HAL_SPI_StateTypeDef
  */
HAL_StatusTypeDef HAL_SPI_ClrFlag(SPI_HandleTypeDef *hspi,SPI_FlagIndexTypeDef FlagIndex)
{
	DRV_SPI_StatusTypeDef DrvStatus;
	HAL_StatusTypeDef HalStatus;

	DrvStatus = DRV_SPI_ClrFlag(hspi->Instance,FlagIndex);

	if(DrvStatus!=DRV_SPI_OK)
	{
		return(DrvStatusToHalStatus(DrvStatus));
	}

	return(HAL_OK);
}
/**
  *@brief 获取标志状态.
  *
  *@param[in]  hspi 指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@param[in]  FlagIndex SPI标志索引;
  	*- SPI_FLAG_INDEX_RXFEMP
	*- SPI_FLAG_INDEX_RXFFULL
	*- SPI_FLAG_INDEX_XFEMP
	*- SPI_FLAG_INDEX_TXFFFUL
	*- SPI_FLAG_INDEX_MODE
	*- SPI_FLAG_INDEX_EOTF
	*- SPI_FLAG_INDEX_FLOST
	*- SPI_FLAG_INDEX_SPIF
	*- SPI_FLAG_INDEX_RXFSER
	*- SPI_FLAG_INDEX_RXFUDF
	*- SPI_FLAG_INDEX_RXFOVFM
	*- SPI_FLAG_INDEX_RXFTO
	*- SPI_FLAG_INDEX_TXFSER
	*- SPI_FLAG_INDEX_TXFUDF
	*- SPI_FLAG_INDEX_TXFOVFM
	*- SPI_FLAG_INDEX_TXFTO 
  *@param[out] staus 标志状态
  *- SET;
  *- REST;
  @param[in] timeout 超时时间;
  *@retval 当前状态 @ref HAL_SPI_StateTypeDef
  */
HAL_StatusTypeDef  HAL_SPI_WaitonFlagTimeout(SPI_HandleTypeDef *hspi,
                                            SPI_FlagIndexTypeDef index,
                                            FlagStatusTypeDef status,
                                            uint32_t timeout)
{
	DRV_SPI_StatusTypeDef DrvStatus;
	HAL_StatusTypeDef HalStatus;

	DrvStatus = DRV_SPI_WaitonFlagTimeout(hspi->Instance,
		                                  index,
		                                  status,
		                                  timeout);

	if(DrvStatus!=DRV_SPI_OK)
	{
		return(DrvStatusToHalStatus(DrvStatus));
	}

	return(HAL_OK);
}
/**
  *@brief 使能spi
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_En(SPI_HandleTypeDef *hspi)
{
	_spi_en(hspi->Instance);
}
/**
  *@brief 禁止spi
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_Dis(SPI_HandleTypeDef *hspi)
{
	_spi_dis(hspi->Instance);
}
/**
  *@brief 清除RXFIFO。
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_ClrRxFifo(SPI_HandleTypeDef *hspi)
{
	_spi_clr_rx_fifo(hspi->Instance);
}
/**
  *@brief 清除TXFIFO。
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_ClrTxFifo(SPI_HandleTypeDef *hspi)
{
	_spi_clr_tx_fifo(hspi->Instance);
}
/**
  *@brief 使能spi
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_EnIt(SPI_HandleTypeDef *hspi)
{
	_spi_en_it(hspi->Instance);
}
/**
  *@brief 禁止spi
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_DisIt(SPI_HandleTypeDef *hspi)
{
	_spi_dis_it(hspi->Instance);
}
/**
  *@brief 使能spi RX DMA
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_EnRxDma(SPI_HandleTypeDef *hspi)
{
	_spi_en_rx_dma(hspi->Instance);
}
/**
  *@brief 禁止spi RX DMA
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_DisRxDma(SPI_HandleTypeDef *hspi)
{
	_spi_dis_rx_dma(hspi->Instance);
}
/**
  *@brief 使能spi TX DMA
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_EnTxDma(SPI_HandleTypeDef *hspi)
{
	_spi_en_tx_dma(hspi->Instance);
}
/**
  *@brief 禁止spi TX DMA
  *
  @param[in] hspi  指向SPI_HandleTypeDef结构体的指针;
  @return 无
  */
void  HAL_SPI_DisTxDma(SPI_HandleTypeDef *hspi)
{
	_spi_dis_tx_dma(hspi->Instance);
}
/**
  *@brief 初始化SPI_TypeDef指定的SPI的管脚作为GPIO功.
  *
  *@param[in] pspi   指向SPI_TypeDef结构体的指针;
  *@param[in] GPIO_Init  GPIO_Init 指向GPIO_InitTypeDef结构体的指针;
  *@retval
  */
void  HAL_SPI_GPIOInit(SPI_TypeDef  *pspi, GPIO_InitTypeDef *GPIO_Init)
{
    DRV_SPI_GPIOInit(pspi, &GPIO_Init);
}
/**
  *@brief 复位SPI_TypeDef指定的SPI的管脚功能为默认;.

  *@param[in] pspi   指向SPI_TypeDef结构体的指针;
  *@param[in] Pin SPI具体管脚;
  *- SPI_PIN_CS;
  *- SPI_PIN_CLK;
  *- SPI_PIN_MISO;
  *- SPI_PIN_MOSI;
  *@retval
  */
void  HAL_SPI_GPIODeInit(SPI_TypeDef  *pspi, uint16_t Pin)
{
    DRV_SPI_GPIODeInit(pspi, Pin);
}
/**
  *@brief 读取pin指定的SPI的管脚当电平.
  *
  *@param[in] pspi 指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@param[in] pin  SPI具体管脚;
  *- SPI_PIN_CS;
  *- SPI_PIN_CLK;
  *- SPI_PIN_MOSI;
  *- SPI_PIN_MISO;
  *@retval @ref GPIO_PinStateTypeDef
  */
GPIO_PinStateTypeDef HAL_SPI_GPIOReadPin(SPI_TypeDef *pspi, uint16_t Pin)
{
    return(DRV_SPI_ReadPin(pspi, Pin));
}
/**
  *@brief pin指定的SPI的管脚输出PinState指定电平.
  *
  *@param[in] pspi 指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@param[in] pin SPI具体管脚;
  *- SPI_PIN_CS;
  *- SPI_PIN_CLK;
  *- SPI_PIN_MOSI;
  *- SPI_PIN_MISO;
  *@param[in]PinState
  *- HAL_BIT_SET;
  *- HAL_BIT_RESET;
  *@retval 无
  */
void HAL_SPI_GPIOWritePin(SPI_TypeDef *pspi, uint16_t Pin, GPIO_PinStateTypeDef PinState)
{
    DRV_SPI_WritePin(pspi, Pin, PinState);
}
/**
  *@brief 翻转pin指定的SPI的管脚电平.
  *
  *@param[in] pspi 指向SPI_HandleTypeDef结构体的指针,此结构体包含了SPI模块的配置信息;
  *@param[in] pin  SPI具体管脚;
  *- SPI_PIN_CS;
  *- SPI_PIN_CLK;
  *- SPI_PIN_MOSI;
  *- SPI_PIN_MISO;
  *@retval 无
  */
void HAL_SPI_GPIOTogglePin(SPI_TypeDef *pspi, uint16_t Pin)
{
    DRV_SPI_TogglePin(pspi, Pin);
}

void HAL_SPI_Disable(SPI_TypeDef *pspi)
{
    _spi_dis(pspi);
}
