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
相关产品推荐
相关产品推荐

