本帖最后由 正点原子官方 于 2022-4-18 17:56 编辑
STM32做SPI主机很常见,但是SPI从机玩过吗?
前言 在平常的开发中,很多时候我们使用SPI都是使用主机模式去驱动一些传感器、存储器等等,很少会用到SPI从机。有时候,我们又需要STM32的SPI配置为从机去接收数据,本文就是介绍如何使用探索者开发版配置SPI从机。 这里我们以探索者开发版标准库实验25SPI实验为基础例程进行修改。这里我们把SPI从机只定义为一个接收,所以没有发送数据的操作。SPI的基础知识需要大家自己去学习,这里着重说明使用方法。 接下来,我们来看一下具体代码实现。 SPI初始化函数修改为如下代码: 这里特别需要几点: ①主机和从机的工作模式要一致,即时钟极性和时钟相位要一样。 ②主机和从机的数据帧大小要一致,即8位或者16位。 ③主机和从机的数据传输顺序要一致,即MSB或LSB。
以上代码跟原来程序不同点: ①SPI1的引脚使用的是PA4(SPI1_NSS),PA5(SPI1_CLK)和PA7(SPI1_MOSI)三个引脚即可了,因为不需要使用到发送功能,PA6(SPI1_MOSI)就不用配置了。(这些引脚复用信息可以查看原理图或者芯片数据手册) ②SPI_InitStructure.SPI_Direction设置为SPI_Direction_2Lines_RxOnly,即SPI设置为双线单向接收。这种情况下,主机的MOSI直接连接从机的MOSI即可。 ③ NSS引脚的管理我们直接使用硬件管理,也就是需要对PA4(SPI1_NSS)进行操作,拉低就是选中,拉高就是释放片选。 ④ 使能SPI的接收中断即SPI_ITConfig (SPI1,SOI_I2S_IT_RXNE, ENABLE),还需要设置NVIC。 ⑤ 由于是只接收,所以不需要调用SPI1_ReadWriteByte函数去发送数据。
此外,我们还需要编写SPI中断服务函数,代码如下:
当主机拉低片选,发送数据过来,那么从机就会进入到接收中断,并且通过SPI_I2S_ReceiveData函数去SPI1->DR寄存器中获取到数据。当然我们获取完数据之后还得清除一下接收中断标记。
具体接线图如下:
主机程序中通过按键发送不同数据,代码如下:
从机接收的数据在串口助手中显示出来,如下图:
通过这个简单的从机demo,大家就可以发挥想象做很多有趣的东西,把STM32弄成一个带有SPI接口的模组等等。
|