Arduino SPI

17 Mar 2025 | 5 分钟阅读

SPI(串行外设接口)是一种串行数据协议。 微控制器使用串行协议通过短距离快速地与一个或多个外围设备进行通信。

SPI 需要全双工连接,允许设备同时发送和接收数据。 它使用四根导线进行数据接收、数据发送、同步设备选择来进行通信。

SPI 使用主从架构,其中一个主设备控制外围设备。

SPI 有四条线,如下所示

  • MISO

它代表 主输入/从输出。 MISO 引脚中的从线用于将数据发送到主设备。

  • MOSI

它代表主输出/从输入。

MOSI 和 SCK 由主设备驱动。

  • SCK

它代表串行时钟。 这些是时钟脉冲,用于同步数据传输。

在从设备中,它用作时钟发生器的输入。 在主设备中,它用作输出时钟。 主设备生成的数据与 SCK 同步。

  • SS

它代表 从设备选择。 它是从设备选择线,由主设备使用。 它充当使能线。

当,

SS = 低电平

当 SS 为低电平时,设备与主设备接口。

SS = 高电平

设备不会注意到主设备。 它允许我们与多个 SPI 设备共享相同的 MISO、CLK 和 MOSI。

SPI 是一种同步接口,具有一个主设备和多个从设备的通信结构。

SPI 的工作原理

SPI 使用四条线进行通信,这些线如上所列(MISO、MOSI、CLK 和 SS)。 连接中的主设备通常是微控制器,而从设备可以是传感器、ADC(模数转换器)、LCD(液晶显示器)、DAC(数模转换器)等。

让我们了解主 SPI 与从设备的连接。

考虑以下示例。

示例 1:具有单个从设备的主 SPI。

考虑下图

Arduino SPI

MISO 的箭头符号方向相反,因为它是一条将数据发送到主设备的从线。

所有其他线都仅从主设备定向。

示例 2:具有两个从设备的主 SPI。

Arduino SPI

在此,SPI 主设备正在与两个 SPI 从设备通信。 SPI 主设备的各个引脚连接到每个从设备的 SS。

SPI 引脚

让我们讨论 Arduino 板上的 SPI 主设备和从设备引脚。

ICSP 接头包括 6 个引脚。 结构如下所示

Arduino SPI

SPI 引脚的引脚编号如下所示

MOSI - 4
MISO - 1
SCK - 3

不同 Arduino 板上的 SPI 引脚如下所示

Arduino UNO

MOSI - 11
MISO - 12
SCK - 13

Arduino Due

MOSI - 4
MISO - 1
SCK - 3

Arduino Zero

MOSI - 4
MISO - 1
SCK - 3

Arduino Mega2560 或 Mega1280

MOSI - 51
MISO - 50
SCK - 52

SPI 库

SPI 的库是

SPI 库允许我们作为主设备与 Arduino 和 SPI 设备进行通信。

SPI 模式

SPI 有四种模式,它们结合了时钟相位 (CPHA) 和时钟极性 (CPOL)。 这些模式称为 SPI 中的四种传输模式

时钟相位确定为数据时钟信号,时钟极性确定高电平或低电平信号的空闲状态。

SPI 模式控制移入和移出状态。 该状态位于时钟极性和时钟相位的上升沿和下降沿。

下面讨论四种模式

模式 0 - 在此,时钟极性为 0 (CPOL = 0),而时钟相位为 0 (CPHA = 0)。 数据在上升沿捕获,输出沿为下降

模式 1 - 在此,时钟极性为 0 (CPOL = 0),而时钟相位为 1 (CPHA = 1)。 数据在下降沿捕获,输出沿为上升

模式 2 - 在此,时钟极性为 1 (CPOL = 1),而时钟相位为 0 (CPHA = 0)。 数据在下降沿捕获,输出沿为上升

模式 3 - 在此,时钟极性为 1 (CPOL = 1),而时钟相位为 1 (CPHA = 1)。 数据在上升沿捕获,输出沿为下降

SPI 编程

在开始在 Arduino 中进行 SPI 编程之前,我们必须声明 SPI 库。

SPI 速度

SPI 会自动使用最佳速度,该速度小于或等于 SPISettings 中指定的 speed number。 如果我们使用 15MHz 的芯片速率,我们可以使用 15000000 的数据速度。

如果我们使用 20MHz 的芯片速率,我们可以使用 20000000 的数据速度。

函数

用于 SPI 编程的函数如下所示

  • begin()

SPI.begin() 函数用于通过将 SS、SCK 和 MOSI 引脚设置为输出来初始化总线。

它以如下所示的状态拉取线路

SS = 高电平

SCK, MOSI = 低电平

语法是

  • SPISettings

它是用于为特定 SPI 设备配置 SPI 端口的对象。 它包含三个参数,这些参数与此对象结合使用。

语法是

如果三个参数是常量,则可以在 SPI.beginTransaction() 函数中直接声明 SPISettings。 如果任何设置是变量,我们可以创建 SPISettings 对象。

语法是

其中,

speedMaximum = 它定义了最大通信速度。

dataOrder= LSBFIRST(最低有效位优先)或 MSBFIRST(最高有效位优先)。

SPI 中的大多数数据位都使用 MSBFirst。

dataMode= 它包含四种模式。

SPI_MODE1、SPI_MODE2、SPI_MODE3 和 SPI_MODE4

  • beginTransaction()

beginTransaction() 函数用于使用定义的 SPISettings 初始化 SPI 总线。

语法是

  • end()

end() 函数用于禁用 SPI 总线,而不更改引脚模式。

语法是

  • transfer()

transfer() 函数用于传输数据。 我们可以多次调用该函数。

  • endTransaction()

endTransaction() 函数用于停止总线。

语法是

  • setClockDivider()

setClockDivider() 函数用于相对于系统时钟设置时钟分频器。

AVR 板中的时钟可以除以 2、4、8、16、32、64 和 128 的可用分频值。 默认值为 4,表示为 SPI_CLOCK_DIV4(例如,20MHz 的板为 5MHz)。 类似地,将表示其他值。

Arduino due 中的时钟可以除以 1 到 255 的可用分频值,其中 21 是默认值。

语法是

  • setDataMode()

setDataMode() 函数用于在 SPISettings 中设置数据模式。

语法是

  • setBitOrder()

setBitOrder() 函数用于设置位的顺序。 这些位移入和移出串行外设接口总线。

位的顺序设置为 LSBFirst(最低有效位优先)或 MSBFirst(最高有效位优先)。

语法是


下一个主题Arduino 传感器