Fork me on GitHub
0%

SPI

基础

SPI:Serial Peripheral Interface 串行外设接口,用于在微控制器和外部设备之间进行数据传输。SPI 接口广泛应用于嵌入式系统中,特别是与外围设备进行通信,如传感器、存储器、显示屏和通信模块等。

特点

  • 传输信号:MSIO、MOSI、SCKL、CS

  • 主从结构。SPI 通信由一个主设备(Master)和一个或多个从设备(Slave)组成。主设备控制通信的时序和数据传输,而从设备按照主设备的命令响应数据传输。

  • 同步协议。SPI 使用一个时钟信号(SCLK)来同步数据的传输。主设备产生时钟信号,控制数据传输的速率和时序,而从设备根据时钟信号采样和发送数据。

  • 全双工传输(双向传输)。数据可以同时在主设备和从设备之间双向传输。主设备通过 MOSI(Master Out Slave In)线路发送数据,而从设备通过 MISO(Master In Slave Out)线路接收数据。

  • 多设备支持:SPI 接口可以连接多个从设备,每个从设备使用一个片选信号(SS)来选择与其通信的从设备。主设备通过选择特定的片选信号来与特定的从设备进行通信。

  • 传输速率。SPI 接口的传输速率可以通过调整时钟频率来控制,支持高速传输。传输速率可以根据实际应用需求进行配置,但受硬件和设备的限制。

信号定义

  • SCK:Serial Clock,串行时钟
  • MOSI:Master Output Slave Input,主发从收
  • MISO:Master Input Slave Output,主收从发
  • CS/SS:Slave Select / Chip Select,片选信号

系统框图

image

对于SPI来讲,通常是一主(MCU)多从(外设),而多个从机是通过CS片选信号线来选择具体和哪一个设备进行通信,从机也将规定片选信号线是高电平有效还是低电平有效

通信过程

不同于I2C,SPI在通信过程中不需要发送起始信号、结束信号,同时也不需要等待应答信号,它的数据线只发送数据,一个byte接着一个byte的数据进行发送。显而易见,它的速度相较于I2C一定是更快的,但是却不能保证数据的可靠性(不能确认从机是否真正收到数据)。另外,在空闲状态的保持和数据发送时的时钟状态上,spi与i2c也是存在差异的。

相位极性

  • 时钟极性(Clock Polarity):定义了在时钟信号在空闲状态下的状态

    • 0:在时钟信号的空闲状态时,数据线上保持低电平(0),而在时钟信号激活时传输数据。
    • 1:在时钟信号的空闲状态时,数据线上保持高电平(1),而在时钟信号激活时传输数据。
  • 时钟相位(Clock Phase):定义了数据信号采样对应的时钟信号的状态(上升沿/下降沿采样)

    • 0:时钟上升沿采样
    • 1:时钟下降沿采样

根据相位极性的每种状态,因此对于spi有四种工作模式,具体选择哪一种模式取决于从机支持哪一种。(I2C相位极性是固定的)

设计目的

  • 兼容性:不同的设备可能对SPI的极性和相位有不同的要求,选择适当的组合可以确保设备之间的兼容性。
  • 时序控制:极性和相位的选择影响了数据传输的时序和同步方式。通过调整极性和相位,可以满足具体应用的时序要求,确保数据的正确传输。
  • 信号完整性:正确的极性和相位组合可以减少噪声和时钟抖动对数据传输的影响,提高信号的可靠性和稳定性。

时序

CPOL = 0,CPHA = 0

空闲状态低电平,上升沿采样下降沿从机读数据

image

CPOL = 0,CPHA = 1

空闲状态低电平,下降沿采样上升沿从机读数据

image

CPOL = 1,CPHA = 0

空闲状态高电平,上升沿采样下降沿从机读数据

image

CPOL = 1,CPHA = 1

空闲状态高电平,下降沿采样上升沿从机读数据

image

SPI controller

这个是 TI SPI User Guide中的控制器的框图

image

数据通路

