沐印
1974 字
10 分钟
嵌入式 - SPI
2024-07-09

全双工#

在全双工通信中,通信链路的双方都可以同时发送和接收数据。这与半双工不同,在半双工中,双方只能交替发送和接收数据。

全双工通信允许同时进行双向数据传输,从而提高了网络效率并减少了延迟。它通常用于以太网、电话和视频会议等应用中。

全双工通信的优点包括:

  • **更高的效率:**允许同时进行双向数据传输,从而提高了整体网络吞吐量。
  • **更低的延迟:**消除了半双工通信中由于设备必须交替发送和接收数据而造成的延迟。
  • **更好的实时性:**对于视频会议和语音通话等实时应用非常重要,因为它允许双方同时发送和接收音频和视频数据。

全双工通信通常通过使用双绞线或光纤等物理介质来实现,这些介质允许同时传输两个方向的数据。它还要求网络设备(例如路由器和交换机)支持全双工操作。

同步通信与异步通信#

在计算机网络中,通信可以分为两种主要类型:

  • 同步通信:

    • **定义:**发送方和接收方在通信过程中保持同步。
    • 特点:
      • 发送方等待接收方的确认后再继续发送数据。
      • 保证数据顺序和完整性。
    • 应用:
      • 银行转账
      • 数据库事务处理
      • 音频和视频流
  • 异步通信:

    • **定义:**发送方和接收方在通信过程中不同步。
    • 特点:
      • 发送方将数据发送给接收方,无需等待确认。
      • 接收方收到数据后,以自己的速度处理数据。
      • 不保证数据顺序和完整性。
    • 应用:
      • 电子邮件
      • 消息传递
      • 文件传输.

一、SPI 简介#

SPI(Serial Peripheral Interface,串行外围设备接口)是一种高速、全双工、同步通信总线。SPI 通讯协议的优点是支持全双工通信,通讯方式较为简单,且相对数据传输速率较快;缺点是没有指定的流控制,没有应答机制,在数据可靠性上有一定缺陷。

来自主机或者从机的数据在 clk 上升沿或下降沿同步,主机和从机可以通过MOSI、MISO线路同时传输数据。SPI 接口可以是 3 线式(SCLK、CS、DIO)或者 4 线式(SCLK、CS、MOSI、MISO)

SPI 采用主从控制模式,通常由一个主模块和一个或多个从模块组成(不支持多主机,多从机-菊花链),来自主机或者从机的数据在 **clk 上升沿或下降沿同步,**一般使用四条线进行通信 SCLK、CS、MOSI、MISO) 。

image

MISO (Master Input Slave Output) : 主设备数据输入,从设备数据输出;
MOSI (Master Output Slave Input) : 主设备数据输出,从设备数据输入;
SCLK (Serial Clock) : 时钟信号,由主设备产生;
CS/SS (Chip Select/Slave Select) : 从设备片选信号,由主设备控制,通常低电平有效。

二、SPI 四种通信方式#

SPI 总线在传输数据的同时也传输了时钟信号,时钟信号通过时钟极性 (CPOL)时钟相位 (CPHA) 控制两个 SPI 设备何时交换数据以及何时对接收数据进行采样,保证数据在两个设备之间同步传输。

时钟极性 (Clock Polarity, CPOL/CKP),它是指时钟信号在空闲状态下是高电平还是低电平,当时钟空闲时为低电平即 CPOL=0,反之则 CPOL=1

时钟相位 (Clock Phase, CPHA/CKE),它是指时钟信号开始有效的第一个边沿和数据的关系。当时钟信号有效的第一个边沿处于数据稳定期的正中间时定义 CPHA=0,反之时钟信号有效的第一个边沿不处于数据稳定期的正中间定义 CPHA=1。所以在时钟信号 SCK 的第一个跳变沿采样即 CPHA=0,再时钟信号 SCK 的第二个跳变沿采样为 CPHA=1。
 

那么根据 SPI 的时钟极性和时钟相位特性可以设置 4 种不同的 SPI 通信操作模式:

SPI 模式CPOLCPHA空闲时 SCK 时钟采样时刻
000低电平第 1 个边沿(奇)
101低电平第 2 个边沿(偶)
210高电平第 1 个边沿(奇)
311高电平第 2 个边沿(偶)

image

 Mode0:CKP=0,CPHA =0:当空闲态时,SCK 处于低电平,数据采样是在第 1 个边沿,即 SCK 由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。
Mode1:CKP=0,CPHA=1:当空闲态时,SCK 处于低电平,数据发送是在第 2 个边沿,即 SCK 由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
Mode2:CKP=1,CPHA=0:当空闲态时,SCK 处于高电平,数据采集是在第 1 个边沿,即 SCK 由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
Mode3:CKP=1,CPHA=1:当空闲态时,SCK 处于高电平,数据发送是在第 2 个边沿,即 SCK 由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅充当一个发送者(Transmitter)或者接受者(Receiver)。在片选信号 CS 为 0 的情况下,每个 clock 周期内,SPI 设备都会发送并接收 1bit 数据,相当于有 1bit 数据被交换。

MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在 SCK 的下降沿时被采样。即在 SCK 的下降沿时刻,MOSI 及 MISO 的数据有效,高电平时表示数据 “1”,为低电平时表示数据 “0”。在其它时刻,数据无效,MOSI 及 MISO 为下一次表示数据做准备。

SPI 每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。

SPI 通信过程#

image

主机将 8 位二进制数据 10101100 发送给从机,从机将 8 位二进制数据 11001010 发送给主机。

首先主机要将从机片选信号 SS 拉低此时代表从机被选中,在此之前 SCK 信号要始终处于低电平。SS 拉低后时钟信号 SCK 开始启动,此时主机和从机的数据开始交互。

时钟主机数据MOSI从机数据MISO
初始低电平10101100初始值 011001010初始值 0
10101100X11001010X1
0010110011100101011
11011001X00010101X1
0101100110001010101
10110011X10101010X0
0011001101010101010
11100110X01010101X0
0110011000101010100
11001100X10101010X1
0100110011010101011
10011001X11010101X0
0001100101101010110
10110010X00101011X1
0011001010010101101
11100101X01010110X0
0110010100101011000

上表中时钟信号 1 代表时钟上升沿,0 代表下降沿。
采用 SPI 通信 Model 0,所以第一个时钟上升沿到来时完成数据采样,主机将要发送的数据最高位放到 MOSI 上,而从机也将要发送的数据最高位放到 MISO 上 (保证两个 SPI 通讯设备之间使用同样的协定,一般都会采用 MSB 先行模式),当第一个时钟的下降沿到来时主机把 MISO 上的数据存入移位寄存器中,而从机把 MOSI 上的数据存入移位寄存器中,这样主机从机就完成了 1bit 数据的交互。
当第二个时钟上升沿到来时,重复第一个时钟的操作就完成了 2bit 数据的交互,当 8 个时钟过去后,主机和从机就完成了 8bit 数据交互,此时主机中的数据由 10101100 变成了 11001010,而从机中的数据也由 11001010 变成了 10101100。

参考文献:

 正点原子、野火 FPGA

【接口时序】4、SPI 总线的原理与 Verilog 实现 - jgliu - 博客园 (cnblogs.com)

https://blog.csdn.net/STATEABC/article/details/131857078

嵌入式 - SPI
https://f.undf.top/posts/post/code/embedded/找工作/嵌入式---spi/
作者
沐印
发布于
2024-07-09
许可协议
CC BY-NC-SA 4.0