You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于寄存器的SPI通信:数据传输移位问题排查求助

SPI从机数据随机1位右移故障排查与解决

问题背景

在NVIDIA Jetson Nano(主机,基于spidev Python库开发)与STM32F756ZG(从机,寄存器级裸机编程)的SPI连续收发场景中,初始传输周期数据正常,但运行一段时间后会随机出现数据1位右移的故障,且故障呈循环模式(移位后恢复正常,随后再次出现)。示波器监测主机端4条SPI信号线显示数据正常,推测问题出在从机端。核心疑问:是否需要在每个传输周期后清空相关缓冲区?

故障根源分析

1. 中断处理逻辑的致命错误

从机中断回调中存在时序错误:

SPI4->DR = 0;
data_rx[rx_buffer_head] = SPI4->DR;

SPI是全双工同步收发机制,写DR寄存器会触发一次空传输,紧接着读DR获取的是上一次传输的残留数据,而非当前主机发送的字节。这会导致接收数据整体错位,表现为1位右移的现象。

2. 手动清除RXNE标志无效

代码中手动通过SPI4->SR &= ~(0b1 << 0);清除RXNE标志,但根据STM32官方手册,RXNE标志仅能通过读取DR寄存器自动清除,手动写SR寄存器的操作无效,会导致中断重复触发,进一步打乱接收时序。

3. NSS配置冲突

SPI4_CR1中配置了SSM=1、SSI=1(软件NSS模式),但GPIO配置里将NSS引脚设为硬件输入模式。作为从机,应使用硬件NSS模式(SPI_CR1_SSM=0),否则外部CS信号无法正确触发从机的传输同步,导致帧同步错误,引发移位问题。

4. 缓冲区操作冗余

代码中data_rx[rx_buffer_head] = SPI4->DR; data[rx_buffer_head] = data_rx[rx_buffer_head]; data_rx[rx_buffer_head] = 0;属于冗余操作,虽不会直接导致移位,但会浪费CPU周期,可能影响中断响应时效。

解决方案

1. 修正中断处理逻辑

重新编写SPI4_IRQHandler,遵循先读再写的时序规则:

void SPI4_IRQHandler()
{
    // 处理接收中断
    if (SPI4->SR & SPI_SR_RXNE) { 
        // 先读DR,自动清除RXNE标志
        data[rx_buffer_head] = SPI4->DR;
        // 写DR准备下一次传输的应答字节(按需设置,示例用0)
        SPI4->DR = 0;
        
        if(rx_buffer_head == (BUFFER_SIZE - 1)) {
            counter++;
        }
        rx_buffer_head = (rx_buffer_head + 1) % BUFFER_SIZE;
    }
    // 处理错误中断
    if (SPI4->SR & (SPI_SR_OVR | SPI_SR_MODF | SPI_SR_CRCERR)) {
        // 溢出错误必须先读SR再读DR才能清除
        uint8_t dummy = SPI4->SR;
        dummy = SPI4->DR;
        // 清除其他错误标志
        SPI4->SR &= ~(SPI_SR_MODF | SPI_SR_CRCERR);
    }
}

2. 修正SPI NSS配置

修改spi_config中的CR1配置,启用硬件NSS模式:

SPI4->CR1 &= ~(0b11 << 8); // 清除SSM和SSI位,启用硬件NSS
SPI4->CR2 &= ~(0b1 << 2);  // 确保NSSP=0,匹配硬件NSS模式

3. 缓冲区操作优化

去掉冗余的data_rx中间赋值,直接将接收数据存入目标缓冲区,减少不必要的内存操作。

4. 关于缓冲区清空

不需要在每个传输周期后清空缓冲区。只要保证环形缓冲区的读写指针逻辑正确(rx_buffer_head循环更新),新数据会自动覆盖旧数据,不会因缓冲区残留导致移位问题。本次故障的核心原因是中断时序和寄存器操作错误,而非缓冲区残留。

验证建议

  1. 重新编译烧录从机代码后,测试连续传输,观察移位现象是否消失。
  2. 确认主机spidev设置的传输速率≤从机SPI时钟速率(从机当前分频为64,需匹配主机速率)。
  3. 核对GPIO引脚的AF配置(SPI4对应AF5,当前代码配置正确,可再次对照STM32引脚手册确认)。

内容的提问来源于stack exchange,提问作者Ahmad Serhal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:10:04