Linux SPI (1) - 概述

  • 了解linux SPI 基本概念。

1.概述

  SPI是“Serial Peripheral Interface”的缩写,串行外设接口,是一种四线制的同步串行通信接口,用来连接MCU、传感器、存储设备,SPI设备分为主设备和从设备两种,用于通信和控制的四根线分别是:

  • CS/SS(片选信号) – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设 备上都有一个片选引脚接入到主设备机中,当主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。
  • SCLK(时钟信号)-- 由主设备产生;
  • MISO – 主设备的数据输入、从设备的数据输出脚
  • MOSI – 主设备的数据输出、从设备的数据输入脚

1.1.SPI 优缺点

优点:

  • 支持全双工通信
  • 通信简单
  • 数据传输速率块

缺点:

  • 没有指定的流控制;
  • 没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。

1.2.SPI时钟周期

  完成如下操作:

  主机通过MOSI线发送1位数据,从机通过该线读取这1位数据;从机通过MISO线发送1位数据,主机通过该线读取这1位数据。这是通过移位寄存器来实现的。

  如下图所示,主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。
Linux SPI (1) - 概述

1.3.SPI 硬件结构

  通常,负责发出时钟信号的设备为主设备,另一方为从设备。如下图:
Linux SPI (1) - 概述

1.4.SoC SPI
Linux SPI (1) - 概述
  主设备对应SoC芯片中的SPI控制器,通常,一个SoC中可能存在多个SPI控制器,如上图所示,SoC芯片中有3个SPI控制器。每个SPI控制器可以连接多个SPI从设备,每个从设备有各自独立的CS引脚。每个从设备共享另外三个信号引脚:SCLK、MISO、MOSI。任何时刻,只有一个CS引脚处于有效状态,与该有效CS引脚连接的设备此时可以与主设备(SPI控制器)通信,其它的从设备处于等待状态,并且它们的3个引脚必须处于高阻状态。

2.工作时序

  要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。因此,主机必须在该信号上发送逻辑0以选择从机。SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)同时进行。串行时钟沿同步数据的移位和采样。SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。

  CPOL(时钟极性)和CPHA(时钟相位)控制主设备的通信模式,具体如下:

  • Mode0:CPOL=0,CPHA=0
  • Mode1:CPOL=0,CPHA=1
  • Mode2:CPOL=1,CPHA=0
  • Mode3:CPOL=1,CPHA=1

Linux SPI (1) - 概述
  时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA 是用来配置数据采样是在第几个边沿:

  • CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
  • CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
  • CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
  • CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿

2.1.SPI模式0

  CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。
Linux SPI (1) - 概述

2.2.SPI模式1

  CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出。
Linux SPI (1) - 概述

2.3.SPI模式2

  CPOL = 1,CPHA = 1:CLK空闲状态 = 高电平,数据在下降沿采样,并在上升沿移出。
Linux SPI (1) - 概述

2.4.SPI模式3

  CPOL = 1,CPHA = 0:CLK空闲状态 = 高电平,数据在上升沿采样,并在下降沿移出。

Linux SPI (1) - 概述

3.多从机配置

  多个从机可与单个SPI主机一起使用。从机可以采用常规模式连接,或采用菊花链模式连接。

3.1.常规SPI模式:
Linux SPI (1) - 概述

  在常规模式下,主机需要为每个从机提供单独的片选信号。一旦主机使能(拉低)片选信号,MOSI/MISO线上的时钟和数据便可用于所选的从机。如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。

  随着从机数量的增加,来自主机的片选线的数量也增加。这会快速增加主机需要提供的输入和输出数量,并限制可以使用的从机数量。可以使用其他技术来增加常规模式下的从机数量,例如使用多路复用器产生片选信号。

3.2.菊花链模式:
Linux SPI (1) - 概述
  在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。

  使用该方法时,由于数据是从一个从机传播到下一个从机,所以传输数据所需的时钟周期数与菊花链中的从机位置成比例。例如在图7所示的8位系统中,为使第3个从机能够获得数据,需要24个时钟脉冲,而常规SPI模式下只需8个时钟脉冲。