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

SPI传输异常:数据不匹配与RX缓冲区满问题排查求助

SPI主机发送数据不匹配问题排查求助

我正在使用SPI传输数据,数据定义为uint8_t data[5] = {0xa,0xb,0xc,0xd,0xe};,但通过逻辑分析仪观察到输出数据不匹配,不清楚问题根源,现将代码及配置附上,请求协助排查。

自定义SPI发送函数

void SPI_Transmit (uint8_t *data, int size)
{
  SPI1->CR1 |= (1<<6);
  int i=0;
    while (i<size)
    {
       while (!((SPI1->SR)&(1<<1))) {};  // 等待TXE置位,表示发送缓冲区为空
       SPI1->DR = data[i];  // 将数据加载到数据寄存器
       i++;
    }   
    

//  通过读取DR和SR清除溢出标志

    while (!((SPI1->SR)&(1<<1))) {};  // 等待TXE置位,表示发送缓冲区为空
    while (((SPI1->SR)&(1<<7))) {};  // 等待BSY复位,表示SPI通信已结束   

  while (((SPI1->SR)&(1<<0))) 
  {
    uint8_t temp = SPI1->DR;
  }; 
      uint8_t   temp1 = SPI1->SR;
    
  SPI1->CR1 &= ~(1<<6);
}

我在传输时等待TX空标志置位及忙标志复位,传输完成后发现RX缓冲区(RXFIFO)已满且RX非空标志置位,因此需要读取数据寄存器直至RXNE复位。

我理解SPI通过寄存器移位通信,每发送一个数据就会对应接收一个数据,但我的通信为主机仅发送模式,仅使用MOSI引脚未使用MISO。我不解为何RX缓冲区仍有数据,即使未连接从设备测试时也是如此,状态寄存器显示RXNE=1、FRLVL=11。

按上述逻辑编写SPI发送函数后传输数据,逻辑分析仪显示数据不匹配,波特率为625.0KBits/s,采样率为2MS/s。

SPI初始化配置

static void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}

逻辑分析仪捕获的SPI波形

内容的提问来源于stack exchange,提问作者Karthikeyan Krishnanandan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:39:28