串行通信(UART)

串行通信(UART)admin  17/07/10

说明

嵌入式电子产品都是由一些电路(处理器或其他集成电路)互连形成的。 为了在这些电路之间交换信息,他们必须遵循一个共同的通信协议。目前已经有数百种这类通信协议, 在一般地,这些协议可以分为两大类:并行通信协议或串行通信协议。

并行与串行

并行接口同时传输多个比特的。他们通常用到八、十六、或更多位的数据总线。

一个8位数据总线,和一个时钟线,9条信号线构成并行接口。

串行接口通过一次一个位的数据流形式传输。这些接口可以最少只用一条信号线,通常不会超过四条。

一个串行接口实例,只需要2条信号线!

如果把两种接口比作车流:并行接口将是8 车道大型公路,而串行接口更像是一个双车道农村公路。一段时间内,大型公路可将更多的人到他们的目的地,但农村公路只需要少量建设资金。

并行通信自然有它的好处。它的快速,简单,比较容易实现。但它需要更多的输入/输出(I/O)线。如果你曾经将做过单片机项目,你就知道I/O线可是珍贵的资源。所以,我们通常会牺牲一些速度,选择串口通信。

异步串行

多年来,已经发展出几十个满足嵌入式系统的特殊需求的串口协议。比较有名的有USB总线和以太网,其他常见的串行接口包括SPI、I2C,和接下来我们要讨论的一些接口。这些串行接口可以分为两类:同步或异步。

同步串行接口总是有一个独立的时钟信号线,同步串行总线上的设备共享同一个时钟。这使得其居于更快的传输速率,但它相比异步串口,多用一条信号线。同步接口的例子包括SPI,I2C.

异步意味着数据传输不需要额外时钟信号支持。这种传输方法能最大限度地减少所需的信号线和I/O引脚,但这意味着我们要把一些额外的措施,来保证可靠地传送和接收数据。我们将在本教程中讨论的是异步传输的最常见的一种协议。事实上,当大多数人说“串行通讯”的时候,他们说的就是指这个协议。

这种没有独立时钟线的串行协议广泛地应用于嵌入式电子。如果你想添加一个GPS模块、蓝牙、XBee,串口液晶显示器,或其他外部设备到你的项目,你可能需好好了解一下这个串行协议。

串行参数

异步串行协议有一些内置的规则参数,来确保可靠和无差错的数据传输。这些参数包括:

  • 数据位,

  • 位同步,

  • 奇偶校验位,

  • 和波特率。

通过对这些参数的变化,你会发现发送数据串的方法有很多种变化,该协议是高度可配置的。关键是确保串行总线上的所有器件配置相同的协议参数

波特率

波特率指定通过串行线发送数据的速度发送数据的速度。它通常以比特每秒(bps)为单位表示。波特率的倒数,就是发送一个比特究竟需要多长时间。这个值决定了每发送一位数据,发射机将串行线置高或置低多长时间,也决定接收机什么时候采样信号线。

波特率可以是在合理的范围内取任何值。唯一的要求是,收发设备运行在相同的速率上。在速度不是关键的应用场合,9600(bps)是一个十分常用的选择。其他的“标准”波特率有1200, 2400, 4800,19200, 38400, 57600,和115200(bps)。

选择更高的波特率,就能更快地发送/接收数据,但这也有限制,在多数单片机系统中,你通常不会看到速度超过115200的。波特率太高了,你会在接收端的看到错误,因为单片机时钟和采样周期不能跟上。

帧数据

每一块(通常是一个字节)数据传输,实际上是发送一的比特流。我们通过在数据上添加同步和奇偶校验位来构建帧。

一个串行帧。一些符号在框架具有可配置的点尺寸。

让我们来分析一下这些帧的细节。

数据块

每一个串行数据帧中真正“有用”的东西是数据块。数据块的大小没有具体规定,一般可以是从5到9位。当然,最标准、最常用的数据大小是8位。但其他尺寸有也其用途。有时7位数据块可以比8更有效,特别是如果你只是传输7位ASCII字符时。

约定一个字符(数据块)的长度后,串行设备还需要约定数据的大小端也就是最先发送数据的最高有效位(MSB)还是最低有效位(LSB)?如果没有规定,通常可以假定为小端数据,即最先发送最低有效位(LSB)

同步位

同步位是两个或三个特殊数据位。他们是起始位停止位()。正如它们的名字所示,这些位是数据帧开始和结束的标记。起始位只有一位,而停止位可以有一位或两位(最常用的还是一位)。

起始位总是由一个空闲状态(1)转变到0,而停止位将转回到空闲状态(1)并被保持。

校验位

奇偶校验是一种非常简单的、基本的错误检查方法。它有两种:奇校验或偶校验。它以校验位同有效数据中包含的“1”的个数是奇数个(奇校验)或偶数个(偶校验)来定,例如,假设被校验的数据字节是0b01011101,它具有奇数(5)个“1”,如果采用偶校验,校验位将被设置“1”,凑成总数6个“1”。相反,如果采用奇校数,校验位将被设置“0”

