[信息] LAT1525 STM32H7 SPI通信的Underrun特性介绍

[复制链接]
378|10
STM新闻官 发表于 2025-10-29 22:52 | 显示全部楼层 |阅读模式
, , , ,
本帖最后由 STM新闻官 于 2025-11-1 19:04 编辑

1. 前言
在 SPI 通讯中,从器件借助主器件提供时钟信号进行发送和接收,收发的时刻由主器件进行控制。在从器件发送模式下,如果主器件的时钟信号已经到来,但是从器件还没有准备好要发送的数据(没有将数据放入 TXFIFO 中),就会发生下溢。若能够正确合理的检测到下溢,并对其进行处理,可以提供数据传输的可靠性。
在 STM32H7 中可以配置下溢检测的位置,下面以 STM32H723 芯片为蓝本进行介绍。

2. 通信格式
我们先理解下 SPI 的时钟相位和极性控制,时钟可以设置为四种基本配置之一。CPOL和 CPHA 两个位的组合控制时钟信号的极性和相位。
•  CPOL(时钟极性):SCK 引脚空闲状态时的电平状态。
o  CPOL=0 : SCK 引脚空闲为低电平
o  CPOL=1 : SCK 引脚空闲为高电平
•  CPHA(时钟相位):定义了哪个时钟边沿用于数据采样或移位(如下图所示)。
o  CPHA=0 : 数据位在奇数时钟边沿采样,偶数时钟边沿或之后将下一个数据位移到数据线上。
o  CPHA=1 : 奇数时钟边沿或之后将当前数据位移到数据线上,数据位在偶数时钟边沿采样。

26145690229f36099e.png

3. 下溢检测
SPI(串行外设接口)从机下溢是一种在 SPI 通信中常见的错误情况,通常发生在从器件(从机)未能及时提供数据给主器件(主机)时。
为了适应多种工作场景,STM32H7 可以通过 SPI_CFG1 寄存器的 UDRDET 字段来配置从机在发送模式下检测下溢的时刻。
在从器件发送模式下,如果在 UDRDET 位指定的时刻,从器件 TxFIFO 中没有数据可用于发送,则会由硬件在内部捕获下溢情况。
但是要注意,由于硬件传播延迟,UDR 事件发生后会在几个 SPI 时钟周期后才能检测到 UDR 事件发生(或者产生 UDR 事件中断)。  
下面针对这几个检测的位置做一个简单介绍。

3.1. UDRDET = 0
当 UDRDET=0 的时候,在主器件发出新的数据帧时(开始为新的帧提供时钟信号时),从器件会检测 TXFIFO 是否为空。当 TXFIFO 为空时,会产生下溢事件,slave 会发送一个 dummy 数据,如果不清除 SR 寄存器的 UDR 状态位,后续会发送 underrun pattern 数据(由 UDRCFG 字段进行定义)
如下图所示,在第二帧开始的时候,TXFIFO已经为空了,此时会产生下溢(underrun)事件,但是由于UDR(underrun)事件传播需要占用几个SPI时钟周期,所以看到在实线位置处才能实际检测到UDR事件发生(或者产生UDR事件中断)。Slave在第二帧发送的时dummy数据,第三帧及之后发送都是underrun pattern数据。
图2. UDRDET = 0
589726905e898c69cd.png
3.2. UDRDET = 1 当UDRDET=1的时候,在上一帧通讯结束的时候(TXFIFO变为空时),从器件会检测TXFIFO是否为空。 这时候会有两种情况: 1. 在刚开始传输时TXFIFO就为空(第一帧)。由于TXFIFO为空,产生下溢事件。没有可用数据可以发送,此时slave会先发送dummy数据,如果不清除SR寄存器的UDR状态位,则后面会发送underrun pattern数据(由UDRCFG字段进行定义)。 如下图所示,在第一帧时TXFIFO就为空,此时会产生UDR(underrun,下溢)事件,由于UDR事件传播需要占用几个SPI时钟周期,所以看到在实线位置处才能实际检测到UDR事件发生(或者产生UDR事件中断)。所以slave在第一帧会发送dummy数据,第二帧及后续都发送underrun pattern数据(由UDRCFG字段进行定义)。

