SPI-NSS软件模式和硬件模式

本文详细介绍了SPI的NSS(片选信号)在软件和硬件模式下的工作原理,包括硬输入/输出模式在主从模式中的配置,以及软件NSS如何允许GPIO作为普通IO使用。作者强调这仅是个人观点,鼓励读者讨论可能存在的差异。

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

SPI-NSS

SPI的NSS分为软件模式和硬件模式。
个人理解(大家可以互相讨论一下):
软件模式:就是通过普通GPIO去控制NSS的高低电平。
硬件模式:就是NSS连接的引脚使能复用功能,该引脚就不能作为一个普通IO来使用了,因为绑定了外设。

硬件nss

硬件NSS又分为hard_input和hard_output,即硬件NSS的输入输出模式。

hard_input模式

  • 主模式
    SPI主模式,SPI配置为Master,NSS配置为hard_input,NSS需要接一个GPIO去提供高电平(主模式NSS需持续为高,主NSS不与从NSS连接),然后正常配置数据发送(该模式下使能SPI接收中断可能会有问题,改原因暂时还未解决)。
  • 从模式
    SPI从模式,SPI配置为Slave,NSS配置为hard_input,NSS需要接一个GPIO去提供低电平(从模式NSS持续为低),使能接收中断,再中断函数中去给主机应答数据。

hard_output模式

该模式只能用作主机,SPI配置为Master,NSS配置为hard_output,NSS引脚与从机NSS连接。

  • 主机NSS无上拉电阻情况
    使能SPI外设后,主机的NSS持续拉低,不会变高,就算关闭SPI外设也没作用(有人说这是ST的BUG,但是我没找到相关资料,有资料的朋友可以评论分享下,谢谢!)。
  • 主机NSS加上拉电阻情况
    使能SPI外设后,主机的NSS拉低,关闭SPI外设后,NSS拉高。

软件NSS

软件NSS-主/从模式

配置SPI为Master/Slave,NSS配置为NSS_Soft,主机NSS引脚与从机NSS引脚连接,此时主机的NSS可以随意连接GPIO,与NSS绑定的GPIO也可用作普通IO使用,正常通过GPIO高点电平控制NSS低电平就可以对从机进行选中,然后进行通信。

  • 我没有试软件NSS(SPI_CR1的位9:SSM=1时),然后控制SPI_CR1的位8:SSI的1/0去控制NSS。

以上个人理解仅作为参考,大家如果有不同意见咱们可以讨论。

### 配置STM32 SPI_NSS软件控制模式 在STM32微控制器中,当需要通过软件来管理NSS信号时,可以按照以下方法进行配置: 对于SPI接口初始化结构体`SPI_InitTypeDef`中的成员变量`SPI_NSS`,应将其设置为`SPI_NSS_Soft`以启用软件管理模式[^1]。 下面是一个具体的例子展示如何实现这一配置。此代码片段展示了如何创建并初始化一个SPI外设实例,并设定其NSS引脚由软件控制而非硬件自动处理。 ```c #include "stm32f4xx_hal.h" // 定义SPI句柄 SPI_HandleTypeDef hspi1; void MX_SPI1_Init(void) { // 初始化参数结构体 hspi1.Instance = SPI1; // 设置SPI工作模式其他必要参数... // 关键部分:设置NSS软件控制模式 hspi1.Init.NSS = SPI_NSS_SOFT; // 使用软件管理NSS if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } } ``` 在此基础上,为了发送数据前激活从设备的选择线(即拉低NSS),以及完成传输后释放该选择线(即将NSS恢复高电平),可以在应用程序逻辑里加入相应的GPIO操作语句。通常情况下,在每次通信之前手动将NSS置位或复位即可达到目的。 例如,在执行一次完整的SPI事务期间,可以通过调用如下形式的功能函数来进行NSS的手动切换: ```c #define NSS_PIN GPIO_PIN_x // 替换成实际使用的PIN号 #define NSS_PORT GPIOA // 或者其他端口,取决于具体电路设计 static inline void SelectSlaveDevice(void) { HAL_GPIO_WritePin(NSS_PORT, NSS_PIN, GPIO_PIN_RESET); } static inline void DeselectSlaveDevice(void) { HAL_GPIO_WritePin(NSS_PORT, NSS_PIN, GPIO_PIN_SET); } ``` 上述代码段提供了两个简单的内联辅助函数用于分别选通取消选通外部器件。这些函数应该被放置在整个SPI交互过程的适当位置处调用,比如在一个典型的读取或写入命令序列前后。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值