单片机学习!

目录

文章目录

前言

一、通信接口

1.1 通信目的与协议

1.2 各通信协议参数

二、串口通信

三、硬件电路

3.1 接线图

3.2 通信电路

五、电平标准

六、时序及串口参数

6.1 时序

6.2 串口参数

总结


前言

        在STM32中,集成了很多用于通信的外设模块,比如 USART 、I2C、SPI、CAN 和 USB。本文就主要介绍其中一种,USART串口的基础内容。


一、通信接口

1.1 通信目的与协议

  • 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。
  • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发。
  •         1. 通信的目的是将一个设备的数据传送到另一个设备,扩展硬件系统。

            拿STM32芯片来说,芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等等。这些都是芯片内部的电路,这些电路的配置寄存器、数据寄存器都在芯片里面。操作这些寄存器非常简单,直接读写就行了。

            也有一些功能是STM32内部没有的,如蓝牙无线遥控的功能;陀螺仪加速速度计测量姿态的功能等,这些STM32芯片没有的功能就只能外挂芯片来完成。

            可是外挂芯片的数据都在STM32芯片外面,STM32芯片想要获取到这些数据,就需要在STM32芯片和外挂芯片的两设备之间连接上一根或多根通信线。通过通信线路发送或者接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。

            所以通信的目的是将一个设备的数据传送到另一个设备。单片机有了通信的功能,就能与众多别的模块互联,极大的扩展了硬件系统。

            2. 通信协议的作用是制定通信的规则,通信双方按照协议规则进行数据收发。

            比如说,考试时想给别人传答案,那就可以和对方约定一个通信协议。比如先咳嗽一声,代表通信开始。然后竖一个手指,代表发送A;竖两个手指,代表发送B;竖三个手指,代表发送C;挥一挥手,代表通信结束。

            通信的目的是进行信息传递,双方约定的规则就是通信协议。

    1.2 各通信协议参数

            在STM32里面有上表那么多种通信协议,这个表只是列了一个最典型的参数。因为各种通信协议应用都很宽泛,参数也很多。而表中列出的仅是各种通信协议最常用最简单的配置。

    引脚

  • USART串口,它的引脚是TX和RX,也有叫TXD和RXD的,这两种名称是一个意思。TX(Transmit Exchange)是数据发送脚;RX(Receive Exchange)是数据接收脚。
  • I2C通信,引脚是SCL和SDA。SCL(Serial Clock)是时钟;SDA(Serial Data)是数据。
  • SPI通信,引脚是SCLK、MOSI、MISO、CS。SCLK(Serial Clock)是时钟;MOSI(Master Output Slave Input)是主机输出数据脚;MISO(Master Intput Slave Ouput)是主机输入数据脚;CS(Chip Select)是片选,用于指定通信的对象。
  • CAN通信,引脚是 CAN_H 和 CAN_L 这两个是差分数据脚,用两个引脚表示一个差分数据。
  • USB通信,引脚是DP(Data Positive)和DM(Data Minus)或者叫D+和D-,也是一对差分数据脚。
  •         以上就是通信协议规定的引脚,数据按照协议的规定在这些引脚上进行输入和输出,从而实现通信。下面来看下各种通信协议的特性。

    双工模式

            全双工就是指通信双方能够同时进行双向通信,一般来说,全双工的通信都有两根通信线,一根发送数据,一根接收数据。全双工发送线路和接收线路互不影响。

    比如:

  • 串口,一根TX发送,一根RX接收;
  • SPI,一根MOSI发送,一根MISO接收。
  •         剩下的I2C、CAN和USB,都只有一根数据线。CAN和USB两根差分线也是组合成为一根数据线的,所以都是半双工。

            还有一种模式就是单工,单工是指在数据只能从一个设备到另一个设备,而数据传输方向不能反着来。比如把USART串口的RX引脚去掉,那串口就退化成单工了。

    时钟特性

            设备发送一个波形,高电平然后低电平,接收方如何知道发送的是1、0还是1、1、0、0。这就需要有一个时钟信号来告诉接收方,什么时候需要来采集数据。

    时钟特性分为同步和异步:

  • I2C和SPI有单独的时钟线,所以I2C和SPI是同步的,接收方可以在时钟信号的指引下进行采样。
  • USART串口、CAN和USB没有时钟线,所以需要双发约定一个采样频率,这就是异步通信。异步通信还需要加一些帧头帧尾等,进行采样位置的对齐。
  • 电平特性

  • USART串口、I2C和SPI都是单端信号。
  • CAN和USB差分信号。
  •         USART串口、I2C和SPI引脚的高低电平都是对GND的电压差。所以单端信号通信的双方必须要共地,就是把GND接在一起。表中USART串口、I2C和SPI通信的引脚,还应该加一个GND引脚,不接GND是没法通信的。

            CAN和USB是靠两个差分引脚的电压差来传输信号的。在通信的时候可以不需要GND。不过USB协议里面也有一些地方需要单端信号,所以USB还是需要共地的。

            使用差分信号可以极大的提高抗干扰特性,所以差分信号一般传输速度和距离都会非常高,性能也是很不错的。

    设备特性

  • USART串口和USB属于点对点的通信。
  • I2C、SPI和CAN通信是可以在总线上挂载多个设备的属于多设备通信。
  •         点对点通信就相当于老师找你去办公室谈话,只有两个人,直接传输数据就可以了。多设备就相当于老师在教室里,面对所有同学谈话,需要有一个寻址的过程,以确定通信的对象。

    二、串口通信

  • 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
  • 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。
  •         1.在单片机的领域,串口其实是一种最简单的通信接口。它的协议相比较于 I2C、SPI等,已经是非常简单的了。而且一般单片机,它里面都会有串口的硬件外设,使用也是非常方便的。

            一般串口都是点对点的通信,所以是两个设备之间的互相通信。

            2.单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。其中单片机和电脑通信是串口的一大优势,单片机可以接电脑屏幕,非常适合调试程序、打印信息。而I2C和SPI这些,一般都是芯片之间的通信,不会接在电脑上。

            有了通信就是极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。

    三、硬件电路

    3.1 接线图

            上图为USART串口的接线图。一般串口通信的模块都有4个引脚:VCC、TX、RX、GND。VCC和GND是供电,TX和RX是通信的引脚。

            TX和RX是单端信号,它们的高低电平都是相对于GND的。所以严格上来说,GND应该也算是通信线。所以USART串口通信的TX、RX、GND是必须要接的。

    VCC接与不接取决于是否有独立供电。

  • 如果两个设备都有独立供电,那VCC可以不接;
  • 如果其中一个设备没有供电,那VCC就需要接起来。
  •         举例图中设备1是STM32,设备2是蓝牙串口模块。STM32有独立供电,蓝牙串口没有独立供电。那就需要把蓝牙串口的VCC和STM32的VCC接在一起,STM32通过这根线向右边的子模块供电。当然供电的电压也需要注意一下,要按照子模块的要求来。

    3.2 通信电路

  • 简单双向串口通信有两根通信线(发送端TX和接收端RX)。
  • TX与RX要交叉连接。
  • 当只需单向的数据传输时,可以只接一根通信线。
  • 当电平标准不一致时,需要加电平转换芯片。
  • 1. 简单双向串口通信有两根通信线(发送端TX和接收端RX)。

            简单的串口通信是有两根通信线,复杂一点的串口通信还有其它引脚,比如时钟引脚、硬件流控制的引脚,这些引脚STM32的串口也有,不过最常用的还是简单的串口通信。也就是VCC、TX、RX、GND这4个引脚。

    2. TX与RX要交叉连接。

            TX是发送,RX是接收。那肯定得是一个设备的发送接另一个设备的接收;一个设备的接收接另一个设备的发送。

    3. 当只需单向的数据传输时,可以只接一根通信线。

            如果只需要设备1向设备2的单项通信,那就可以只接一根TX到RX的线。另一根就可以不接,这就变成了单工的通信方式。

    4. 当电平标准不一致时,需要加电平转换芯片。

            串口也是有很多电平标准的,如果是直接从控制器里出来的信号,一般都是TTL电平,相同的电平才能互相通信。不同的电平信号需要加一个电平转换芯片,转接一下。

    五、电平标准

  • 电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系。
  • 串口常用的电平标准有如下三种:

  • TTL电平:+3.3V或+5V表示1,0V表示0
  • RS232电平:-3~-15V表示1,+3~+15V表示0
  • RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
  •         电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系。在单片机电路中最常见的就是TTL电平,也就是5V或者3.3V表示逻辑1,0V表示逻辑0.除了这一种,串口还有一些其他的电平标准。

    来看一下串口常用的三种电平标准:

  • 第一种,就是最常见的TTL电平:+3.3V或+5V表示逻辑1,0V表示逻辑0。这里逻辑1的电压,如果是5V的器件就是+5V;如果是3.3V的器件就是+3.3V。逻辑1就是高电平的电压,就是VCC的电压。
  • 第二种,RS232电平:-3~-15V表示逻辑1,+3~+15V表示逻辑0。RS232电平一般在大型的机器上使用,由于环境可能比较恶劣,静电干扰比较大,所以这里电平的电压都比较大,而且允许波动的范围也很大。
  • 第三种,RS485电平:两线压差+2~+6V表示逻辑1,-2~-6V表示逻辑0(差分信号)。RS485电平参考的是两线压差,所以RS485的电平是差分信号。差分信号抗干扰能力非常强,使用RS485电平标准,通信距离可以达到上千米。而TTL电平和RS232电平最远只能达到几十米,再远就传不了了。
  •         单片机这种低压小型设备,使用的都是TTL电平。如果做设备需要其它的电平,那就再加电平转换的芯片就可以了。在软件层面,它们都属于串口,所以程序并不会有什么变化。


            串口通信在硬件电路上,协议规定是:

  • 一个设备使用TX发送高低电平;
  • 另一个设备使用RX接收高低电平。
  •         在线路中使用TTL电平,因为STM32是3.3V的器件,所以如果线路对地是3.3V,就代表发送了逻辑1;如果线路对地是0V,就代表发送了逻辑0.

            下文来看一下串口协议的软件部分,如何用1和0来组成我们想要发送的一个字节数据。


    六、时序及串口参数

    6.1 时序

     时序图1:

           

    时序图2:

             上面两个时序图就是串口发送一个字节的格式,这个格式是串口协议规定的。串口中,每一个字节都装载在在一个数据帧里面。每个数据帧都有起始位、数据位和停止位组成。

  • 时序图1的数据位有8个,代表一个字节的8位。
  • 时序图2的数据帧里面,还可以在数据位的最后加一个奇偶校验位,这样数据位总共就是9位,其中有效载荷是前8位,代表一个字节;校验位跟在有效载荷后面,占1位。
  • 这就是串口数据帧的整体结构。

    6.2 串口参数

    串口参数:

  • 波特率:串口通信的速率。
  • 起始位:标志一个数据帧的开始,固定为低电平。
  • 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行。
  • 校验位:用于数据验证,根据数据位计算得来。
  • 停止位:用于数据帧间隔,固定为高电平。
  • 波特率:串口通信的速率。

            第一个参数,波特率,用途是规定串口通信的速率。串口一般是使用异步通信,需要双方约定一个通信速率。

    比如设备1每隔1s发送一位,那设备2就也得每隔1s接收一位。

  • 如果设备2接收快了,那就会重复接收某些位;
  • 如果设备2接收慢了,那就会漏掉某些位。
  • 所以说发送和接收必须要约定好速率,这个速率参数就是波特率。

            波特率本来的意思是每秒传输码元的个数,单位是码元/s或者直接叫波特(Baud)。

            另外还有个速率表示,叫比特率。比特率的意思是每秒传输的比特数,单位是bit/s或者叫bps。在二进制调制的情况下,一个码元就是一个bit,此时波特率就等于比特率。

            单片机的串口通信基本都是二进制调制,也就是高电平表示1,电平表示0,一位就是1bit。所以串口的波特率经常会和比特率混用,因为这两个说法的数值相等。如果是多进制调制,那波特率和比特率就不一样了。

            反应到波形上,比如双方规定波特率为1000bps,那就表示1s要发1000位,每一位的时间就是1ms,发送方每隔1ms发送一位,接收方每隔1ms接收一位。

            这就是波特率,它决定了每隔多久发送一位。

    起始位:标志一个数据帧的开始,固定为低电平。

            参考时序图1和2,首先串口的空闲状态是高电平,也就是没有数据传输的时候,引脚必须要置高电平,作为空闲状态。需要传输数据的时候,必须要在发送数据位前先发送一个起始位,这个起始位必须是低电平,低电平是为了来打破空闲状态的高电平,产生一个下降沿。这个下降沿就告诉接收设备,这一帧数据要开始了。        

            如果没有起始位,那当发送方发送8个1的时候,数据线就一直都是高电平,没有任何波动,这样接收方就不能知道发送方是否发送数据,所以在发送数据时必须要有一个固定为低电平的起始位,产生下降沿来告诉接收设备,发送方要发送数据了。同理,在一个字节数据发送完成后,必须要有一个停止位。

    数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行。

            比如发送方要发送一个字节,是0x0F,那就首先把0F转换为二进制,就是0000 1111,然后低位先行,所以数据要从低位开始发送,也就是1111 0000,依次放在发送引脚上

    校验位:用于数据验证,根据数据位计算得来。

            串口使用的是一种叫奇偶校验数据验证方法,奇偶校验可以判断数据传输是不是出错了,如果数据出错了,可以选择丢弃或者要求重传。校验可以选择三种方式:无校验、奇校验和偶校验。

  • 无校验就是不需要校验位,波形就是时序图1这样,起始位、数据位、停止位总共3个部分。
  • 奇校验和偶校验的波形是时序图2这样,起始位、数据位、校验位、停止位总共4个部分。
  •         如果使用了奇校验,那么包括校验位在内的9位数据会出现奇数个1,

  • 比如传输0000 1111,目前总共4个1,是偶数个,那么校验位就需要再补一个1,连同校验位就是0000 1111 1,总共5个1,保证1为奇数。
  • 如果数据是0000 1110 ,此时3个1,是奇数个,那么校验位就补一个0,连同校验位就是0000 1110 0,总共还是3个1,1的个数为奇数。
  •         奇校验就是发送方在发送数据后,会补一个校验位,保证1的个数为奇数。接收方在接收数据后,会验证数据位和校验位,如果1的个数还是奇数,就认为数据没有出错。如果在传输中因为干扰有一位由1变成0,或者由0变成1了,那么整个数据的奇偶特性就会变化,接收方一验证,发现1的个数不是奇数,那就认为传输出错,就可以选择丢弃或者要求重传。这就是奇校验的差错控制方法。

            如果选择双方约定偶校验,那就是保证1的个数是偶数。校验方法也是和奇校验一样的道理。

            当然奇偶校验的检出率并不是很高,比如如果有两位数据同时出错,奇偶特性不变,那就校验不出来了。所以奇偶校验只能保证一定程度上的数据校验,如果想要更高的检出率,可以了解一下CRC校验,这个校验会更加好用,当然也会更复杂。在STM32内部也有CRC的外设,可以了解一下。

    停止位:用于数据帧间隔,固定为高电平。

            与起始位同理,在一个字节数据发送完成后,必须要有一个停止位。同时停止位也是为了下一个起始位做准备的。如果没有停止位,那当数据位最后一位是0的时候,下一次再发送新的一帧,就没法产生下降沿了。

            起始位和停止位作用:起始位固定为0,产生下降沿,表示传输开始。停止位固定为1,把引脚恢复成高电平,方便下一次的下降沿。如果没有数据了,正好引脚也为高电平,代表空闲状态。

    注:数据位有两种表示方法:

  • 一种是把校验位作为数据位的一部分;
  • 另一种是把数据位和校验位分开。

  • 总结

            以上就是今天要讲的内容,本文仅仅简单介绍了串口通信在硬件电路上的通信协议和软件上数据传输的内容。总结一下就是,TX引脚输出定时翻转的高低电平,RX引脚定时读取引脚的高低电平。每个字节的数据加上起始位、停止位、可选的校验位打包成数据帧,依次输出在TX引脚,另一端RX引脚依次接收。这样就完成了字节数据的传递,这就是串口通信。

    作者:Echo_cy_

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 USART串口协议

    发表回复