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

STM32H562RG SPI传输提速及EOT检测故障排查技术咨询

STM32H562RG SPI3传输卡滞与速度优化问题

测试数据与需求

  • 250MHz主频下,SPI传输2个8位数据耗时约600个CPU周期(≈2.5μs),需完成4次该传输,总耗时约10μs,但SPI传输占用了配合I2S工作时的一半采样时间
  • SPI当前运行在31MHz,受串联的两片74HC595芯片速度限制,无法进一步提速

硬件与SPI寄存器配置

使用STM32H562RG,SPI3仅工作在发送模式,对应引脚为PB3(SCK)和PB5(MOSI)。Cube IDE中SPI处于禁用状态,通过寄存器手动配置如下:

/* USER CODE BEGIN 2 */
  HAL_I2SEx_TransmitReceive_DMA(&hi2s1, txBuf, rxBuf, 2);
  HAL_TIM_Base_Start_IT(&htim15);
  HAL_TIM_Base_Start_IT(&htim16);
  HAL_TIM_Base_Start_IT(&htim17);

  //DWT配置
  CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
  DWT->CYCCNT = 0;
  DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

  //SPI3配置
  //启用SPI3时钟
  __HAL_RCC_SPI3_CLK_ENABLE();
  
  //配置PB3和PB5为复用功能模式
  GPIOB->MODER  = ( GPIOB->MODER  & 0b11111111111111111111001100111111 ) | 0b00000000000000000000100010000000;
  
  //PB3(SCK)设置为AF6,PB5(MOSI)设置为AF7
  GPIOB->AFR[0] = ( GPIOB->AFR[0] & 0b11111111000011110000111111111111 ) | 0b00000000011100000110000000000000;
  
  //配置预分频器为/2,数据宽度8位
  SPI3->CFG1 = 0b00000000000000000000000000000111;
  
  //配置AFCNTR=1,CPOL=0,CPHA=0,MSB优先,主模式,Motorola协议,单工发送,无引脚交换
  SPI3->CFG2 = 0b10000100010000100000000000000000;
/* USER CODE END 2 */

传输代码实现

调用逻辑

void writeRam ( uint32_t address, int32_t value )
{
    address *= 2;
    (void)transmit( ( address >> 8 ) & 0xFF );
    (void)transmit( address & 0xFF );

    (...)
}

核心传输函数

void transmit(uint8_t data)
{
    SPI3->IFCR |= BIT(3);   // 清除EOT标志
    SPI3->IFCR |= BIT(4);   // 清除TXTF标志

    SPI3->CR2 = 1;          // 设置传输长度为1
    SPI3->CR1 |= BIT(0);    // 启用SPI
    SPI3->CR1 |= BIT(9);    // 启动传输

    SPI3->TXDR = data;      // 加载数据到FIFO

    // 添加延迟
    for ( uint32_t x = 0; x < 128; x++ )
    {
        asm volatile("add r0,r0,1":::"memory");
        asm volatile("sub r0,r0,1":::"memory");
    }   
    
    while ( !( SPI3->SR & BIT(3) ) );   // 卡在此处无法跳出 :(

    SPI3->CR1 &= ~BIT(0);     // 禁用SPI
}

当前问题与已尝试方案

  • 手动寄存器配置SPI未成功,传输函数卡在等待EOT标志的循环中
  • 查阅芯片勘误文档,得知存在EOT检测问题,尝试官方给出的两种workaround后仍无效
  • 调整APB1时钟为62.5MHz(4分频),SPI频率设为31.5MHz(2分频)以降低PCLK与SPI频率的比值,并添加延迟,问题依旧

提问:如何优化SPI传输速度的同时,解决EOT检测卡滞的问题?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:24:57