SPI四种模式代码

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值