|
01前言 某客户开发一款高精度工业测量仪器,打算使用 STM32H7+外置高精度 ADC 采样的分离方案来实现。客户选取了一款所属行业内比较通用的 ADC 采样芯片。在读取该 ADC 芯片手册后,客户发现该款 ADC 采样芯片使用 MCU 标准 SPI 与之通信存在问题,手册里面也推荐使用 DSP/FPGA 的来实现,客户一下就犯难了。为了降低成本和开发周期,客户想使用 MCU 来替代 DSP/FPGA 与 ADC 采样芯片的高速通信。 $ B1 R# ], t2 O" S% w + \/ D/ T% a/ J' D) { 02现场调研与问题分析 . N. N' K8 T% q3 u# O" f 根据客户提供的信号采集板上使用的 ADC 数据手册及现场反馈: 1.该 ADC 转换芯片 DataSheet 提供的通信接口参考设计如下: 7 |# j! U& Z) R2 w2 U2 ^# t3 E
2. 该 ADC 采样芯片工作于 Master 模式,DSP/FPGA 工作于 Slave 模式,其通信时序如下 图所示。# y5 Z" l; t7 ]# ~8 J- J 在 DRDY 信号的下降沿通过 DOUT0~DOUT7 引脚将数据输出到 DSP/FPGA。客户使用 STM32H7 的 SPI Slave 模式与该 IC 进行通信,采用 Software NSS 工作模式来接收 Master 的数据。5 f& @ Q' P6 U& T) i+ L" X
在连续采样模式下(Master 不间断采样),STM32H7 接收数据正常,其通信时序如下图所示。 : u3 e0 @$ W" w# a
4 c. I* N2 z; z& u) z: b' E 但是,当 Master 停止采样时,DCLK 仍然会一直工作发出工作时钟。此时,STM32H7 的 SPI 做 Slave 在 Stop 期间仍然会收到数据(无效干扰数据)。此数据会造成 Slave 端接收数据失序,如下图所示。 ( F- Y& ?- s! H: s
03问题分析与解决 K/ `6 Y4 U$ p 显然使用标准 SPI 与该芯片进行通信是行不通的,再次聚焦到客户 DRDY 信号并未使用和充分利用,能否利用 DRDY 信号来滤除 Stop 期间的干扰信号呢? , J$ h) O$ m8 _$ R+ w * C# g( B7 ]6 F4 b7 G" z 笔者也再次查阅 RM 后发现 STM32H7 的 SPI NSS 脉冲模式(RM 中称为 TI 模式)。在本文中统称为 NSS 脉冲模式,STM32H7 的 NSS 脉冲模式其核心要点如下:2 C3 T' q- ?* }4 {4 Q0 ~3 ^ 7 x9 P( y3 ^+ Z6 ` 1. 通过设置 SPI_CFG2 寄存器的 SP[2:0]位来使能 SPI 工作在 NSS 脉冲模式,当 SPI 工作于 脉冲模式时,SCK 和 SS 引脚的信号极性、相位、字节序是固定的,不需要配置 CPOL, CPHA, LSBFRST, SSOM, SSOE, SSIOP 和 SSM 相关寄存器位。7 P; A3 S4 ^7 u: s ' c0 w5 j& Z5 L8 G4 i 2. SPI NSS 脉冲模式通信时序如下图,与标准 SPI 通信相比差异如下:" g/ H2 H9 m' r9 A0 x + \2 ?, Y6 I" p 启动数据传输前,NSS 会被拉高并维持一个时钟周期(NSS 脉冲)。 数据帧的传输过程起止于 2 个 NSS 脉冲之间(前一帧 LSB 开始拉高 SS,前一帧 LSB 结束后 拉低 NSS 开始下一帧传输)。 在时钟 SCK 的上升沿开始发送数据,在时钟 SCK 的下降沿进行采样和接收。 所以,STM32H7 的 SPI 的 NSS 脉冲模式时序刚好与该 ADC 芯片是匹配的。 0 G9 M7 w- b. y
那么我们将客户的接法进行改进,并配置 STM32H7 的 SPI 工作于 NSS 脉冲模式,经过客户反复验证工作正常。/ Q8 ^6 Q9 K8 M& h/ Y' \% B$ G8 n4 j
( _/ } Z1 u3 y9 P$ i. m 转载自: STM32; C: |+ M. m! ]$ W+ G# n# G 如有侵权请联系删除$ x# ~7 N# q, [# E |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版