首页

如何在STM32F103C8T6中使用SPI ?STM32 SPI教程

在本教程中,我将向您展示如何在基于STM32蓝色药丸板的STM32F103C8T6单片机中使用SPI。对于SPI通信,我们需要一个主设备和一个或多个从设备。因此,为了演示STM32F103C8T6中的SPI,我将配置STM32为SPI主,Arduino UNO为SPI从。

简介

SPI是缩写串行外围接口,是一种常用的通信协议,用于微控制器和各种外围设备之间的数据传输,如闪存、eeprom、SD卡、传感器、液晶显示器等。

实现SPI通信的一种常用方法是使用四根导线,尽管也有使用较少导线的方法。在本教程中,我将使用四线SPI通信和四线称为:

  • SCLK ->串行时钟
  • MOSI ->主输出从输入(数据从主到从)
  • MISO ->主输入从输出(从端数据到主端数据)
  • SS -> Slave选择

下图显示了主设备和从设备之间的简单SPI接口。图像还显示了相应信号的方向。

SPI一主一从

Slave Select Signal用于通过使SS信号为LOW来激活一个特定的Slave。在多从设备配置中,每个从设备都有来自主设备的SS信号,并且在任何时候,只有一个从设备可以激活。

SPI通信的内部硬件非常简单。它由移位寄存器和数据锁存器组成。要记住的重要一点是,主设备负责在SCLK线上产生时钟信号。

SPI硬件

有关SPI通信及其模式的更多信息,请参考“串行外围接口的基本”教程。

SPI在STM32F103C8T6

至于STM32F103C8T6单片机的SPI,该单片机有两个SPI接口,都可以在全双工或单工模式下工作,速度可达18mbits /s。如果您还记得STM32蓝色药丸板的引脚配置,您可以看到两个SPI接口都用紫色标记。

STM32F103C8T6蓝色药丸引脚布局

对于SPI1接口,有两组引脚配置。下表显示了STM32F103C8T6单片机中所有与SPI相关的引脚。

SPI信号

替代针

SPI1

魔法石,第1章 不仅不会

三年级

SCLK1

PA5

PB3

MISO1

尼龙6

PB4

MOSI1 囚徒,

PB5

SPI2

SS2 PB12 - - - - - -

SCLK2

PB13

- - - - - -

MISO2

PB14

- - - - - -

MOSI2 PB15

- - - - - -

对于STM32 SPI教程,我将使用SPI1的第一组引脚。

SPI的Arduino

如前所述,我将使用Arduino UNO作为SPI从设备。您可以使用任何其他SPI设备,如任何传感器或内存IC,但我选择使用Arduino,因为您可以轻松解码SPI数据,并进一步做一些额外的事情,如点亮LED或在LCD上显示信息,这是您不能使用EEPROM IC。

STM32F103C8T6 Arduino SPI引脚

说到Arduino中的SPI,数字IO引脚10到11被连接到SPI接口。下表列出了Arduino UNO中的SPI引脚。

SPI信号

Arduino销

党卫军

数字IO 10

莫西人

数字IO 11

味噌

数字IO 12

SCK

数字IO 13

如何在STM32F103C8T6中使用SPI ?

为了在STM32F103C8T6中演示SPI, STM32蓝色药丸板被配置为SPI主板,Arduino UNO被配置为SPI从板。两个板都与外部按钮连接,我也将使用每个板上的led。

当按下连接STM32的Push Button时,Arduino上的LED就会打开。同样,当按下连接Arduino UNO的Push Button时,STM32 Blue Pill Board上的LED也会亮起。

您可以扩展这个项目并使用带有STM32蓝色药丸板和Arduino UNO的16×2液晶显示器来显示一些信息。

组件的要求

  • 基于STM32F103C8T6单片机的STM32蓝丸板
  • Arduino UNO
  • 2个按钮
  • 2 x 10 KΩ电阻
  • 连接电线
  • USB到UART转换器(如果STM32通过UART编程)
  • Arduino UNO USB连接线

线路图

下图显示了STM32和Arduino之间的连接,以演示STM32 SPI教程。

STM32F103C8T6电路图中的SPI

连接解释

首先,注意STM32板和Arduino UNO中的SPI引脚。然后连接每块板对应的引脚,即STM32上的MOSI引脚(PA7)到Arduino上的MOSI引脚(Digital IO 11), STM32上的MISO引脚(PA6)到Arduino上的MISO引脚(Digital IO 12), STM32上的SCLK引脚(PA5)到Arduino上的SCK引脚(Digital IO 13), STM32上的SS引脚(PA4)到Arduino上的SS引脚(Digital IO 10)。

