SPI时序理解及软件SPI

spi总结

SPI的四种模式

SPI的相位(CPHA)和极性(CPOL)分别可以为0或1,对应的4种组合构成了SPI的4种模式(mode)

Mode 0:CPOL = 0,CPHA = 0

Mode 1:CPOL = 0,CPHA = 1

Mode 2:CPOL = 1,CPHA = 0

Mode 3:CPOL = 1,CPHA = 1

时钟极性CPOL(设置时钟空闲时的电平):即SPI空闲时,时钟信号SCLK的电平。(0:空闲时低电平,1:空闲时高电平)

时钟相位CPHA(设置读取数据和发送数据的时钟沿):即SPI在SCLK第几个边沿开始采样。(0:第一个边沿开始,1:第二个边沿开始)

CPHA = 0,表示第一个边沿:

对于CPOL = 0,空闲时是低电平,第一个边沿就是从低到高,所以是上升沿。

对于CPOL = 1,空闲时是高电平,第一个边沿就是从高到低,所以是下降沿。

CPHA = 1,表示第二个边沿:

对于CPOL = 0,空闲时是高电平,第一个边沿就是从高到低,所以是下降沿。

对于CPOL = 1,空闲时是低电平,第一个边沿就是从低到高,所以是上升沿。

CPOL=0,CPHA=1 模式

u8 SOFT_SPI_RW(u8 byte)
{
    u8 i,Temp=0;

    SPI1_SCK = 0;

    for(i=0;i<8;i++)     // 循环8次
   {
       SPI1_SCK = 1;     //拉高时钟
       if(byte&0x80)
        {
          SPI1_MOSI = 1;  //若最到位为高,则输出高
        }
       else      
        {
           SPI1_MOSI = 0;   //若最到位为低,则输出低
         }
          byte <<= 1;     // 低一位移位到最高位
          SPI1_SCK = 0;     //拉低时钟
         Temp <<= 1;     //数据左移

         if(SPI1_MISO)
           Temp++;     //若从从机接收到高电平,数据自加一

          SPI1_SCK = 1;     //拉高时钟
       }
      return (Temp);     //返回数据
}

CPOL=1,CPHA=1 模式

u8 SOFT_SPI_RW(u8 byte) 
{ 
   u8 i,Temp=0;
   
   for(i=0;i<8;i++)     // 循环8次 
   { 
      SPI1_SCK = 0;     //拉低时钟 
	  
	  if(byte&0x80) 
	    SPI1_MOSI = 1;                             //若最到位为高,则输出高 
	  else       
	    SPI1_MOSI = 0;                             //若最到位为低,则输出低 
		
	  byte <<= 1;     // 低一位移位到最高位 
		
	  SPI1_SCK = 1;     //拉高时钟 
		
	  Temp <<= 1;     //数据左移 
	  
	  if(SPI1_MISO) 
	    Temp++;     //若从从机接收到高电平,数据自加一 
	  
	  SPI1_SCK = 0;     //拉低时钟 
    } 
	  
	  return (Temp);     //返回数据 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值