图3. UDRDET=1并且在开始传输时TXFIFO为空

922446905e8c230abd.png


2. 在传输过程中TXFIFO变为空的情况。当TXFIFO变为空的时候,会产生下溢事件,slave会发送underrun pattern 数据(由UDRCFG字段进行定义)。 如下图所示,在第一帧发送时TXFIFO变为空,由于UDR(underrun)事件传播需要占用几个SPI时钟周期,所以看到在实线位置处才能实际检测到UDR事件发生(或者产生UDR事件中断)。Slave会在检测到UDR事件后发送underrun pattern 数据(由UDRCFG字段进行定义)。
图4. UDRDET=1并且在传输过程中TXFIFO变为空

957276905e91b993ce.png

3.3. UDRDET = 2 当UDRDET=2的时候,在激活SS信号时就开始检测是否产生了下溢。当检测到下溢事件之后,如果SS信号没有翻转过的话,在每帧之后都会产生下溢事件(即使在已经清除了SR寄存器的UDR位和TXFIFO不为空的情况下)。 如下图所示,在SS为低(激活SS信号)时,TXFIFO为空,所以会产生下溢事件(虚线位置),由于UDR事件传播需要占用几个SPI时钟周期,所以在实线位置处才能实际检测到UDR事件发生(或者产生UDR事件中断)。所以slave在第一帧会及后续都发送underrun pattern 数据(由UDRCFG字段进行定义)。
图5. UDRDET = 2

636816905e93916d87.png


4. 小结
因为客户在使用过程中遇到过由于下溢检测位置的配置导致的问题,借此机会在此做些分享,旨在帮助大家理解STM32H7的下溢检测特性及功能,供大家在实际应用中灵活使用。


xiaoqizi 发表于 2025-11-4 19:11 | 显示全部楼层
从机Underrun是一种常见错误,指主器件时钟已触发但从器件未及时将数据放入发送缓冲区,导致数据传输异常

木木guainv 发表于 2025-11-4 21:41 | 显示全部楼层
在从机发送模式下,若主设备时钟信号到达时,从机的TXFIFO为空,即发生下溢
Jiangxiaopi 发表于 2025-11-5 09:18 | 显示全部楼层
通过 SPI_CFG1寄存器的UDRDET字段 配置下溢检测时机
荣陶陶 发表于 2025-11-5 11:42 | 显示全部楼层
因硬件传播延迟,实际检测到UDR事件需等待数个SPI时钟周期
Zhiniaocun 发表于 2025-11-5 14:13 | 显示全部楼层
合理设置[size=0.875]UDRDET可提前拦截空TXFIFO状态,避免无效数据传输
Zuocidian 发表于 2025-11-5 16:42 | 显示全部楼层
因硬件传播延迟,实际检测到UDR事件需等待数个SPI时钟周期
Puchou 发表于 2025-11-5 19:06 | 显示全部楼层
通过 SPI_CFG1寄存器的UDRDET字段 配置下溢检测时机
Xiashiqi 发表于 2025-11-5 21:26 | 显示全部楼层
使能UDR中断([size=0.875]SPI_CR2寄存器),在中断服务函数中:
清除状态标志([size=0.875]SPI_SR寄存器的UDR=0);
重新填充TXFIFO或切换至安全模式
小海师 发表于 2025-11-6 07:24 | 显示全部楼层
UDRDET=0:当主设备启动新数据帧时,立即检测TXFIFO是否为空。若为空则触发UDR事件,并发送预定义填充数据
Haizangwang 发表于 2025-11-6 09:42 | 显示全部楼层
通过[size=0.875]UDRCFG选择填充值(如0xFF),确保通信连续性
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1428

主题

1758

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部