下表显示了STM32和Arduino UNO中对应于SPI的引脚。

SPI销

STM32蓝色药片

Arduino UNO

党卫军

不仅不会

数字IO 10

SCLK

PA5

数字IO 13

味噌

尼龙6

数字IO 12

莫西人

囚徒,

数字IO 11

现在,将一个按钮的一端连接到STM32的PA0引脚。另外,使用10KΩ电阻将此引脚拉到GND。将按钮的另一端连接到3.3V。对Arduino重复同样的操作,即将按钮的一端连接到数字IO引脚6,并使用10KΩ电阻将该引脚拉到GND。将按钮的另一端连接到5V。

因为我将使用STM32 Blue Pill Board和Arduino UNO的板上led,所以不需要任何额外的组件。

SPI通信的STM32编程

首先,让我开始编写STM32。定义LED、按钮和从选引脚,并设置LED引脚和从选引脚为输出,按钮引脚为输入。

开始SPI通信并使用SPI_CLOCK_DIV16减少SPI时钟。这将除主时钟,即72兆赫除以16,以得到4.5兆赫的SPI时钟。最初,使SS引脚为HIGH,即奴隶尚未连接。

在循环中,读取按钮的状态并通过SPI传输它。在传输时,从服务器也发送数据并将从服务器的数据捕获到一个变量中。

根据接收到的数据,将LED调高或调低。

代码

# include < SPI.h >

#定义党卫军不仅不会
#定义ledPin PC13
#定义buttonPin PA0

无效的设置(空白)

pinMode (SS、输出);
pinMode (ledPin、输出);
pinMode (buttonPin、输入);
SPI.begin ();
SPI.setClockDivider (SPI_CLOCK_DIV16);
digitalWrite (SS、高);
digitalWrite (ledPin、低);

无效循环(空白)

int masterSend masterReceive;

masterSend = digitalRead (buttonPin);

digitalWrite (SS、低);

masterReceive = SPI.transfer (masterSend);
延迟(500);
digitalWrite (SS、高);

if (masterReceive == HIGH)

digitalWrite (ledPin、高);

其他的

digitalWrite (ledPin、低);


为SPI通信编程Arduino

来到Arduino,定义LED和Button pin,并将它们分别设置为OUTPUT和INPUT。另外,将MISO引脚设为OUTPUT。

默认情况下,SPI中的Arduino充当Master。但我们希望我们的Arduino作为本教程的奴隶。为了使Arduino的SPI作为Slave,您必须修改SPCR寄存器。

启用SPI中断,以便当SPI接收到数据时,产生中断。在SPI的中断服务例程中,接收到的数据被捕获在一个变量中。

在循环中,读取按钮的状态,并使用SPI进行传输。此外,我们在ISR中捕获的接收数据被分析,LED相应地被打开或关闭。

代码

# include < SPI.h >

const int ledPin = 13;
const int buttonPin = 6;

不稳定的布尔收到了;
volatile int奴隶接收,奴隶发送;

无效的设置()

pinMode (ledPin、输出);
pinMode (buttonPin、输入);
pinMode(味噌、输出);

digitalWrite (ledPin、低);
/*在从模式下打开SPI */
SPCR | = _BV (SPE);
收到= false;
/*为SPI通信设置中断ON
SPI.attachInterrupt ();

/* spi isr */
ISR (SPI_STC_vect)

从主STM32F103C8T6接收的值存储在变量slaveReceive */中
slaveReceive = SPDR;
收到= true;

无效循环()

slaveSend = digitalRead (buttonPin);
/*通过SPDR将slaveSend值发送给主STM32F103C8T6
SPDR = slaveSend;

如果收到了= = true)

如果(slaveReceive = =高)

digitalWrite (ledPin、高);

其他的

digitalWrite (ledPin、低);


重要提示:首先连接STM32到您的计算机,上传程序(使用USB或UART或直接USB引导加载程序),并断开与计算机的连接。现在,将Arduino UNO连接到计算机,修改Arduino IDE中的设置,将程序上传到Arduino,然后断开连接。

结论

本文实现了一个基于STM32蓝丸板的STM32F103C8T6单片机SPI演示的简单方案。STM32在SPI通信中充当主设备,而Arduino UNO用作从设备。

当按下主控板(即STM32)中的一个按钮时,Arduino板上的LED会亮起。同样,当按下Arduino中的按钮时,STM32中的LED会亮起。

留下一个回复

您的电邮地址将不会公布。

Electronicshub图标
Baidu
map