/**********************
* SPI.c
***************************/
#include <stm32f10x.h>
#include "spi.h"
#include "delay.h"
#define SPI_DELAY_TIME_US 10
#define SPI_
// GPIOD_0 GPIOD_1 GPIOD_2 GPIOD_3 GPIOD_4 GPIOD_5
// SCLK SDIO SDI SDIO_I EK(intr6) test
#define SPI_CLK_H {GPIO_SetBits(GPIOD,GPIO_Pin_0);}
#define SPI_CLK_L {GPIO_ResetBits(GPIOD,GPIO_Pin_0);}
#define SPI_SDIO_H {GPIO_SetBits(GPIOD,GPIO_Pin_1);} //DO
#define SPI_SDIO_L {GPIO_ResetBits(GPIOD,GPIO_Pin_1);}
#define SPI_SDIO_OUT SetSdioOutput();
#define SPI_SDIO_IN SetSdioIutput();
#define SPI_SDIO_GET GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)
#define SDI_H GPIO_SetBits(GPIOD,GPIO_Pin_2); //DI
#define SDI_L GPIO_ResetBits(GPIOD,GPIO_Pin_2);
#define SDI_OUT SetSdiOutput();
#define SDI_IN SetSdiIutput();
#define TEST_GPIOD5_H GPIO_SetBits(GPIOD,GPIO_Pin_5)
#define TEST_GPIOD5_L GPIO_ResetBits(GPIOD,GPIO_Pin_5)
typedef unsigned char BYTE;
GPIO_InitTypeDef GPIO_InitStructure55;
//BYTE flag,rdata;
void CSxxxxSpiGPioInit(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure55.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2 |GPIO_Pin_5;
GPIO_InitStructure55.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure55.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure55);
}
//set SPI SDIO output mode
void SetSdioOutput(void)
{
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure55.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure55.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure55.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure55);
//GPIO_SetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_1);
}
//set SPI SDIO input mode
void SetSdioIutput(void)
{
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure55.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure55.GPIO_Speed = GPIO_Speed_RESERVE;
GPIO_InitStructure55.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure55);
}
void SetSdioIIIutput(void)
{
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure55.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure55.GPIO_Speed = GPIO_Speed_RESERVE;
GPIO_InitStructure55.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure55);
}
//set SPI SDI output mode
void SetSdiOutput(void)
{
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure55.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure55.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure55.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure55);
//GPIO_SetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_1);
}
//set SPI SDI input mode
void SetSdiIutput(void)
{
/* GPIOD Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure55.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure55.GPIO_Speed =GPIO_Speed_RESERVE;
GPIO_InitStructure55.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure55);
}
void csxxxx_CAD(UINT16 addrOrData, UINT8 u8Len) //C: cmd A:address D: data
{
int i = 0;
for(i=0;i<u8Len;i++)
{
SPI_CLK_L;
if( addrOrData & 0x8000)
{
SPI_SDIO_H;
}
else
{
SPI_SDIO_L;
}
SPI_CLK_H;
addrOrData = addrOrData << 1;
}
}
void wirte_0(void)
{
SPI_CLK_L;
SPI_SDIO_L;
SPI_CLK_H;
}
void csxxxx_spi_write(UINT16 addr,UINT16 data1)
{
// UINT8 i;
//UINT8 cmd;
// UINT16 temp;
//cmd = 0x22;
//temp = 0x2200;
SPI_SDIO_OUT;
// SPI_CLK_H;
//CMD
// for(i=0;i<4;i++)
// {
// SPI_CLK_L;
// SPI_SDIO_OUT;
// if(cmd&0x80)
// {
// SPI_SDIO_H;
// }
// else
// {
// SPI_SDIO_L;
// }
//
// SPI_CLK_H;
// cmd = cmd << 1;
// }
csxxxx_CAD(0x2200, 4);
//Timer0_delayus(2);
//0
// SPI_CLK_L;
// SPI_SDIO_L;
// SPI_CLK_H;
wirte_0();
//ADDR
//temp = addr;
// for(i=0;i<16;i++)
// {
// SPI_CLK_L;
//
// if(temp&0x8000)
// {
// SPI_SDIO_H;
// }
// else
// {
// SPI_SDIO_L;
// }
// temp = temp << 1;
// SPI_CLK_H;
// }
csxxxx_CAD(addr, 16); //C: cmd A:address D: data
// Timer0_delayus(1);
//0
// SPI_CLK_L;
// SPI_SDIO_L;
// SPI_CLK_H;
wirte_0();
//0
// SPI_CLK_L;
// SPI_SDIO_L;
// SPI_CLK_H;
// Timer0_delayus(1);
wirte_0();
//DATA
// temp = data1;
// for(i=0;i<16;i++)
// {
// SPI_CLK_L;
// if(temp&0x8000)
// {
// SPI_SDIO_H;
// }
// else
// {
// SPI_SDIO_L;
// }
// temp = temp << 1;
// SPI_CLK_H;
// }
csxxxx_CAD(data1,16);
// Timer0_delayus(1);
//0
// SPI_CLK_L;
// SPI_SDIO_L;
// SPI_CLK_H;
wirte_0();
// SPI_SDIO_IN;
// Timer0_delayus(1);
} //csxxxx_spi_write
UINT16 csxxxx_spi_read(UINT16 addr)
{
UINT8 i;
//UINT8 cmd;
UINT16 temp;
temp = 0x1100;
SPI_SDIO_OUT;
// SPI_CLK_H;
//CMD
// for(i=0;i<4;i++)
// {
// SPI_CLK_L;
//
// if(cmd&0x80)
// {
// SPI_SDIO_H;
// }
// else
// {
// SPI_SDIO_L;
// }
// SPI_CLK_H;
// cmd = cmd << 1;
// }
csxxxx_CAD(temp, 4);
// Timer0_delayus(1);
//0
// SPI_CLK_L;
// SPI_SDIO_L;
// SPI_CLK_H;
wirte_0();
// Timer0_delayus(1);
//ADDR
// temp = addr;
// for(i=0;i<16;i++)
// {
// SPI_CLK_L;
// if(temp&0x8000)
// {
// SPI_SDIO_H;
// }
// else
// {
// SPI_SDIO_L;
// }
// temp = temp << 1;
// SPI_CLK_H;
// }
csxxxx_CAD(addr, 16);
// Timer0_delayus(1);
//0
// SPI_CLK_L;
// SPI_SDIO_L;
// SPI_CLK_H;
wirte_0();
// Timer0_delayus(1);
//0
// SPI_CLK_L;
// SPI_SDIO_L;
// SPI_CLK_H;
wirte_0();
// Timer0_delayus(1);
SPI_SDIO_IN;
// Timer0_delayus(1);
//DATA
temp = 0;
for(i=0;i<16;i++)
{
SPI_CLK_L;
temp = temp << 1;
if(SPI_SDIO_GET == 1)
{
temp = temp | 0x0001;
}
else
{
temp = temp & ~0x0001;
}
SPI_CLK_H;
}
// Timer0_delayus(1);
//0
// SPI_CLK_L;
// SPI_SDIO_L;
// SPI_CLK_H;
wirte_0();
// Timer0_delayus(1);
// SPI_SDIO_IN;
// Timer0_delayus(1);
return temp;
}
评论0