在本教程中,我将向您展示如何在基于STM32蓝色药丸板的STM32F103C8T6单片机中使用SPI。对于SPI通信,我们需要一个主设备和一个或多个从设备。因此,为了演示STM32F103C8T6中的SPI,我将配置STM32为SPI主,Arduino UNO为SPI从。
简介
SPI是缩写串行外围接口,是一种常用的通信协议,用于微控制器和各种外围设备之间的数据传输,如闪存、eeprom、SD卡、传感器、液晶显示器等。
实现SPI通信的一种常用方法是使用四根导线,尽管也有使用较少导线的方法。在本教程中,我将使用四线SPI通信和四线称为:
- SCLK ->串行时钟
- MOSI ->主输出从输入(数据从主到从)
- MISO ->主输入从输出(从端数据到主端数据)
- SS -> Slave选择
下图显示了主设备和从设备之间的简单SPI接口。图像还显示了相应信号的方向。
Slave Select Signal用于通过使SS信号为LOW来激活一个特定的Slave。在多从设备配置中,每个从设备都有来自主设备的SS信号,并且在任何时候,只有一个从设备可以激活。
SPI通信的内部硬件非常简单。它由移位寄存器和数据锁存器组成。要记住的重要一点是,主设备负责在SCLK线上产生时钟信号。
有关SPI通信及其模式的更多信息,请参考“串行外围接口的基本”教程。
SPI在STM32F103C8T6
至于STM32F103C8T6单片机的SPI,该单片机有两个SPI接口,都可以在全双工或单工模式下工作,速度可达18mbits /s。如果您还记得STM32蓝色药丸板的引脚配置,您可以看到两个SPI接口都用紫色标记。
对于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。
说到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教程。
连接解释
首先,注意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会亮起。