OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 478|回复: 6

求助:STM32 SPI做从机时SPI_SR TXE如何清空

[复制链接]

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2019-12-2
在线时间
27 小时
发表于 2024-8-30 10:57:05 | 显示全部楼层 |阅读模式
1金钱
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清空?



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2024-8-31 22:35:08 | 显示全部楼层
帮顶,论坛之前有网友发过SPI 从机例程,你可以参考下他的处理方式看看,搜索相关帖子
回复

使用道具 举报

4

主题

881

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4195
金钱
4195
注册时间
2019-9-4
在线时间
881 小时
发表于 2024-9-2 11:26:36 | 显示全部楼层
怀疑是不是DR寄存器上的值放到移位寄存器导致的?那可能要想办法清掉移位寄存器的值
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2019-12-2
在线时间
27 小时
 楼主| 发表于 2024-9-2 17:26:27 | 显示全部楼层
A571157242 发表于 2024-9-2 11:26
怀疑是不是DR寄存器上的值放到移位寄存器导致的?那可能要想办法清掉移位寄存器的值

嗯嗯,暂没有找到能清空的办法。
如果作为主机,主动触发让它发送完就会清空;但作为从机,需要依赖外部主机发clk过来才能清空。
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2671
金钱
2671
注册时间
2018-11-8
在线时间
430 小时
发表于 2024-9-2 20:19:26 | 显示全部楼层
没用过从机功能 不过TXE标志的清空是通过向DR寄存器写值完成的 跟时钟来源无关 你可以试试想主动清TXE时加一句SPI1->DR = 0xFF;
或者把0xFF改成想主动发的第一个值
回复

使用道具 举报

4

主题

881

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4195
金钱
4195
注册时间
2019-9-4
在线时间
881 小时
发表于 2024-9-3 10:51:15 | 显示全部楼层
babyrabbit 发表于 2024-9-2 20:19
没用过从机功能 不过TXE标志的清空是通过向DR寄存器写值完成的 跟时钟来源无关 你可以试试想主动清TXE时加 ...

他这个问题感觉大概率不是TXE没清空的问题,而是移位寄存器里有数据的问题。正常流程是DR寄存器里的数值发送到移位寄存器之后,TXE置一,而移位寄存器里的值应该是要等CLK来将其发送出去,因为是从机没有CLK来,数据可能卡在移位寄存器了,导致后面正常通信的时候,前面移位寄存器的值影响到了
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2019-12-2
在线时间
27 小时
 楼主| 发表于 2024-9-4 21:30:25 | 显示全部楼层
A571157242 发表于 2024-9-3 10:51
他这个问题感觉大概率不是TXE没清空的问题,而是移位寄存器里有数据的问题。正常流程是DR寄存器里的数值 ...

TXE读到的一直是发送缓冲区非空。另外是不是需要有clk才会把DR的数据往移位寄存器里放吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 06:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表