#include "stdio.h"
/***************************************************
Mode0:CPOL=0,CPHA=0 常用 空闲SCK=0 数据采样是在上升沿
Mode1:CPOL=0,CPHA=1 空闲SCK=0 数据采样是在下降沿
Mode2:CPOL=1,CPHA=0 空闲SCK=1 数据采集是在下降沿
Mode3:CPOL=1,CPHA=1 常用 空闲SCK=1 数据采样是在上升沿
***************************************************/
/*SPI 配置*/
#define SPI_MODE 0
#define SPI_DELAY 10
#define SPI_CS(x)
#define SPI_SCLK(x)
#define SPI_MOSI(x) //对SDI
#define SPI_MISO() 1 //对SDO
void my_spi_delayus(unsigned int i)
{
/*按照需求填写us级别延时*/
}
void my_spi_GpioInit(void)
{
/*GPIO初始化*/
/*建议上拉模式*/
}
void my_spi_senddata(unsigned char dat)
{
unsigned char i=0;
#if SPI_MODE==0
for(i=0;i<8;i++)
{
SPI_SCLK(0);//空闲是0
if(dat&0x80)//准备好数据
SPI_MOSI(1);
else
SPI_MOSI(0);
dat<<=1;
SPI_SCLK(1);//产生上升沿发送数据
my_spi_delayus(SPI_DELAY);
}
SPI_SCLK(0);
#elif MODE==1 //空闲SCK=0 数据采样是在下降沿
for(i=0;i<8;i++)
{
SPI_SCLK(1);
if(dat&0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
dat<<=1;
SPI_SCLK(0);
my_spi_delayus(SPI_DELAY);
}
#elif MODE==2 //空闲SCK=1 数据采集是在下降沿
for(i=0;i<8;i++)
{
SPI_SCLK(1);
if(dat&0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
dat<<=1;
SPI_SCLK(0);
my_spi_delayus(SPI_DELAY);
}
SPI_SCLK(1);
#elif MODE==3 //常用 空闲SCK=1 数据采样是在上升沿
for(i=0;i<8;i++)
{
my_spi_delayus(SPI_DELAY);
SPI_SCLK(0);
if(dat&0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
dat<<=1;
SPI_SCLK(1);
}
#endif
}
unsigned char my_spi_readdata(void)
{
unsigned char i=0,dat=0;
#if SPI_MODE==0 //空闲SCK=0 数据接收是在下沿
for(i=0;i<8;i++)
{
SPI_SCLK(0);
dat<<=1;
if(SPI_MISO())
dat|=0x01;
else
dat&=0xfe;
SPI_SCLK(1);
my_spi_delayus(SPI_DELAY);
}
SPI_SCLK(0);
return dat;
#elif SPI_MODE==1 //空闲SCK=0 数据接收是上升降沿
for(i=0;i<8;i++)
{
SPI_SCLK(1);
dat<<=1;
if(SPI_MISO())
dat|=0x01;
else
dat&=0xfe;
SPI_SCLK(0);
my_spi_delayus(SPI_DELAY);
}
return dat;
#elif SPI_MODE==2 //空闲SCK=1 数据接收是在上升沿
for(n=0;n<8;n++)
{
SPI_SCLK(1);
dat<<=1;
if(SPI_MISO())
dat|=0x01;
else
dat&=0xfe;
SPI_SCLK(0);
my_spi_delayus(SPI_DELAY);
}
return dat;
#elif SPI_MODE==3 //空闲SCK=1 数据接收是在下降沿
for(n=0;n<8;n++)
{
SPI_SCLK(0);
dat<<=1;
if(SPI_MISO())
dat|=0x01;
else
dat&=0xfe;
SPI_SCLK(1);
my_spi_delayus(SPI_DELAY);
}
return dat;
#endif
}
unsigned char my_spi_swap(unsigned char dat)
{
unsigned char i=0,redat=0;
#if SPI_MODE==0 //空闲SCK=0 数据发送是在上升沿,接收下降
for(i=0;i<8;i++)
{
if(dat&0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
dat<<=1;
SPI_SCLK(1);
my_spi_delayus(SPI_DELAY);
SPI_SCLK(0);
redat<<=1;
if(SPI_MISO())
redat|=0x01;
else
redat&=0xfe;
}
return redat;
#elif SPI_MODE==1 //空闲SCK=0 数据发送是在下降沿,接收上升
for(i=0;i<8;i++)
{
SPI_SCLK(1);
redat<<=1;
if(SPI_MISO())
redat|=0x01;
else
redat&=0xfe;
if(dat&0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
dat<<=1;
SPI_SCLK(0);
my_spi_delayus(SPI_DELAY);
}
return redat;
#elif SPI_MODE==2 //空闲SCK=1 数据发送是在下降沿,上升接收
for(i=0;i<8;i++)
{
if(dat&0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
dat<<=1;
SPI_SCLK(0);
my_spi_delayus(SPI_DELAY);
SPI_SCLK(1);
redat<<=1;
if(SPI_MISO())
redat|=0x01;
else
redat&=0xfe;
}
return redat;
#elif SPI_MODE==3 //空闲SCK=1 数据发送是在上升沿,下降接收
for(i=0;i<8;i++)
{
SPI_SCLK(0);
redat<<=1;
if(SPI_MISO())
redat|=0x01;
else
redat&=0xfe;
if(dat&0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
dat<<=1;
SPI_SCLK(1);
my_spi_delayus(SPI_DELAY);
}
return redat;
#endif
}
SPI四种模式代码
最新推荐文章于 2024-06-20 14:44:51 发布