#include "SWM221.h"

#define PIN_CS		PIN2
#define PIN_CLK		PIN3
#define PIN_MOSI	PIN4
#define PIN_MISO	PIN5


void IOSPI_Init(void)	// Mode: 3
{
	GPIO_Init(GPIOA, PIN_CS,   1, 0, 0, 0);
	GPIO_Init(GPIOA, PIN_CLK,  1, 0, 0, 0);
	GPIO_Init(GPIOA, PIN_MOSI, 1, 0, 0, 0);
	GPIO_Init(GPIOA, PIN_MISO, 0, 1, 0, 0);
	
	GPIO_SetBit(GPIOA, PIN_CS);
	GPIO_SetBit(GPIOA, PIN_CLK);
}

void IOSPI_CS_Low(void)
{
	GPIO_ClrBit(GPIOA, PIN_CS);
}

void IOSPI_CS_High(void)
{
	GPIO_SetBit(GPIOA, PIN_CS);
}

static void delay(uint32_t us)
{
	uint32_t i;
	
	for(i = 0; i < CyclesPerUs / 4 * us; i++) __NOP();
}

uint32_t IOSPI_ReadWrite(uint32_t data, uint32_t len)
{
	uint32_t i;
	uint32_t recv = 0;
	
	for(i = 0; i < len; i++)
	{
		GPIO_ClrBit(GPIOA, PIN_CLK);
		if(data & (1 << (len - 1 - i)))
			GPIO_SetBit(GPIOA, PIN_MOSI);
		else
			GPIO_ClrBit(GPIOA, PIN_MOSI);
		
		delay(5);
		
		GPIO_SetBit(GPIOA, PIN_CLK);
		if(GPIO_GetBit(GPIOA, PIN_MISO))
			recv |= (1 << (len - 1 - i));
		
		delay(5);
	}
	
	return recv;
}
