如果您在使用STM32的时候,恰好缺少一个SPI接口,同时片上的资源还有多余的USART(一般来说,USART的接口都较丰富,比如STM32L0系列的产品),我们完全可以用USART来替代SPI,效果非常不错。
本文将向大家介绍如何把USART当做SPI来用。
USART是指全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。那么,它与UART有什么区别呢?它的硬件连接方式是怎样的?该如何使能USART的SPI模式?把USART当做SPI来使用的时候和标准的SPI有什么区别,需要注意哪些事项?本文将逐一为大家解读。
UART与USART的区别
早期在开发8051的时候使用的都是UART,大家可能了解的比较多一些。UART的全称叫做通用异步串行收发器,Universal Asynchronous Receiver/Transmitter,用于异步通信。
USART的全称叫做通用同步异步串行收发器,Universal Synchronous/Asynchronous Receiver/Transmitter,从字面意思我们也可以知道USART比UART增加了一部分同步的功能。
显而易见,USART当做SPI来用,就是利用了USART的同步模式。
USART硬件连接方式
是否有时钟线,是同步收发器和异步收发器最大的区别,这取决于硬件的连接。
从USART的硬件连接可以看到标准的SPI的主机和从机应该是怎样连接,有三线的和四线的,下图展示了四线的连接方式。
由主机MASTER提供CLK,MOSI和MOSI直接相连,主机的MISO和从机的MISO直接相连,片选是由主机来选择从机。
那么,如果是把USART当做SPI的时候,我们怎么跟SPI的从机连接呢?
在USART选择为同步传输的模式时,USART会有三个管脚被定义功能:除了RX和从机的Data out相连,TX和从机的Data in相连,还会有一个SCLK被使能,直接和SPI的CLK相连。这时,大家可能会发现,上面两图有一点区别 —— 没有CS,没有片选。
与标准的SPI连接方式相比,USART当作SPI使用时,真的没有片选吗?答案非也。如果需要一个片选的话,MCU上的任何一个GPIO都可以当作从机的一个片选信号,所以我们基本的连接也变得非常简单。RX和DO直接相连,TX和DIN直接相连,CLK直接相连,CS用任何一个GPIO就可以了。
USART的同步模式可分为
主机模式和从机模式
如何使能USART的SPI模式?可细分为两种模式,也就是USART可以当作SPI的MASTER(主机模式),还可以当作SPI的SLAVE(从机模式)。
这里,需要大家注意一下,并不是所有的STM32都可以当作SPI的从机模式,目前主要是STM32L4+和STM32H7这两个系列可以支持SPI的从机模式,其他的都仅支持SPI的主机模式。简而言之,L4和H7系列是既支持主机模式又支持从机模式。接下来,我们先来描述一下这两种模式。使能SPI的主机模式,只要开启CR寄存器中CLKEN这个位即可,同时要注意如果开启了CLKEN位,那它就只能当作SPI的主机模式,而不能当作从机模式。
使能SPI的从机模式,也是在CR寄存器里面,开启SLAVEEN这个位,就将SPI设置成从机模式。
如果同时使能了CLKEN和SLAVEEN,那SPI到底应该是在主机模式还是从机模式呢?
对此,有一个详细说明,就是CR寄存器中的CLKEN、SLAVEEN其中的一个一旦开启,那就要保证其他位是清零的状态。串口可以当作SPI接口去用,也可以当作SMATER接口来用,具体用哪个功能是由软件来决定的,也就是由应用来决定的。
USART用作SPI时与标准的SPI有何区别
使能SPI之后,就需要设置数据格式。我们知道串口有七位数据位、八位数据位和九位数据位,但是在设置为SPI模式之后,还有两个地方需要设置,一个是时钟极性,另一个是相位极性。这两个位是什么意思呢?让我们一起来看下USART的时序图。
从上图可以看到,在时钟极性为0的时候,CLK的默认电平是低电平;时钟极性为1时,CLK的默认电平是高电平。
相位极性(CPHA)为0的时候,它和数据是在时钟的第一个沿进行采样;CPHA为1时,它和数据是在时钟的第二个沿进行采样。
USART时序图中需要特别注意,有一个LBCL位,它会决定最后一个时钟沿是不是发出。串口发送或者接收的时候,通常需要有一个奇偶校验位。如果数据位是八位,其中有一个奇偶校验位,那真实有效的数据位就只有七位。奇偶校验位本身并不是数据,它是由前七位进行奇偶校验之后得到的,是0或者是1。如果我们只想发真实的数据,而不想发奇偶校验位,那就可以把LBCL设置为0,最后一位就不会发出。但是有的时候是没有奇偶校验位的,八位全部都是有效数据,那这时候就需要把LBCL设置为1,让它产生一个完整的八个时钟信号。
这点在应用中有一定的意义,也就是说发送的数据本身就是带有校验位的。标准SPI的处理方式是先将数据发送出去,之后再发送它的校验位;但如果用串口进行发送,也就是用USART把它当作SPI模式进行数据发送的时候,实际上是可以直接在后面加上校验位的,数据接收的时候也需要去检查校验位是否是正确的。
除了LBCL位,我们应该了解在数据的起始位和结束位中是不会产生任何时钟信号的,也就是说如果数据有10个bit,只有中间的8个bit会产生时钟信号,最开始的START和最后的STOP无论有几位都是不会产生时钟信号的。这是因为如果我们和标准的SPI模式去对比的话,我们会发现在标准的SPI中每一个位都是有时钟信号的,也就是数据的吞吐率和时钟是成正比的,但是如果用USART来传输SPI的数据,那数据真实的带宽最多只有实际吞吐率的80%,而SPI的带宽是可以占到100%的。
除了带宽这一点区别之外,还有什么区别呢?
我们可以看到,当USART用作SPI时,数据位只能设置为七位、八位或者九位,但是标准的SPI一般可以设置为4-16位,如果数据位一定要设置成7位以下,比如4位、5位,那就只能用SPI模式,不能把USART当成SPI使用。
另外,SPI和USART的速率也是有很大区别的,UART的速率最高可达10.5Mbit/s,SPI的速率最高可达系统时钟的一半。对于高速的数据通讯,SPI的优势比较明显。
以上是USART当作SPI的主机模式时,与标准SPI的区别。
当USART做SPI从机模式的时候,有一个专门的CS叫NSS管脚,它可以作为时钟的输入信号,在每个时钟沿会有一个数据从主机里反馈回来,NSS其他的操作和主机模式都是非常相似的,只是它的时钟信号来自外部。
USART用作SPI时的注意事项
最后,我们说一说USART用作SPI模式时的注意事项。
首先,一旦设置成SPI模式,在软件中要确保其他模式不被开启,包括SPI的主机模式和从机模式,只能有一种模式被开启。
第二,我们要注意USART当作SPI模式时,它的速率没有真正的SPI的速率高,而且它的有效带宽也少于SPI的有效带宽。
第三,SPI模式只在USART中是有效的,那么每一个系列中USART的个数和是否支持同步模式是不一样的,比如在F1、F3上有3个USART,它都是支持SPI主机模式的,不支持SPI从机模式;在L4+、H7上是既支持主机模式又支持从机模式,而且USART最多可以到三个或者四个。但是有一些小封装,比如STM32L011D4,有一个USART的,叫USART2,但因为管脚的限制,它虽然也叫USART,却不支持同步模式,需要具体去查数据手册。ST的USART本身还是很多的,尤其在F0上,F0上最多可以有8个USART,我们可以在这样的系列上更多更灵活地将USART用作SPI。
STM32的USART的功能非常丰富,大家可以多多尝试。