SPI 通信原理详述


SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,与UART相比,传输速度要快得多,因此被广泛应用于控制器与ADC、LCD等设备进行通信尤其是高速通信的场合。此外,微控制器还可以用过SPI组成一个小型同步网络进行告诉数据交换,完成较复杂的工作。

1.物理层

1.1 SPI接口

SPI属于同步全双工串行通信。同步意味着有一条公共时钟线;全双工说明SPI至少有两根数据线实现数据的双向同时传输。同步+全双工—>SPI主设备对从设备的读操作和写操作是同时同步完成的;串行表明SPI收发数据只能一位一位进行,最多有两根数据线,一根发送,一根接收。分析可知,SPI在物理层体现为4根使用的信号线,分别如下:

  1. SCLK:时钟线,用来同步数据传输,由主设备产生,每个时钟周期输出一位数据,经过8个时钟周期,传输完一个字节;
  2. MOSI:主机输出,从机输入数据线;
  3. MISO:主机输入,从机输出数据线;
  4. SS:有时候也叫CS(chip select,片选线),SPI从设备选择信号线。当多个SPI从设备和SPI主设备连接(一主多从)时,SS用来选择激活指定的从设备,由主设备控制(一般是微控制器),低电平有效。(当从设备只有一个时,ss并不是必须的)。
    除4根信号线外,SPI接口还应包含一个串行移位寄存器。SPI主机发送数据时,把数据放进该串行移位寄存器,移位寄存器用过MOSI一位一位地把数据传送给SPI从机;同时,SPI从机也把自己在串行移位寄存器的数据通过MISO发送给主机。因此,SPI主机对从机的写操作和读操作是在宏观上同步完成的
    因此,只进行SPI从机写操作,只需忽略收到的字节即可。
    --------------------------读-----,SPI主机必须发送一个空字节dummy byte,一般是0xFF,也可以是其他数值,用来启动数据传输,无论何值,最终目的都是产生时钟信号而已来触发从机的数据传输
    根据该特性,SPI数据的发送和接收可以封装在一个函数里面。
    编写该函数注意两点:
  • 在大多数情况下,该函数都站在主机角度编写的,所以在看时序图时仅考虑When MI和When MO

  • 主机的SPI时序必须符合从机要求,以确定When MI和When MO(以下图为例)
    在这里插入图片描述

51和STM32代码实例如下:

/**********************************************************
C51中,SCL时序需要I/O口模拟:最基本的函数,完成 GPIO 模拟 SPI 的功能。将输出字节(MOSI)从 MSB 循环输出,
同时将输入字节(MISO)从 LSB 循环移入。上升沿读入,下降沿输出(相当于CPOL=1,CHPA=1)。(从 SCK 被初始化
为低电平可以判断出)。
******************************************************/
uchar SPI_RW(uchar byte)
{
  uchar bit_ctr;
  for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit
   {
    MOSI = (byte & 0x80);              // output 'byte', MSB to MOSI
    byte = (byte << 1);                // shift next bit into MSB..
    SCK = 1;                           // Set SCK high..
    byte |= MISO;                      // capture current MISO bit
    SCK = 0;                           // ..then set SCK low again
  }
  return(byte);                        // return read byte
}


/******************************************************
函数名:
函数功能:stm32--SPI1 读写一个字节   
输入:TxData:要写入的字节
返回值:读取到的字节
应用实例:发送空字节,接收数据
*Rece_Data=SPI1_ReadWriteByte(Dummy_Byte)
Rece_Data++;
注意:和51自编的函数不同,该函数看不出时序特性。因为时序特性在SPI初始化时已经配置完成,加上硬件上的便捷,通过SPI->DR的空和满来发送和接收数据
***********************************************************************/
u8 SPI1_ReadWriteByte(u8 TxData)
{        
    u16 retry=0;                 
    while((SPI1->SR&1<<1)==0)//等待发送区空    
    {
        retry++;
        if(retry>0XFFFE)return 0;
    }              
    SPI1->DR=TxData;           //发送一个byte
    retry=0;
    while((SPI1->SR&1<<0)==0) //等待接收完一个byte  
    {
        retry++;
        if(retry>0XFFFE)return 0;
    }                                  
    return SPI1->DR;          //返回收到的数据                    
}