通过读图可以发现,对于控制内部通路存在buffer和移位寄存器。

  1. 发送数据时,主设备将要发送的数据逐位加载到移位寄存器中,然后通过移位寄存器按照时钟信号的节奏逐位发送。在这个过程中,FIFO缓冲区可以用于存储多个待发送的数据字节,以便在移位寄存器中逐位移动数据之前,提供数据的供应。
  2. 接收数据时,数据线上的位被移位寄存器接收和存储。如果存在FIFO缓冲区,接收到的数据字节可以先存储在FIFO中,以便在主设备准备好读取时进行传输

配置

  • 时钟

    SPI控制器产生时钟信号,用于同步数据传输。它通常提供可配置的时钟频率选项,以适应不同的通信速率需求

  • 数据缓冲区

    SPI控制器提供数据缓冲区,用于存储要发送或接收的数据。它可以是一个单独的寄存器或一个FIFO(First-In-First-Out)缓冲区。

  • 通信模式选择

    根据从机的需求配置极性和相位以适应其传输模式

  • 中断DMA

    为了提高传输效率,控制器通常有中断DMA相关的配置等等

TI SSP

串行传输

数据传输通过断言帧指示线开始(ss_0_n)一个串行时钟周期。要传输的数据被驱动到txd一个串行时钟周期后行;类似地,来自从机的数据被驱动到接收线。数据在串行时钟的上升沿传播(sclk_输出/slk_输入)并在下降沿捕获。

注:从机选择信号(ss_0_n) 仅当用作从机 SPI 时才有效。对于主 SPI,一旦输出使能信号无效,数据传输就开始。

image

连续传输

连续数据帧的传输方式与单个数据帧相同。在与当前传输的 LSB 相同的周期内,帧指示符在一个时钟周期内被置位,指示接下来是另一个数据帧。

image

National‘s Microwire

Microwire 格式与 SPI 格式非常相似,不同之处在于传输是半双工而不是全双工,

单次传输

使用主从消息传递技术。每个串行传输都以一个 8 位控制字开始,该控制字从 PrimeCell SSP 传输到片外从设备。在此传输期间,PrimeCell SSP 不接收传入数据。消息发送后,片外从机对其进行解码,并在发送 8 位控制消息的最后一位后等待一个串行时钟后,以所需的数据进行响应。返回数据的长度为 4 至 16 位,使得总帧长度在 13-25 位范围内。

在此配置中,在空闲期间:SSPCLKOUT被强制为低电平;SSPFSSOUT被强制为高电平;发送数据线SSPTXD被任意强制为低电平;nSSPOE焊盘使能信号被强制为高电平,使发送焊盘处于高阻抗。

通过将控制字节写入发送 FIFO 来触发发送。SSPFSSOUT的下降沿导致发送 FIFO 底部条目中包含的值被传输到发送逻辑的串行移位寄存器,并且 8 位控制帧的 MSB 被移出到 SSPTXD引脚。SSPFSSOUT在帧传输期间保持低电平。SSPRXD引脚在此传输期间保持三态。

片外串行从设备在每个SSPCLKOUT的上升沿将每个控制位锁存到其串行移位器中。最后一位被从设备锁存后,控制字节在一个时钟等待状态期间被解码,并且从设备通过将数据传输回 PrimeCell SSP 来做出响应。每个位在SSPCLKOUT的下降沿被驱动到SSPRXD线上。PrimeCell SSP 依次锁存SSPCLKOUT上升沿上的每一位。在帧结束时,对于单次传输,SSPFSSOUT信号在最后一位被锁存在接收串行移位器中后一个时钟周期被拉高,这导致数据被传输到接收 FIFO。

image

连续传输

片外从设备可以在 LSB 被接收移位器锁存后在SSPCLKOUT的下降沿或当SSPFSSOUT引脚变高时使接收线处于三态。

对于连续传输,数据传输的开始和结束方式与单次传输相同。然而,SSPFSSOUT线持续有效,保持低电平,并且数据传输连续发生。下一帧的控制字节紧跟在当前帧接收数据的 LSB 之后。在帧的 LSB 被锁存到 PrimeCell SSP 中之后,每个接收到的值都会在下降沿SSPCLKOUT上从接收移位器传输。

image

参考资料