/******************************************************************************
;  *   	@MCU				 : MC51F003A4
;  *   	@Create Date         : 2021.10.11
;  *   	@Author/Corporation  : Martin/SinoMCU
;  *   	@晟矽微技术支持QQ 	 : 2048615934
;  *    @晟矽微官网		     : http://www.sinomcu.com/
;  *   	@Copyright           : 2020 SINOMCU Corporation,All Rights Reserved.
;  *----------------------Abstract Description---------------------------------
;  *			         SPI库，调用函数使用，正常情况下不需要修改                                 		
******************************************************************************/

#include "SPI_LIB.h"

/************************************************
;  *    @Function Name       : SPI_Init
;  *    @Description         : 
;  *    @IN_Parameter      	 :  SPI 配置参数
;  *    @Return parameter    :
;  ***********************************************/
void SPI_Init(SPI_InitTypeDef *SPI)
{
    SPCON = REG_CLR;
    SPSTA = REG_CLR;
    SPDAT = REG_CLR;

    SPCON |= SPI->SPI_NSS;
    SPCON |= SPI->SPI_first_bit | SPI->SPI_mode | SPI->SPI_CPHA | SPI->SPI_CPOL | SPI->SPI_clock_division;
    if (SPI->SPI_interrupt == ENABLE) //使能SPI中断
    {
        IP &= ~SPI_IE_ADDR;
        IPH &= ~SPI_IE_ADDR; //中断优先级低
        SPIIE = ENABLE;
        if (SPI->SPI_interrupt_priority == HIGH)
        {
            IP |= SPI_IE_ADDR; //中断优先级高
        }
    }
    else
    {
        SPIIE = DISABLE;
        IP &= ~SPI_IE_ADDR;
        IPH &= ~SPI_IE_ADDR; //中断优先级低
    }
}
/************************************************
;  *    @Function Name       : SPI_Cmd
;  *    @Description         : SPIEN端控制
;  *    @IN_Parameter        :
;  *    @Return parameter    :
;  ***********************************************/
void SPI_Cmd(uint8_t newstate)
{
    if (newstate == ENABLE)
        SPSTA |= SPI_EN;
    else
        SPSTA &= ~SPI_EN;
}

/************************************************
;  *    @Function Name       : SPI_Get_FlagStatus
;  *    @Description         : 获取状态
;  *    @IN_Parameter        :  SPI_FLAG_DATA_COMPLETION 数据传送完成
                                SPI_FLAG_MODE_FAOLURE    模式故障
                                SPI_FLAG_WRITE_CONFLICT  写冲突
                                SPI_FLAG_RECEIV_OVERRUN  接收超限
;  *    @Return parameter    :
;  ***********************************************/
flagstatus SPI_Get_FlagStatus(uint8_t SPI_flag)
{
    flagstatus bitstatus = RESET;
    if ((SPSTA & SPI_flag) != (uint8_t)RESET)
    {
        bitstatus = SET;
    }
    else
    {
        bitstatus = RESET;
    }
    return bitstatus;
}
/************************************************
;  *    @Function Name       : SPI_Clear_FlagStatus
;  *    @Description         : 清除状态
;  *    @IN_Parameter        :  SPI_FLAG_DATA_COMPLETION 数据传送完成
                                SPI_FLAG_MODE_FAOLURE    模式故障
                                SPI_FLAG_WRITE_CONFLICT  写冲突
                                SPI_FLAG_RECEIV_OVERRUN  接收超限
;  *    @Return parameter    :
;  ***********************************************/
void SPI_Clear_FlagStatus(uint8_t SPI_flag)
{
    SPSTA &= ~SPI_flag;
}
/************************************************
;  *    @Function Name       : SPI_Receive_Data
;  *    @Description         : 接收数据
;  *    @IN_Parameter        :
;  *    @Return parameter    :
;  ***********************************************/
uint8_t SPI_Receive_Data(void)
{
    return SPDAT;
}
/************************************************
;  *    @Function Name       : SPI_Send_Data
;  *    @Description         : 发送数据
;  *    @IN_Parameter        :
;  *    @Return parameter    :
;  ***********************************************/
void SPI_Send_Data(uint8_t dat)
{
    SPDAT = dat;
}

/**************************** end of file *********************************************/
