You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1004 B
C

#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;
}