打印
[STM32F1]

USART波特率 vs SPI速率的比较

[复制链接]
1809|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
geraldbetty|  楼主 | 2024-2-28 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口和SPI内部时钟

在回答上面问题之前,需要先了解STM32内部时钟的概念,尤其是串口和SPI的内部时钟。
STM32里包含有系统时钟、AHB时钟和APB时钟。APB时钟来源于AHB,AHB时钟来源于系统时钟。


举个例子,当我们采集START信号的时候,实际上它要求采集到1110 x0x0x0 000这样固定的序列的时候才认为是一个起始信号。START信号在串口里是一个bit的低电平信号,我们用16倍的速率进行采样,首先它在前面会做一个下降沿检测,这个检测是要在前面的4个bit能检测到1110,硬件会对总线上的数据根据采样点一直进行检测,这里的采样点就是APB的时钟,串口挂在不同的APB上用的时钟不一样。采样的时候采集到1110就知道是一个下降沿,后面的x意思是任意的,后面的几个位中至少需要检测到三个0,而最后边的三个位需要是连续的三个0,这样才能被判定是一个起始位。其实只是判断了3、5、7、8、9、10这六个点,只要是0,就可以确认了。这里我们是以START信号为例,其他信号也是这样的。

可能有人会有疑问,x是任意的,不去检测,如果0不满足要求应该怎么办呢?

如果3、5、7、8、9、10这六个点都是0,那就可以认为这是一个起始信号;如果在3、5、7和8、9、10这两个阶段都满足至少有两个bit是0的话,那就可以确认它是起始信号,确认的意思是说它里面的接收缓冲区非空,标志位就已经置上了,承认这个信号,但是还要给一个NE的标志位,因为虽然承认了这个信号,但里面是存在噪声的。我们看串口的中断标志位的时候就可以看到,在它的错误事件里就有一个NOISE FLAG,这个位就表示当串口在接收的时候,在总线上检测到的电平并不是一个标准的、完整的高电平或者低电平,会有错误但不影响整个数据的接收,如果在接收的时候开启了EIE位,错误可以产生一个中断,让MCU对总线上的情况有一个了解。

SPI速率是不是应该和系统时钟一样?

其实不是,因为系统需要时间去获取采集到的数据,所以SPI的时钟分频系数最小是二分之一的分频,那么就是说SPI的速度是系统时钟的一半了。
有人觉得同步传输明显优于异步传输,因为有时钟线,传输速率会更高。
但其实这种说法并不是完全正确的,因为每一种传输方式都有自己的优势。比如串口有自动波特率的功能,就是说在接收的时候并不知道主机是按照什么样的波特率进行传输的,那就只能等主机发一个特定字节的数据过来并且检测数据的状态,然后自己硬件去设置波特率的寄存器,这样就可以在下一次传输的时候和主机使用相同的波特率。其次,在不同的温度范围内,内部的RC振荡器是有温漂的并且很大,最标准的校准方法是给它一个时钟沿,但是很多时候并没有这个时钟沿,那我们就可以用自动波特率。每次通讯的时候都采用自动波特率,就是每次都先接收,接收之后BRR寄存器里面的值就会随着温度的变化发生改变,MCU就可以根据BRR的值来调节HSITRIM。这个方法的好处是不需要提供一个非常标准的时钟,通过串口通讯这种异步的方式就可以把时钟信息传给单片机内部。

使用特权

评论回复
沙发
可怜的小弗朗士| | 2024-2-29 10:33 | 只看该作者
应该还是SPI的更快吧

使用特权

评论回复
板凳
digit0| | 2024-2-29 11:28 | 只看该作者
USART的波特率受制于其异步特性及器件内部时钟设置,一般较低

使用特权

评论回复
地板
LinkMe| | 2024-2-29 11:29 | 只看该作者
SPI是一种全双工同步串行通信协议,它有一个单独的时钟信号SCLK来控制数据传输的节奏,因此SPI的数据传输速率相对较高且更稳定。

