[其他ST产品] 求助:STM32 SPI做从机时SPI_SR TXE如何清空

[复制链接]
1899|26
 楼主| 麻花油条 发表于 2024-10-30 10:00 | 显示全部楼层 |阅读模式
stm32 spi做从机时,调用开始传输函数,如下:        if (HAL_SPI_Transmit_DMA(&spihdl, (uint8_t *)&op_cmd, sizeof(op_cmd)) != HAL_OK)
        {
            spi_halted();
        }


如果主机没响应此次传输,spi 从机想结束此次传输,调用结束函数,如下:
                HAL_StatusTypeDef  errorcode = HAL_SPI_Abort(&spihdl);

但是会有问题,SPI的状态寄存器 TXE 发送缓冲区非空,会导致后面传输异常。

目前尝试了很多办法,只有将SPI RESET才能清空,函数如下:
            HAL_SPI_DeInit(&spihdl);
            __HAL_RCC_SPI3_FORCE_RESET();
            __HAL_RCC_SPI3_RELEASE_RESET();
            HAL_SPI_Init(&spihdl);



请问有什么其它好的办法将SR->TXE清空?
一秒落纱 发表于 2024-12-15 21:44 | 显示全部楼层
SPI_SR寄存器中的TXE标志在STM32的SPI外设中,SPI_SR寄存器(状态寄存器)包含多个标志位,其中TXE(Transmit Buffer Empty)标志位表示发送缓冲区是否为空
三生万物 发表于 2024-12-16 02:00 | 显示全部楼层
正常来说,当TXE标志位为1时,表示发送缓冲区为空,可以写入新的数据

暖了夏天蓝了海 发表于 2024-12-16 03:00 | 显示全部楼层
正常来说,当TXE标志位为1时,表示发送缓冲区为空,可以写入新的数据

暖了夏天蓝了海 发表于 2024-12-16 03:00 | 显示全部楼层
SPI作为从机时,TXE标志位的清空通常不需要手动操作,因为TXE标志位会写入数据到SPI_DR寄存器: 当向SPI_DR寄存器写入数据时,TXE标志位会被自动清空

江河千里 发表于 2024-12-16 04:00 | 显示全部楼层
正常来说,当TXE标志位为1时,表示发送缓冲区为空,可以写入新的数据

江河千里 发表于 2024-12-16 04:00 | 显示全部楼层
当数据发送完成后,TXE标志位会被自动置位

别乱了阵脚 发表于 2024-12-16 05:00 | 显示全部楼层
配置SPI为从机模式。配置SPI的时钟、数据帧格式等参数

远山寻你 发表于 2024-12-16 06:00 | 显示全部楼层
配置SPI为从机模式。配置SPI的时钟、数据帧格式等参数

远山寻你 发表于 2024-12-16 06:00 | 显示全部楼层
使用轮询或中断方式等待TXE标志位被置位

光辉梦境 发表于 2024-12-16 07:00 | 显示全部楼层
配置SPI为从机模式。配置SPI的时钟、数据帧格式等参数

光辉梦境 发表于 2024-12-16 07:00 | 显示全部楼层
TXE标志位为1时,向SPI_DR寄存器写入数据。写入数据后,TXE标志位会被自动清空

冰春彩落下 发表于 2024-12-16 08:00 | 显示全部楼层
STM32中使用SPI作为从机时,TXE标志位的清空通常不需要手动操作,因为TXE标志位会在向SPI_DR寄存器写入数据时自动清空

淡漠安然 发表于 2024-12-16 09:00 | 显示全部楼层
通过正确配置SPI外设并使用适当的轮询或中断方式,可以确保数据传输的正确性

夜阑风雨 发表于 2024-12-16 10:00 | 显示全部楼层
正常你看看SPI的例程应该就有这个寄存器的操作了吧,一般都是正常自动清空的

暖了夏天蓝了海 发表于 2024-12-16 23:00 | 显示全部楼层
正常来说,当TXE标志位为1时,表示发送缓冲区为空,可以写入新的数据

申小林一号 发表于 2024-12-31 17:05 | 显示全部楼层
手册上好想有写
Wordsworth 发表于 2025-4-8 08:00 | 显示全部楼层
其实你可以通过在HAL_SPI_Abort调用前后,加入对SPI_CR1寄存器的手动操作,禁用传输来避免TXE问题。
Bblythe 发表于 2025-4-8 08:01 | 显示全部楼层
对TXE的清空其实可以通过SPI_I2S_ClearFlag来做,只是需要精确控制时机。
Pulitzer 发表于 2025-4-8 08:01 | 显示全部楼层
HAL_SPI_Abort函数调用后,如果没有强行清空TXE,后续的SPI传输可能会因为TXE不清而失败。你可以尝试调用SPI_ClearFlag(SPIx, SPI_FLAG_TXE);来手动清理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

308

主题

1743

帖子

3

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