1.2 SPI互连

  • 一主一从
    在这里插入图片描述
  • 一主多从
    在这里插入图片描述
    注意:
    由于时钟线和时钟线为所有SPI设备共享,因此,在同一时刻,只能有一个设备参与通信,各个从机分时复用。而且,当主机与其中一个从机进行通信时,其他从机的时钟线和数据线都应保持高阻状态,以避免影响当前数据传输。
    在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机,数据传输过程由主机初始化。这就要求从机的MISO口具有三态特性,使得该口线在器件未被选通时表现为高阻抗。

2 协议层

由于是同步全双工通信,因此 它按照时钟线节拍在MOSI和MISO上一位一位传输。SCK每产生一个时钟脉冲,MOSI和MISO就各自传输一位数据。经过若干个SCLK时钟脉冲,完成一个SPI数据帧的传输,SPI主机的串行寄存器和从机的串行寄存器完成一次数据交换。
SPI的协议层包括SPI时序、SPI数据格式和SPI传输速率三个方面。

2.1 SPI时序

在SPI时序与其时钟极性(CPOL或UCCKPL)和时钟相位(CPHA或UCCKPH)有关。

1)时钟极性

时钟极性(clock polarity,CPOL)是指SPI通信设备空闲时(SCLK在数发送8个bit比特数据之前和之后的状态)SPI时钟线SCK的电平,也可以认为SPI片选线SS为低电平时SCK的电平。
CPOL=0,时钟空闲时候的电平是低电平,所以当SCLK有效的时候,是高电平,即active-high;
CPOL=1,时钟空闲时候的电平是高电平,所以当SCLK有效的时候,是低电平,即active-low;

2)时钟相位

时钟相位(clock phase,CPHA)设置读取数据和发送数据的时钟沿,,即指SPI数据接收方在SCK上的一个时钟周期内的哪一个跳变沿在数据线MOSI/MISO上采样(clock)数据。
CPHA=0,表示SCK上的第奇数个跳变沿clock:
对于CPOL=0,空闲时候的是低电平,第一个跳变沿就是从低变到高,即上升沿;
对于CPOL=1,空闲时候的是高电平,第一个跳变沿就是从高变到低,即下降沿;
CPHA=1,表示SCK上的第偶数个跳变沿clock:
对于CPOL=0,空闲时候的是低电平,第二个跳变沿就是从高变到低,即下降沿;
对于CPOL=1,空闲时候的是高电平,第二个跳变沿就是从低变到高,即上升沿;
上张图大家更容易看懂
在这里插入图片描述
主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。
在这里插入图片描述

2.2数据格式

SPI数据传输也是以帧为单位,通常选择8位或16位数据帧格式,比UART数据帧简单很多,均由数据位组成。SPI数据可以高位到低位,也可以由低位到高位依次传输,传输格式由具体SPI设备决定。
SPI主机向从机发送一个字节数据的具体过程如下:

  • 将从设备的片选线SS置低。
  • 主机在SCK每个跳变沿一位一位传送数据到MOSI数据线上,同时在MOSO上接收从机发送过来的数据
  • 将从设备的片选线SS拉高

3.传输速率

SPI传输速率较高,时钟最高能达到几十兆赫兹。

4 优缺点

SPI接口具有如下优点:

  1. 支持全双工操作;
  2. 操作简单;
  3. 数据传输速率较高。
    同时,它也具有如下缺点:
  4. 需要占用主机较多的口线(每个从机都需要一根片选线);
  5. 只支持单个主机(据说Stm32的SPI外设支持以多主配置工作)。
    3)无法纠错(stm32可使用一条双向数据线的双线单工同步传输,可使用CRC校验)。
    4)不具备寻址能力。
    5)接收方没有应答信号。
    6)不适合复杂或可靠性较高的场合

求索之路永无止境,若有不当之处请指出,感激不尽.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值