硬汉嵌入式论坛

 找回密码
 立即注册
查看: 673|回复: 6
收起左侧

[SPI/QSPI] 不要滥用STM32 SPI 硬件NSS

[复制链接]

6

主题

30

回帖

48

积分

新手上路

积分
48
发表于 2026-1-20 10:40:25 | 显示全部楼层 |阅读模式
本帖最后由 VDVA 于 2026-1-20 10:52 编辑

不要滥用STM32 SPI 硬件NSS
自从我使用STM32H7 芯片以来,我都非常喜欢使用STM32H7 SPI 的硬件NSS 功能,应为只要配置成功,就全部交割给硬件,他会根据我的配置,生成想要的波形,加上定时器和 DMAMUX ,非常爽,基本不需要软件参与
由于使用的很开心,后续慢慢的将一些慢速AD,比如ADS1220 等都改成了硬件NSS,后续的一些阻塞式的SPI ,也都直接写硬件NSS 的驱动了,省事省力,慢慢就把软件NSS 忽略掉了,形成了路径依赖
问题
在某一天,硬件那边反馈说你的ADS1220 驱动有问题,4个通道测试会有错误数据,重复上一通道数据
于是我就进行排查
问题不经常出现,可能很长事件才出现一次异常
而且关掉一个频繁的中断基本问题就不在发生,我很疑惑,就算被中断打断,他是硬件SPI,也不应该影响它工作,通过努力捕获到NSS 有以下波形,发现插入一个小的横线,我就开始怀疑芯片的问题,怀疑有BUG
因为干扰不会出现这样的问题

问题定位
我从 采集 流程入手
ADS1220 采集分为以下几个操作
配置通道 (写寄存器(指令)(8bit)  → 寄存器内容(更改通道)) —> 启动采集(指令)(8bit) —>等待ready 引脚变化  —>读取数据(3*8bit(24 bit))如此循环4次即可采集到所有通道数据

正常波形如图

异常波形如图

终于定位到问题了
当中断来时,如果正在配置通道时被打断
    if (HAL_SPI_Transmit(hspi, arr, 2, 100) != HAL_OK)    {        
// 错误处理 - 可以添加错误日志或错误状态设置      
  //
Error_Handler();
   }
他会导致 先传输一个8bit 拉高NSS ,后续被中断恢复后,在传输后一个字节即通道配置字节,导致通道配置没有写入
SPI 帧的要求是这样的

NSS 必须连续
总结
对于硬件NSS 来说,要时刻关注被中断打断的情况,NSS 会自动拉高,下一个字节在自动拉低导致出现问题,定位问题非常费劲,问题有偶发性,如果中断频繁容易出错,问题不频繁可能永远不会出现问题,但是一旦出现问题就会非常麻烦所以非必要时还是使用软件NSS ,对于低速的设备,稳定很重要,对于高速的再配合NSS 和循环DMA 基本不会出现问题可能还有别的办法解决,比如更改HAL 库,或者 将8bit 改成16bit 也能解决问题,使得数据连续但是麻烦,还不如更改软件NSS 来的快和方便,而且大家写的驱动也都有相应的拉低NSS操作,也便于移植


企业微信截图_17685425438158.jpg
企业微信截图_17688089532730.png
企业微信截图_17688090896179.png
回复

使用道具 举报

9

主题

45

回帖

72

积分

初级会员

积分
72
发表于 2026-1-20 14:35:50 | 显示全部楼层
使用DMA应该就不会有问题吧
回复

使用道具 举报

22

主题

122

回帖

188

积分

初级会员

积分
188
发表于 2026-1-20 14:48:24 | 显示全部楼层
图片我这加载不出来,是我网的问题吗?
回复

使用道具 举报

6

主题

30

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2026-1-20 16:12:33 | 显示全部楼层
Yhlr 发表于 2026-1-20 14:35
使用DMA应该就不会有问题吧

DMA 没有问题,但是,一旦涉及到 普通的阻塞式的,或者连续读 N个数据,或者只有先写后写才会有效的就要注意,小心不要被中断打断
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
发表于 2026-1-20 17:39:35 | 显示全部楼层
用硬件NSS就配合上DMA,基本没遇到过你说的问题
回复

使用道具 举报

7

主题

167

回帖

188

积分

初级会员

积分
188
发表于 2026-1-21 10:53:27 | 显示全部楼层
有些MCU的硬件NSS会传输一个数据拉低一次,非常频繁,看起来跟始终信号一样,甚至都通信异常,软件拉低传输完成再拉高靠谱多了,就是不能实现连续或者高速传输了
回复

使用道具 举报

18

主题

136

回帖

190

积分

初级会员

积分
190
发表于 2026-1-23 14:47:36 | 显示全部楼层
死不低头 发表于 2026-1-21 10:53
有些MCU的硬件NSS会传输一个数据拉低一次,非常频繁,看起来跟始终信号一样,甚至都通信异常,软件拉低传输 ...

之前用M4的MCU出现过这个问题。有的芯片必须要有NSS的高低电平跳变才可以使用,但是开了SPI的脉冲,每发送一个字节都会插入一个高电平,使从机芯片进入中断模式,导致数据传输失败,但是换到M7之后就没这个问题了,也挺恼火的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-2-24 15:01 , Processed in 0.209530 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表