STM32 SPI——(2)NSS

本文详细解析了STM32中SPI接口的NSS信号如何实现片选功能,包括其在主从模式下的软件及硬件配置方法,并通过一个SPI1与SPI2全双工通信的例子展示了具体的配置步骤。

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

这个NSS到底是怎么作用呢?回答是片选。 


     主设备和从设备在进行SPI通信的时候,从设备都有个CS片选信号,低电平有效,我们通常都要用这个NSS连到从设备的CS上。但是这里只是大体让大家大体明白怎么回事,东西很多,关于这个NSS,还有很多东西呢,下面让我娓娓道来。
     先看输入输出模式. 
     对于每个SPI的NSS可以输入,也可以输出。所谓输入,就是NSS的电平信号给自己,所谓输出,就是将NSS的电平信号发送出去,给从机。配置为输出,还是不输出,我们可以通过SPI_CR2寄存器的SSOE位。当SSOE为1时,并且SPI处于主模式控制时,NSS就输出低电平,也就是拉低,因此当其他SPI设备的NSS引脚与它相连,必然接收到低电平,则片选成功,都成为从设备了。NSS的输出就介绍到这里      下面介绍NSS的输入。 
     我们都知道NSS输入又分为硬件输入和软件控制输入两种模式,那么就从这两种模式入手,来揭开它的面纱吧。   
      先说软件模式吧。 
     1、 对于SPI主机来说,需要设置SPI_CR1寄存器的SSM为1和SSI位为1,SSM为1是为了使能软件管理。,NSS有内部和外部引脚。这时候,外部引脚留作他用(可以用来作为GPIO驱动从设备的片选信号)。内部NSS引脚电平则通过SPI_CRL寄存器的SSI位来驱动。SSI位为1是为了使NSS内电平为高电平。这时候,不免产生疑问,为什么主设备的内部NSS电平要为1呢? STM32手册上说,要保持MSTR和SPE位为1,也就是说要保持主机模式,只有NSS接到高电平信号时,这两位才能保持置1.也就是说对于STM32的SPI,要保持为主机状态,内部输入的NSS电平必须为高。当然这里在硬件模式下也是如此。      2、 对于SPI 从机来说  主机自己的内部NSS高电平解决了,那么SPI从机的NSS片选低电平也得解决啊。 如果从机选择STM32的一个SPI,譬如主机选为SPI1,从机选为SPI2,则要按照以下操作 手册说,NSS引脚在完成字节传输之前必须连接到一个低电平信号。在软件模式下,则需要设置SPI_CR1寄存器的SSM位为1(软件管理使能)和SSI位为0.果然如此。SSI必须要为0,也就是SPI2的片选为低,则片选成功。 若从机为一个其他的SPI芯片,譬如我那个ADXL345加速度传感器。那么,我们可以有两种方法 
一种方法,是把芯片的CS接到GND上,另一种方法是,用一个GPIO口去输出低电平来控制CS片选成功。这个GPIO可以是任何一个GPIO口,当然我们上面提到当SPI的主机配置为软件模式,外部NSS引脚留作他用了,它就是一个GPIO了,我们也可以用它。这时候,我们可以设置它推挽输出为低电平,然后用线跟从机的CS相连,那么就可以片选从芯片了。 
再说说硬件模式。
对于主机,我们的NSS可以直接接到高电平,对于从机,NSS接低就可以。 
当然我们上面提过当一个主机的SSOE为1时,主机工作在输出模式,而且NSS拉低了,我们要让从机片选,只要将CS接到主机的NSS上,CS自动拉低。
这便是,ST公司设计的STM32 SPI NSS的工作流程。下面用实例向大家介绍。 
我们介绍一个STM32上SPI1和SPI2全双工通信的程序。这里只介绍SPI配置方面的程序。
 /* SPI1 Config -------------------------------------------------------------/ 
 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master,//这里设置SPI1为主模式,设置SSI为1  
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  
  SPI_InitStructure.  SPI_CPOL = SPI_CPOL_Low;   
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; 
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//这里设置SSM为1,软件管理  
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;  
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;   
  SPI_InitStructure.SPI_CRCPolynomial = 7;   
  SPI_Init(SPI1, &SPI_InitStructure);  
  /* SPI2 Config -------------------------------------------------------------*/   
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;//这里设置SPI2为从模式SSI为0   //因为SPI2和SPI1用的是同一个SPI_InitStructure,所以SSM位已经为1  
  SPI_Init(SPI2, &SPI_InitStructure); 
对于SPI2的配置,和SPI1用的是同一个结构体,只需要把模式和SSI一改就行,其他的譬如软件使能,还有时序什么的都不用改。这样SPI1和SPI2就配置好了。以后就可以传输数据了。


### 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 引脚的主要功能及其两种常见的配置方法介绍。希望这些信息能帮助理解并解决相关技术难题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值