串行通信(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。剩下的就是添加同步位。

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

“OK”包

    因为我们的波特率是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”。

TTL信号

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

RS-232信号

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

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


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

通用异步收发器(UART)

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

简化的UART

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

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

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

UART内部

一个UART的内部框图

<

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

软件UART

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

常见的错误

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

RX接TX、TX接RX

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

波特率不匹配

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

波特率不匹配

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



0 评论 | 直到2022-12-06 06:23添加评论