[STM32系列] 你真的会使用SPI接口的NSS引脚吗

本文详细介绍了STM32上的SPI接口中的NSS(从设备使能信号)引脚的使用和配置。STM32提供软件管理(通过SPI_CR1寄存器的SSI位)和硬件管理(通过SPI_CR1寄存器的SSM和SSOE位)两种方式。在软件管理中,NSS引脚可作为普通GPIO使用,而在硬件管理中,根据SSOE位的不同设置,可以实现自动片选或多主模式。正确配置NSS对于实现有效的SPI通信至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

SPI接口介绍

STM32上的NSS

NSS引脚的使用和配置

软件管理NSS

硬件管理NSS


SPI接口介绍

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola公司推出的一种高速的,全双工,同步的通信总线。

SPI总线共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。

  • NSS:从设备使能信号,由主设备控制,低电平有效

  • SCK:时钟信号,由主设备产生

  • MOSI:主设备输出从设备输入信号

  • MISO:主设备输入从设备输出信号

STM32上的NSS

STM32上SPI接口的NSS结构图如图1所示,除了外部的NSS引脚,还有内部NSS,且内部NSS状态可以由寄存器独立控制,也正因此,NSS引脚既可作输入也可作输出。

图1 NSS结构图

NSS引脚的使用和配置

STM32上对NSS引脚的管理提供了软件管理和硬件管理两种方式,可以通过SPI_CR1寄存器中的SSM位设置这两种方式:

软件管理NSS

将SPI_CR1寄存器的SSM位置1即可设置该模式。

此时,从器件选择信息在内部由SPI_CR1寄存器的SSI位的值驱动。外部的NSS引脚空闲,可作为普通GPIO使用。

实际应用中,该模式下,若STM32端的SPI作为主设备使用,需将SSI位置1,此时,可以用任意普通GPIO输出高低信号控制从设备的片选;若为从设备,则需将SSI位清零。

硬件管理NSS

将SPI_CR1寄存器的SSM位清零即可设置该模式。

此时,通过设置SPI_CR1寄存器的SSOE位,硬件管理NSS又有以下两种模式:

  • 输出使能(SSOE=1)

仅当器件为主模式时才使用此配置。当主器件开始通信时,会驱动NSS引脚为低电平,直到SPI被关闭为止。

  • 输出禁止(SSOE=0)

对于在主模式下工作的器件,此配置允许多主模式功能,此时应使用GPIO控制从机的片选。

对于设置为从模式的器件,NSS引脚用作传统的片选输入,在NSS引脚为低电平时片选该器件,为高电平时,取消对该器件的片选。

实际应用中,若配置为主模式,希望通过主机的NSS引脚硬件自动片选从设备,还需在硬件上对NSS引脚设计上拉,以保证主机SPI关闭时,NSS引脚为高电平。

### STM32 SPI 外设中 NSS 引脚的功能与配置 #### 功能概述 NSS(Not Slave Select)引脚STM32SPI 外设中有重要作用。它既可以作为输入引脚,也可以作为输出引脚[^4]。具体功能取决于 SPI 工作模式以及 SSM(Slave Select Management)的设置。 当设备作为主机运行时,NSS 引脚通常用于提供片选信号给从机设备。为了使主机能够正常工作,在硬件模式下,该引脚需要保持高电平状态[^2]。然而,由于某些设计上的限制,部分开发者可能会遇到 NSS 引脚无法自动拉高的情况,这促使他们更倾向于采用软件方式来管理 NSS 引脚的状态[^1]。 对于从机而言,NSS 引脚则充当着接收来自主机的选择信号的角色。一旦此引脚变为低电平,则表明当前从机已被选定并进入数据交换过程;反之如果处于高电平状态下,则意味着未被激活或者已经结束通讯周期。 #### 配置方法详解 针对不同需求场景下的 NSS 引脚配置如下: ##### 软件管理模式 (Software Mode) 在这种情况下,通过编程设定特定 GPIO 来模拟实际所需的 NSS 行为逻辑而非直接利用物理连接至 MCU 上的那个专用管脚(PA4 对于 F103 系列来说)[^3]。这种方式赋予使用者更大的灵活性,允许完全自定义何时发送选择命令以及如何同步其他操作流程等细节方面的要求。 以下是实现软控的一个简单例子: ```c // 初始化GPIO口作为输出, 控制NSS高低电平 void SPI_NSS_Soft_Init(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } // 设置NSS为低(选中从设备) void SPI_SelectDevice(void){ GPIO_ResetBits(GPIOA, GPIO_Pin_4); } // 设置NSS为高(取消选中从设备) void SPI_DeselectDevice(void){ GPIO_SetBits(GPIOA, GPIO_Pin_4); } ``` ##### 硬件管理模式 (Hardware Mode) 在此种情形之下,我们依赖内部机制自行处理好一切有关选取动作的事情——即无需额外编写任何代码去改变相应端子上的电压等级变化状况即可完成整个交互环节中的必要条件满足作业。不过需要注意的是,默认条件下可能不会像预期那样始终维持在一个固定的高位数值之上,所以有时仍需借助外部电路元件比如上拉电阻之类的手段加以辅助调整才行。 另外值得注意的一点就是关于初始化阶段里边涉及到的一些参数选项问题了。例如说CR1寄存器里面的`SSM位`用来决定是否启用上述提及过的那种全自动化的解决方案路径;而紧接着紧随其后的便是另一个叫做`SSI位`, 它主要负责指定当启用了前面那个特性之后究竟应该把默认初始值定为什么样子的形式呈现出来给我们看而已啦~ 下面给出了一段示范性的参考源码片段供您参考学习之用: ```c SPI_I2S_DeInit(SPI1); SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStruct.SPI_NSS = SPI_NSS_Hard;//这里选择了硬连线版本 SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStruct.SPI_CRCPolynomial = 7; SPI_Init(SPI1,&SPI_InitStruct ); // 启动SSM 和 设定SSI=1 SPI->CR1 |= (uint16_t)(SPI_CR1_SSI | SPI_CR1_SSM); ``` 以上内容涵盖了 STM32SPI 接口NSS 引脚的主要功能及其两种常见的配置方法介绍。希望这些信息能帮助理解并解决相关技术难题!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值