数码之家

 找回密码
 立即注册
搜索
查看: 9319|回复: 26

[STM] 实验证明,STM32F103的SPI响应时间是能在指令级别时间粒度感知到的

[复制链接]
发表于 2021-9-17 15:40:27 | 显示全部楼层
1、如果你要连续写入数据,应该判断发送缓冲器空闲标志(TXE)而不是判断BUSY位。
2、BUSY位状态不止和是否发送完成有关,还和其他因素有关,具体要看设置。
3、
当时你可以通过Keil的外设窗口看到SPI_SR的寄存器是有TXE和RXNE置位的,证明这次读取出错了。
TXE为1表示发送缓冲区为空,可以继续往里发送数据。RXNE为1表示接收缓冲区非空。不知道你说的证明读取出错什么意思?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
家睦 + 20 歡迎探討

查看全部打赏

回复 支持 2 反对 0

使用道具 举报

发表于 2021-9-18 09:52:51 | 显示全部楼层
la45088d1 发表于 2021-9-18 00:52
所以我通读了原版数据手册,发现在我的设置下读取busy就是可以达成数据不冲突的目的,所以没关系。
这次 ...

1、手册明确说明不应用BUSY位来处理发送接收,BUSY位应该用来确定SPI是否全部发送完成。只有BUSY位=0才可以拉高片选CS或者关闭SPI,否则可能导致最后一个数据传输不完整。
2、你一直强调读取SR错误,在我看来寄存器是0x02但是读到是0x00这叫读取错误。你这里我认为你读到0X00的时候寄存器本身就是0x00。所以我认为读取没有错误。
3、关于读取错误的验证:你用之前不加NOP的代码连续发两三个数据,不要循环发,直接写。然后断点放到第二或者第三个数据的相同位置,看看读取SR是不是0x81或者0x01(RXNE=1)。如果是说明读取没问题。
4、不知道你有没有去研究SPI发送逻辑。BUSY位:当发送缓冲区和移位寄存器都没有数据的时候=0。
TXE  位:当发送缓冲区没有数据时候=1。
SPI发送过程(第一个数据,按照你判断BUSY位的操作):
>SPI开启                                             ------BUSY=0,TXE=0,RXNE=0。
>软件向发送缓冲区写入数据。                -----BUSY=0,TXE=1,RXNE=0。
>SPI硬件将缓冲区数据转入移位寄存器    ------BUSY=0,TXE=0,RXNE=0。
>SPI硬件开始将缓冲区数据发出              ------BUSY=1,TXE=1,RXNE=0。
>数据发送完成                                      ------BUSY=0,TXE=1,RXNE=1。
>第二个数据写入缓冲区
。。。。。。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-18 10:00:39 | 显示全部楼层
忘了说了,你固定加4个NOP再去读取SR判断。
有兴趣的话你可以用控制变量法测试下:最低SPI速率,最高SPI速率,最低系统时钟,最高系统时钟这四个不同组合的情况是不是都没问题。
回复 支持 反对

使用道具 举报

发表于 2021-9-18 10:48:27 | 显示全部楼层
la45088d1 发表于 2021-9-18 10:15
事实上就是错了,你自己看我截的图,读到0x00时Keil的监视窗显示TXE=1,RXNE=1,这很明显读取结果不可能是 ...

没什么雷不雷,根本原因还是你判断的标志位选择错误。用TXE怎么样都不会错,因为只有缓冲区为空才置位,只要为空你就可以写入数据,就不会错误。

至于内核寄存器和外设寄存器的值不一致,这个要逐周期分析。
简单说就是JTAG读取这些寄存器需要时间,读取不同寄存器是有时间差的。
JTAG速率和运行速率、外设速率这些都会影响两个寄存器之间的时间差,时间差得太多,结果不一样也正常。因为keil中断只是系统层面,这些寄存器都是硬件层面的。比如只要移位寄存器有数据就会发送出去,你在keil里并不能中断。
几个时钟周期的事用keil分析我认为不准确。
回复 支持 反对

使用道具 举报

发表于 2021-9-18 10:53:43 | 显示全部楼层
crazy0qwer 发表于 2021-9-18 10:48
没什么雷不雷,根本原因还是你判断的标志位选择错误。用TXE怎么样都不会错,因为只有缓冲区为空才置位, ...

补充一下:
这些标志位也都是硬件层面,无法通过keil中断。
而keil上的显示,你中断后就不会更新了,但是硬件有可能还在更新。需要运行一步keil才会去更新寄存器值。
所以说有可能你中断看到的值和实际值不一样。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-7 14:46 , Processed in 0.140400 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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