使用特权

评论回复
5
理想阳| | 2024-2-29 11:29 | 只看该作者
SPI的速度取决于主设备生成的时钟频率以及数据位宽。

使用特权

评论回复
6
狄克爱老虎油| | 2024-2-29 17:44 | 只看该作者
spi比较快吧,毕竟是同步通信

使用特权

评论回复
7
FranklinUNK| | 2024-2-29 19:21 | 只看该作者
串口没法跟spi比吧

使用特权

评论回复
8
yangjiaxu| | 2024-2-29 21:51 | 只看该作者
怎么比较也是SPI的速率比较快吧

使用特权

评论回复
9
loutin| | 2024-3-1 19:57 | 只看该作者
USART的波特率受到内核时钟的限制,而SPI的速率不受此限制

使用特权

评论回复
10
burgessmaggie| | 2024-3-1 20:13 | 只看该作者
SPI是一种同步通信协议,它具有主从模式,通过主设备控制时钟信号来实现数据的传输。因此,SPI的速率可以直接由内核时钟决定,最快可以达到内核时钟的1/2。

使用特权

评论回复
11
sheflynn| | 2024-3-2 00:42 | 只看该作者
SPI的速率则直接由其时钟频率决定,这个时钟频率同样来源于系统时钟,但可以通过不同的分频设置来调整。SPI可以在更高的时钟频率下工作,因为它的数据传输是在时钟的每个上升沿或下降沿进行的,而不是在每个时钟周期发送一位数据。

使用特权

评论回复
12
timfordlare| | 2024-3-2 18:21 | 只看该作者
USART是异步通信,发送方和接收方有各自的时钟,只需要双方约定好相同的波特率即可通信。而SPI是同步通信,所有的设备都由一个主设备的时钟信号来同步数据传输。

使用特权

评论回复
13
abotomson| | 2024-3-3 11:58 | 只看该作者
不使用单独的时钟信号线进行同步,而是通过起始位和停止位来界定每个数据帧的开始和结束,双方需要设置相同的波特率才能正确同步。

使用特权

评论回复
14
olivem55arlowe| | 2024-3-3 14:30 | 只看该作者
USART的波特率是内核时钟的1/8或者1/16,而SPI最快的频率可以是内核时钟的1/2。这是因为USART是通过硬件流控来实现通信的,而SPI是通过时钟线来同步通信的。

使用特权

评论回复
15
hilahope| | 2024-3-3 16:30 | 只看该作者
内部的时钟系统包括系统时钟、AHB时钟和APB时钟,其中APB时钟又来源于AHB时钟,而AHB时钟则来源于系统时钟。这意味着,无论是USART还是SPI,它们的实际工作频率都受限于系统时钟。

使用特权

评论回复
16
zerorobert| | 2024-3-3 18:54 | 只看该作者
USART和SPI是两种不同的通信协议,它们的波特率和速率有所不同。

使用特权

评论回复
17
modesty3jonah| | 2024-3-3 22:22 | 只看该作者
因为异步通信机制以及额外的起始位、停止位和可能存在的校验位,实际有效数据传输速率会低于理论波特率。

使用特权

评论回复
18
bestwell| | 2024-3-4 12:39 | 只看该作者
USART由于其异步特性,更适合于低速、成本敏感型的应用,尤其是在长距离通信中更为常见。

使用特权

评论回复
19
burgessmaggie| | 2024-3-4 17:15 | 只看该作者
USART则必须逐位发送。然而,两者的最终速率还取决于具体的硬件实现和系统时钟的频率。

使用特权

评论回复
20
claretttt| | 2024-3-5 12:24 | 只看该作者
USART(通用同步异步收发器)和SPI(Serial Peripheral Interface,串行外设接口)是两种常用的嵌入式系统中的串行通信接口。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

1334

帖子

0

粉丝