一、SPI概述

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10M/bps。

SPI属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,当存在多个从设备的时候,主设备通过片选信号来决定选择哪个设备。

1.1 基本结构

SPI共有4条信号线:

  • MISO(Master in slave out):主设备输入从设备输出,数据由主设备发出;
  • MOSI(Master out slave in):主设备输出从设备输入,数据由从设备发出;
  • SCLK/SCK(Serial clock):串行时钟信号,由主设备产生;
  • $overline{SS}$/$overline{CS}$(Slave/Chip slect):丛机选择信号,一般低电平有效,有主设备发出;

由上图也可以看出当SPI设备间通信时,数据线应该是MOSI连接MOSI,MISO连接MISO,SCLK与SCLK相连。

当只有单一SPI从设备时,如果从设备允许的话,可直接将CS/SS线固定在低电平。

对于多个从设备时,则每个从设备都需要一根CS/SS线来于主设备相连,从而达到主设备能与任一从从设备通信的目的。

1.2 优缺点

SPI总线的优点:

  • SPI通信无起始位和停止位,因此数据可以连续流传输而不会中断;没有像I2C这样的复杂的从站寻址系统,数据传输速率比I2C更高(几乎快两倍)。独立的MISO和MOSI线路,可以同时发送和接收数据;

SPI总线的缺点:

  • SPI使用四根线,而I2C和UART只是使用两根线,没有信号接收成功的确认(I2C拥有该功能),没有任何形式的错误检查(如UART中的奇偶校验位等);

二、主从设备通信过程

在SPI每个时钟中期内,都会进行一次全双工数据的传输,主设备通过MOSI线上发送1位时,从设备也会在读取数据之后通过MISO发送发送1位数据出去。

SPI主从设备都有一个串行移位寄存器,主设备通过向它的SPI串行移位寄存器写入一个字节来发送一次数据传输。

 

SPI数据通信流程可以分为以下几个步骤:

  • 主设备发起信号,将$overline{SS}$或$overline{CS}$拉低,通信开始;
  • 主设备通过发送SCLK时钟信号,告诉从设备进行读写操作。这里的SCLK时钟信号是由SPI的模式来决定高电平还是低电平有效;
  • 主设备将要发送的数据写入到发送数据缓冲区(Memory),缓冲区经过移位寄存器位[7:0],串行移位寄存器通过MOSI将字节数据一位一位的传输到从设备,同时MISO接收到的数据经过移位寄存器一位一位的传输到接收缓冲区;
  • 从设备也将自己的串行移位寄存器位[7:0]的数据通过MISO传输到主设备,同时通过MOSI接收主设备发送的数据,这样这两个移位寄存器中的数据被交换;

三、通信特性

3.1 设备选择

SPI是单主设备(Single Master)通信协议,只有一个主设备能发起通信,当SPI主设备想读/写从设备时,它首先拉低从设备对应的$overline{SS}$线。

接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”。如下图所示:

3.2 设备时钟 

SPI时钟特点主要包括:时钟频率、时钟极性和时钟相位。

3.2.1 时钟频率

SPI主设备必须在通信开始之前配置并生成相应的时钟信号,当然时钟频率受限于我们SPI主设备能输出的最大频率、以及最大的SPI传输频率。

3.2.2 时钟极性

根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。

时钟极性(CPOL)定义了SCLK时钟线空闲状态时的电平:

  • CPOL=0,即SCLK=0,表示SCLK时钟信号线在空闲状态时的电平为低电平,因此有效状态为高电平;
  • CPOL=1,即SCLK=1,表示SCLK时钟信号线在空闲状态时的电平为高电平,因此有效状态为低电;
3.2.3 时钟相位

根据硬件制造商的不同,时钟相位通常写为CKE或CPHA。

时钟相位(CPHA)定义了数据位相对于时钟线的时序(即相位):

  •  CPHA=0,在时钟信号SCK的第一个跳变沿采样;
  • CPHA=1,在时钟信号SCK的第二个跳变沿采样;

3.3 四种模式

根据SPI的时钟极性和时钟相位特性可以设置4种不同的SPI通信操作模式,它们的区别是定义了在时钟脉冲的哪条边沿转换输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。如下表,为SPI通信的4种模式:

CPOL CPOH 空闲SCLK时钟 采样时刻
0 0 低电平 第1个边沿
0 1 低电平 第2个边沿
1 0 高电平 第1个边沿
1 1 高电平 第2个边沿

下面是我从S3C2440手册裁切到的4种模式的SPI通信时序图:

具体说明如下:

  • 图1,CPOL=0,CPHA=0:当空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿(第一位数据发送是在上升沿之前);
  • 图2,CPOL=0,CPHA=1:当空闲态时,SCLK处于低电平,数据采样是在第2个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿;
  • 图3,CPOL=1,CPHA=0:当空闲态时,SCLK高于高电平,数据采样是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿(第一个数据发送是在下降沿之前);
  • 图4,CPOL=1,CPHA=1:当空闲态时,SCLK高于高电平,数据采样是在第2个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上降沿,数据发送是在下降沿;

参考文章;

[1] 一文搞懂SPI通信协议

[2]SPI通信协议详解,一篇就够!

[3]S3c2440裸机-spi编程-1.spi协议

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/zyly/p/17107495.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程