#include "user_imitate_spi.h"
#include "cpu_gpio.h"

imitate_spi_gpio_t imitate_spi_gpio;
/*Analog clk,sda pin output input initaialization*/
void imitate_spi_gpio_init(imitate_spi_gpio_t gpio)
{
	imitate_spi_gpio = gpio;
	gpio_imitatespi_init();
}

void gpio_config_read(void)
{
	gpio_remap_config(imitate_spi_gpio.spi_mosi_pin, GPIO_Remap_GPIO);
	gpio_init(imitate_spi_gpio.spi_mosi_pin, GPIO_Mode_Input_Pull_Down_Resistor);
}

void gpio_config_write(void)
{
	gpio_remap_config(imitate_spi_gpio.spi_mosi_pin, GPIO_Remap_GPIO);
	gpio_init(imitate_spi_gpio.spi_mosi_pin, GPIO_Mode_Output);
}

void gpio_imitatespi_init(void)
{
	gpio_remap_config(imitate_spi_gpio.spi_mosi_pin, GPIO_Remap_GPIO);
	gpio_init(imitate_spi_gpio.spi_mosi_pin, GPIO_Mode_Output);  
    	
	gpio_remap_config(imitate_spi_gpio.spi_scl_pin,  GPIO_Remap_GPIO);
	gpio_init(imitate_spi_gpio.spi_scl_pin, GPIO_Mode_Output);  
}

void gpio_set_sclk(int value)
{
	if(value==1)
	{
		gpio_set(imitate_spi_gpio.spi_scl_pin);
	}
	else if(value == 0)
	{		
		gpio_reset(imitate_spi_gpio.spi_scl_pin);
    }
}

void gpio_set_mosi(int value)
{
	if(value==1)
	{
		gpio_set(imitate_spi_gpio.spi_mosi_pin);
	}
	else if(value == 0)
	{
		gpio_reset(imitate_spi_gpio.spi_mosi_pin);
	}
}
unsigned char spi_read_byte(void)
{
	int n;
	unsigned char data = 0;
	gpio_config_read();
	for( n=0;n<8;n++)
	{
		gpio_set_sclk(0);
		if(gpio_get_input(GPIOB_Pin5))
		{
			data |= (0x01 << (7-n));
		}
      
		gpio_set_sclk(1);
	}
	gpio_set_sclk(1);
	return data;
}

void spi_write_byte(unsigned char dat)
{
	int n;
	gpio_config_write();
	for( n=0;n<8;n++)
	{
		gpio_set_sclk(1);
		if(dat&0x80)
		{
			gpio_set_mosi(1);
		}
		else
		{
			gpio_set_mosi(0);
		} 
		dat<<=1;
		gpio_set_sclk(0);
	}
	gpio_set_sclk(1);
}
