【STM32学习笔记】SPI不够用? USART来帮忙

发布者:甜美瞬间最新更新时间:2023-03-07 来源: zhihu关键字:STM32  SPI  USART 手机看文章 扫描二维码
随时随地手机看文章

如果您在使用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的功能非常丰富,大家可以多多尝试。


关键字:STM32  SPI  USART 引用地址:【STM32学习笔记】SPI不够用? USART来帮忙

上一篇:STM32F7x6的系统架构
下一篇:【话说定时器系列】之四:STM32定时器更新事件及案例分享

推荐阅读最新更新时间:2024-11-12 11:05

STM32有哪几种定时器 STM32高级定时器有哪些功能
在数字电路中时钟是整个电路的心脏,电路的的一举一动都是根据时钟节拍下进行的,随着信息量逐渐提高,对硬件信息处理能力提出了更大的需求,时钟作为数字硬件的关键成员,其性能需要我们关注,尤其在高速电路设计中对模拟转换芯片对时钟性能有很高的需求,因此正确选择时钟是很关键的一步,前提是我们要了解时钟的关键参数咯。在数字电路中最常见的时钟元件有晶振和锁相环、时钟缓冲器等,本节对外部定时器进行重点讲解。 STM32 定时器专题讲解 SysTick定时器的功能比较单一,主要是供给系统使用的,系统默认设置为1ms触发一次中断。而用户想要使用自己的定时器,STM32提供的用户定时器不但数量多且功能更加强大。不同型号的STM32提供的定时器数量不同
[单片机]
<font color='red'>STM32</font>有哪几种定时器 <font color='red'>STM32</font>高级定时器有哪些功能
STM32使用外部16MHZ晶振修改程序点
做小封装产品设计的朋友或许知道3225-4PIN的晶振,为何8MHZ晶振批量价格要到2元一片,而16MHZ晶振只需要0.4元甚至更少。究其原因是因为3225封装的晶振目前全球最低频率一般为8MHZ,而国内8MHZ达不到精度指标,所以市场上的8MHZ晶振一般为进口晶振,因此成本被垄断。 图1 3225封装晶振 STM32单片机学习者一开始用的晶振一般是2PIN的8MHZ晶振,一旦正真做产品研发的时候,使用到3225的8MHZ晶振的话,成本是个不小的挑战。笔者现针对这个问题,提出使用16MHZ晶振代替的方法。 图2 STM32时钟树状图 由上图可以看出,如果想兼容8MHZ晶振,必须在时钟倍频前2分频。程序设计如
[单片机]
<font color='red'>STM32</font>使用外部16MHZ晶振修改程序点
基于stm32精英版的温控风扇源码
用stm32F103ZET6精英版,温度传感器是DS18B20,1602液晶显示屏,利用温度来控制转速,液晶显示屏显示实时转速,也可手动调节转速。(采用pi控制) 电路原理图如下: 单片机源程序如下: #include delay.h #include key.h #include sys.h #include timer.h #include lcd1602.h #include encoder.h #include control.h #include usart.h #include usart3.h #include hc05.h #includ
[单片机]
基于<font color='red'>stm32</font>精英版的温控风扇源码
stm32 3.5固件库带sdio版本V4.5.0 bug修改
写的很详细 1:SD_WaitReadOperation()函数或者SD_WaitWriteOperation()函数进入死循环 原因:数据传输错误导致传输中断,无法满足退出等待的判断条件。 代码分析: SD_Error SD_WaitReadOperation(void) { SD_Error errorstatus = SD_OK; while ((SD_DMAEndOfTransferStatus() == RESET) && (TransferEnd == 0) && (TransferError == SD_OK)) {} if (TransferError != SD_OK) { return(Trans
[单片机]
STM32笔记:RCC结构与配置流程
以前使用STM32写程序的时候,使用的都是默认时钟。因此写数码管显示、A/D测量电压的时候都没有去关心RCC时钟配置这个事情。那时候只知道在配置外设的时候使用GPIO_InitTypeDef或者ADC_InitTypeDef这些结构体对外设进行初始化,以及使用RCC_APB2PeriphClockCmd或者RCC_ADCCLKConfig函数对外设的时钟开启与配置。 这几天尝试使用STM32的USB通信写一个鼠标,发现一些例程中有关于时钟配置的代码,才注意起这个事情。为此进行了一些学习,并且记录如下的笔记。 一、RCC的结构 以下是STM32时钟系统的结构图: 从图中,我们可以看到,ST
[单片机]
<font color='red'>STM32</font>笔记:RCC结构与配置流程
stm32的Core_cm3.c文件
上一章提到了对于stm32的堆栈的研究。实际上在查询资料时,看到有大神提到可以获取栈的指针。因为一般要验证都是存在栈溢出的问题,把他贴出来供大家研究。(我没有实际验证) void HardFault_Handler(void) { uint32_t r_sp ; r_sp = __get_PSP(); //获取SP的值 PERROR(ERROR,Memory Access Error!); Panic(r_sp); while (1); } 获取​进程堆栈指针并打印出来!__get_PSP()函数为Core_Core_cm3.c中的函数。他这个函数解析一下供大家查看:
[单片机]
STM32-(22):定时器TIM(理论)
STM32系列的CPU,有多达8个定时器。 1、 其中TIM1和TIM8是能够产生三对PWM互补输出的髙级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。 2、 其它6个为普通定时器,时钟由APB1的输出产生。 定时器的作用: 1、 定时功能 2、 计数功能 3、 输入捕获 4、 匹配输出 5、 PWM咏冲波 1、功能描述. 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 它适用于多种场合,包括测量输入信号的脉冲长度(输入采集)或者产生输出波形(输 出比较和PWM)。 定时器是完全独立的,而且没有互相共享任何资源。 定时器还可以与定时器形成级联,组建更大的定时范围。 NOTE:只要你使用默认的
[单片机]
STM32-(22):定时器TIM(理论)
STM32问题记录:外设初始化与外设时钟使能
最近在STM32上写了一份串口通信的程序,但下载复位后串口却不能工作,初始化的代码如下: //发送/接收的GPIO、串口和中断的初始化结构体 GPIO_InitTypeDef GPIO_InitStructureTx; GPIO_InitTypeDef GPIO_InitStructureRx; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //设置发送和接收引脚 GPIO_InitStructureTx.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructureRx.GPIO_
[单片机]
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved