一、通信接口
  • 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。(进行信息传递)
  • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发。(双方规则)
通信规定引脚:

数据按照协议的规定在这些引脚上进行输入和输出,从而实现通信。

(1)USART

TX(D):数据发送脚;RX(D):数据接收脚。

(2)I2C

SCL(Serial Clock):时钟;SDA(Serial Data):数据。

  (3)SPI

SCLK:(Serial Clock):时钟;  MOSI(Master Output Slave Input):主机输出数据脚;   MISO(Master Input Slave Output):主机输入数据脚;  CS(Chip Select):片选,用于指定通信的对象。

(4)CAN

CAN_H和CAN_L:差分数据脚(这两个数据表示一个差分数据)。

(5)USB通信

DP(Data Positive)D+ 和DM(Data Minus)D-:一对差分数据脚。

通信模式

(1)全双工:通信双方能够同时进行双向通信,一般来说,全双工的通信都要两根通信线,发送线路和接收线路互不影响。(串口:TX发送,RX接收,SPI:MOSI发送,MISO接收)

举例:全双工比半双工进了一步。在A 给B发信号的同时,B也可以给A发信号。典型的例子就是打电话,双方都能说,对方也能听到。

(2)半双工:半双工数据传输允许数据在两个方向上传输,但是在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。(I2C、CAN、USB都只有一根数据线(CAN和USB的两根差分线组合成一根数据线))

举例:指A 能发信号给B,B也能发信号给A,但这两个过程不能同时进行。可以想象一下对讲机,你收到的回复并不是都马上就有的。而且前提是双方不能在同一个状态,如果双方同时处于收状态,或同时处于发状态,便不能正常通信了。

计算机主机用串行接口连接显示终端时, 在半双工方式中,输入过程和输出过程使用同一通路 。有些计算机和显示终端之间采用半双工方式工作,这时,从键盘打入的字符在发送到主机的同时就被送到终端上显示出来,而不是用回送的办法, 所以避免了接收过程和发送过程同时进行的情况。

(3)单工:数据传输只支持数据在一个方向上传输。(数据只能从一个设备到另一个设备,不能反着来)

举例:意思就是A只能发信号,B只能接受信号,通信是单向的。类比于灯塔发发出光信号,航船只能接受信号。

时钟特性

时钟信号告诉接收方什么时候需要采集数据。

(1)同步:I2C和SPI有单独的时钟线,所以它们是同步的,接收方可以在时钟信号的指引下进行采样。

(2)异步:USART、CAN、USB没有时钟线,需要双方约定一个采样频率,这就是异步通信,并且还需要增加一个帧头帧尾,进行采样位置的对齐。

电平特性

(1)单端信号:引脚的高低电平都是对GND的电压差。单端信号通信的双方必须要共地(把GND接在一起)。USART、I2C、SPI都应该加一个GND引脚,否则无法通信。

(2)差分信号:CAN和USB是差分信号,靠两个差分引脚的电压差来传输信号,可以不需要接GND。传输速度和距离都非常高。但USB有些协议需要单端信号,所以还是需要接地。

设备特性

(1)点对点:USART和USB都是点对点设备。(只有两个设备,直接传输数据即可)

(2)多设备:I2C!,SPI,CAN都可以在总线上挂载多个设备。(多设备,一个设备面向很多个设备,需要要一个寻址的过程,以确定通信的对象)

二、串口通信
  • 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
  • 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。

图一:USB转串口模块

功能:(CH340)芯片可以把串口协议转换为USB协议,一边是USB口可以插在电脑上,一边是串口的引脚,可以接在支持串口的芯片上,这样就能实现单片机和电脑的通信了。

图二:陀螺仪传感模块

功能:可以测量角速度,加速度这些姿态参数,左右各有四个引脚,一边是串口的引脚,一边是I2C的引脚。

图三:蓝牙串口模块

功能:下面四个引脚是串口通信的引脚,上面的芯片可以和手机互联,实现手机遥控单片机的功能。

硬件电路
  • 简单双向串口通信有两根通信线(发送端TX和接收端RX)
  • TX与RX要交叉连接(通信引脚,它们的高低电平是相对于GND的)
  • 当只需单向的数据传输时,可以只接一根通信线
  • 当电平标准不一致时,需要加电平转换芯片(直接从控制器里出来的信号一般都是TTL电平,相同的电平才能互相通信)
  • 如果两个设备都有独立供电则不需要接VCC,如果一个有一个没有,协议把两个设备的VCC接在一起。

电平标准
  • 电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
  • TTL电平:+3.3V或+5V表示1,0V表示0
  • RS232电平:-3~-15V表示1,+3~+15V表示0
  • RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
串口参数及时序
  • 波特率(每秒传输码元的个数):串口通信的速率(串口一般使用异步通信,需要双方约定一个通信速率,比如A每隔一秒发送一位,B每隔一秒接收一位,如果接收快了,会重复接收某一位,如果接收慢了,会漏掉某些位,使用发送和接收必须约定好速率,这个速率就是波特率)

比特率(每秒传输比特(位)的个数,在二进制调制情况下,比特率=波特率)

1000bp(bite)/s :1s要发1000位,每一位的时间就是1ms,发送方每隔1ms发生一位,接收方每隔1ms接收一位,这就是波特率,它决定了每隔多久发送和接收一位

  • 起始位:标志一个数据帧的开始,固定为低电平(串口空闲状态是高电平,也就是没用数据传输的时候引脚必须要置高电平,作为空闲状态,需要传输的时候,必须要先发送一个起始位,这个起始位必须是低电平,来打破空闲状态的高电平,产生一个下降沿,这个下降沿就告诉接收设备这一帧数据要开始了。如果没有起始位,若我发送8个1,数据线一直都是高电平,没用任何波动,那接收方就不知道我发送了数据)
  • 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
  • 校验位:用于数据验证,根据数据位计算得来(偶校验:包括校验位在内有偶数个1。奇校验:包括校验位在内有奇数个1。根据奇偶校验规则,校验位补0/1)
  • 停止位:用于数据帧间隔,固定为高电平(同起始位,在一个字节数据发送完成后,必须要有一个停止位,为下一个起始位做准备,如果没有停止位,当我数据最后一位是0时,下次再发送新的一帧,就没办法产生下降沿)

串口时序

三、USART

作用:按照串口协议来产生和接收高低电平信号,实现串口通信。

USART简介
  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步(只支持时钟输出,不支持时钟输入)/异步收发器。
  •  USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。
  • 自带波特率发生器,最高达4.5Mbits/s 。
  • 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)。
  • 可选校验位(无校验/奇校验/偶校验)。
  • 支持同步模式、硬件流控制(可以避免因为接收设备处理数据慢而丢失数据1)、DMA(如果有大量数据进行收发,用DMA转运数据,可以减轻CPU的负担)、智能卡(公交卡,水卡)、IrDA(外红1通信:一个红外发光管,另一边是红外接收管,靠闪烁1红外光通信)、LIN(局域网通信协议)。
  • STM32F103C8T6 USART资源: USART1、 USART2、 USART3。
USART框图

TDR和RDR占用同一个地址,在程序上只表现为一个寄存器,就是数据寄存器DR(Data Register),在硬件中实际为两个数据寄存器。

TDR(只写):当进行写操作时,数据就写入到TDR

发送移位寄存器作用:把一个字节的数据一位一位地移出去,正好对应串口协议的波形的数据位,当数据从TDR移动到移位寄存器时,会置一个标志位叫TXE(TX Empty),发送寄存器空,如果标志位置1,我们就可以在TDR写入下一个数据了,TXE置1时,数据还没发送出去,只要数据从TDR转移到发送移位寄存器,TEX就会置1,然后发送移位寄存器会在发送器的控制下向右移位,一位一位地把数据输出到TX引脚

接收移位寄存器作用与发送移位寄存器同理。

RDR(只读):当进行读操作时,数据就从RDR读出来。

硬件数据流控:如果发送设备发的太快,接收设备来不及处理,就会发生丢失或覆盖数据,硬件数据流控可以避免这个问题。流控有两个引脚,一个是nRTS,一个是nCTS。

nRTS(Request To Send):是请求发送,是输出脚,也就是告诉别人我现在能不能接收。

nCTS(Clear To Send):是清除发送,是输入脚,用于接收别人nRTS信号的。(n的意思是低电平有效)

当我们的TX和外界的RX连接时,RTS要发送一个请问能不能输出的信号,接收到外界来的CTS,当能接收时,RTS就置低电平,请求对方发送,对方的CTS接收到之后,就可以一直发,当没有及时数据数据/数据处理不过来时,RTS就会置高电平,对方CTS接收到之后,就会暂停发送。

TX和CTS是一对的,RX和RTS是一对的。(TX和RX交叉连接,CTS和RTS也要交叉连接)

SCLK控制:发送寄存器每移位一次,同步时钟电平就跳变一个周期。(时钟告诉对方,我移出去一位数据了,你看要不要我这个时钟信号来指导你一下。)这个时钟支持输出,不支持输入,所以两个USART之间不能实现同步的串口通信。

SCLK作用:

1.兼容SPI协议(串口+时钟)

2.自适应波特率(接收设备不知道发送设备给的什么波特率,那么就可以通过时钟周期来计算波特率)

唤醒单元:实现多设备功能

USART基本结构

数据帧

起始位侦测

串口的输出TX比输入RX简单,输出只需要定时翻转高低电平即可,输入需要保证采样频率和波特率一致,还要保证每次输入采样的位置正好处于每一位的正中间,这样读取的高低电平才是最可靠的,如果采样点过于靠前或靠后,那有可能高低电平还正在翻转,电平还不稳定,或者稍有误差,数据就采样错了,另外输入最好对噪声有一定的判断能力,如果是噪声,最好能置个标志位提醒一下。

输入部分的电路对采样时钟进行了细分,以波特率的16倍进行采样,也就是在一位的时间里,可以进行16次采样。

最开始空闲状态是高电平,那采样就一直是1,在某个位置突然采到0,那就说明在这两次采样之间产生了下降沿,如果没有任何噪声,那之后就应该是起始位了,在起始位会进行连续的16次采样,如果没有噪声,16次采样都是0,但在实际过程中是有噪声的,所以后续要再采样几次,以防万一。

如果每3位里面只有一个0,那么可能是噪声引起的,此时电路就忽略前面的数据,重新开始捕捉下降沿。(STM32对噪声的处理)



数据采样

波特率发生器
  • 发送器和接收器的波特率由波特率寄存器BRR里的DIV确定
  • 计算公式:波特率 = fPCLK2/1 / (16 * DIV)

数据模式
  • HEX模式/十六进制模式/二进制模式:以原始数据的形式显示。
  • 文本模式/字符模式:以原始数据编码后的形式显示。

HEX数据包
  • 固定包长,含包头包尾

  • 可变包长,含包头包尾

文本数据包
  • 固定包长,含包头包尾

  • 可变包长,含包头包尾

HEX数据包接收

对于包头、数据、包尾这3种状态,我们要有不同的处理逻辑,所以需要设计一个能记住不同状态的机制,在不同状态执行不同的操作,同时还要进行状态的合理转移,这种程序设计思维,就叫做状态机 。每个状态都需要用变量来标志,状态机有多标志位!

文本数据包接收

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