奇偶校验是可选的,并没被很广泛地应用。它适合嘈杂的传输媒介,但它也会减慢数据传输效率,还要求发送机和接收机实现错误处理机制(通常,接收数据失败,必须重新发送)。

9600 8N1(例)

9600 8N1 -波特率9600,数据位8,无奇偶校验,1个停止位是一个比较常用的串行协议。让我们用一个例子来看看两个9600 8N1数据包会什么样的?

一个设备要发送ASCII码字符“O”和“K”,它会创建两个数据包。ASCII码o(这是大写)的值为79,可分解成一个8位二进制值01001111,而K的二进制值01001011。剩下的就是添加同步位。

这里没有特别规定,我们假定最低有效位先传输。注意,每个字节是从右到左读取发送的。

因为我们的波特率是9600,所以,发送每所花的时间是104μs。

对于数据传输的每一个字节,实际上有10位被发送:一个起始位,8个数据位和一个停止位。因此,在9600个波特率,实际上我们发送每秒9600比特,包含960(9600/10)字节有效数据。


现在你已经知道如何构建串行数据包了,接下来我们可以转到硬件部分。看看那些“1”和“0”是如何在应将上实现的!

硬件连线

串行总线只包括两根信号线-一个用于发送数据,另一个用于接收。因此,串行设备应该有两个串口引脚:发送TX和接收RX

需要注意,这些RXTX标签是相对于设备本身来定义的。因此,一个设备的RX应该连接到另一设备的TX,反之亦然。如果你习惯了将VCC同VCC、GND同GND,MoSi同MOSI链接,可能对此会有疑惑。但如果你仔细想想,发射端应该和接收端链接,而不到另一个发射端。

对于双方都能发送数据的串行接口,发送和接收数据的方式可以是全双工半双工的。全双工是指设备可以同时发送和接收。半双工通信方式是指串行设备必须轮流发送和接收。

有些场景下,发送和接收装置之间只有一根信号线。例如,一些串行功能的液晶显示器,它没有任何数据需要传递给控制装置。这是所谓的简单串行通信。所有你需要的是从主设备的TX到液晶显示器的RX单线链接。

硬件实现

我们已经了解了异步串行的概念。知道我们需要的信号线。但真正的串行通信信号电平是如何规定的呢?实际上。有多种各的串行信号电平标准。让我们看几个系列很流行的硬件实现看:逻辑电平(TTL)和RS-232。

微控制器和其他低级别的集成电路串行通讯时,他们通常采用TTL(晶体管-晶体管逻辑)电平。TTL串口信号电平在0V到单片机的电源电压(3.3V或5V等)之间变化,信号在VCC(3.3V,5V等)表示一个“1”,在0V(接地)时表示一个“0”。

RS-232接口,在一些老的计算机和外设上很常见,它的信号电平象TTL电平的翻转版本。RS-232信号通常介于-13V和13V之间(虽然规范允许有±3V至±25V)。这些信号的低电平(-5V,-13V,等)表明“1”,高电平(5V,13V,等)表明“0”。这刚好同TTL电平相反。

在这两个串行电平标准之间,嵌入式电路中TTL更容易实现。然而,较低的信号电平等级更容易在长距离输电线路上损耗。RS-232、RS-485或更复杂的标准,更适合长距离串行传输。

当你将两个串行设备连接在一起时,确保其信号电平匹配很重要。你不能直接将TTL串口同RS-232链接。


继续,我们将探讨微控制器将并行数据转换成串行的接口电路——通用异步收发器(UART)!

通用异步收发器(UART)

一个通用异步接收器/发送器(UART)是一块负责实现串行通信的电路。从本质上讲,UART是并行和串行接口之间的中介。UART的一端是一个(通常是8位)并行数据总线和一些控制引脚,另一端是两个串行信号线RX和TX.

简单的UART接口,并行==>串行。

有独立的集成电路的UART,但更常见的是集成在单片机内部。你要查看你的单片机的数据手册来了解它是否具有UART。有些单片机没有UART,有些有很多。

UART负责发送和接收串行数据。在发送端,UART必须创建数据包、添加同步和奇偶校验位,对发送分帧精确定时(根据设定的波特率)。在接收端,UART要根据预期的波特率采样Rx线,找出同步位,并吐出有效数据。

一个UART的内部框图

<

更先进的UART可以把接收到的数据存储到一个缓冲区,在那里,等待单片机把它们取走。UART通常会以先入先出(FIFO)释放缓冲数据。缓冲区可小到几位,或大到几千字节。

软件UART

如果一个单片机没有UART(或者UART不够用),串行接口数据的位脉冲可由处理器直接控制。

常见的错误

对所有有串行通信。任何经验水平的工程师很容易犯一些常见的错误

RX接TX、TX接RX

看起来很简单,但时常会弄错,我自己也不止一次犯此错误。

波特率不匹配

波特率就象串行通信的语言。如果两个设备工作到不在波特率,数据会被曲解。如果你发现所有的接收装置收到的都是垃圾数据,请检查确定波特率是否匹配。

数据以9600波特率发送,以19200波特率接收。波特失配=垃圾数据。

(0)

相关推荐