|
|
本帖最后由 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操作,也便于移植
|
|