/************************************************ ******************************
文 件 名:YGV642_SPI.c
功能描述:YGV642的模拟SPI通信驱动库文件
作    者:张暄
版    本:V1.0
日    期:2017.4.8
******************************************************************************/
#include "YGV642_SPI.h"

/******************************************************************************
函数名:YGV642_SPI_Byte_Write
功  能:通过模拟SPI总线向YGV642发送1字节数据
参  数:Data:要发送的数据
返回值:无
******************************************************************************/
void YGV642_SPI_Byte_Write(uint8_t Data)
{
  uint8_t i;

  for(i = 0; i < 8; i++)
  {
    YGV642_SPI_SCLK_Low();

    if(Data & 0x01)
      YGV642_SPI_MOSI_High();
    else
      YGV642_SPI_MOSI_Low();

    YGV642_SPI_SCLK_High();

    Data >>= 1;
  }
}

/******************************************************************************
函数名:YGV642_SPI_Byte_Read
功  能:通过模拟SPI总线从YGV642读取1字节数据
参  数:无
返回值:读取到的数据
******************************************************************************/
uint8_t YGV642_SPI_Byte_Read(void)
{
  uint8_t   i;
  uint8_t   Data;

  Data  = 0;

  for(i = 0; i < 8; i++)
  {
    YGV642_SPI_SCLK_Low();

    Data >>= 1;

    if(YGV642_SPI_Read_MISO())
      Data |= 0x80;

    YGV642_SPI_SCLK_High();
  }

  return Data;
}

/******************************************************************************
函数名:YGV642_SPI_Word_Write
功  能:通过模拟SPI总线向YGV642发送1个字(16bit)的数据
参  数:Data:要发送的数据
返回值:无
******************************************************************************/
void YGV642_SPI_Word_Write(uint16_t Data)
{
  uint8_t i;

  for(i = 0; i < 16; i++)
  {
    YGV642_SPI_SCLK_Low();

    if(Data & 0x0001)
      YGV642_SPI_MOSI_High();
    else
      YGV642_SPI_MOSI_Low();

    YGV642_SPI_SCLK_High();

    Data >>= 1;
  }
}

/******************************************************************************
函数名:YGV642_SPI_Word_Read
功  能:通过模拟SPI总线从YGV642读取1个字(16bit)的数据
参  数:无
返回值:读取到的数据
******************************************************************************/
uint16_t YGV642_SPI_Word_Read(void)
{
  uint8_t   i;
  uint16_t  Data;

  Data  = 0;

  for(i = 0; i < 16; i++)
  {
    YGV642_SPI_SCLK_Low();

    Data >>= 1;

    if(YGV642_SPI_Read_MISO())
      Data |= 0x8000;

    YGV642_SPI_SCLK_High();
  }

  return Data;
}