串行通信介绍

描述

串行通信 Serial Communication

介绍

嵌入式电子产品全部是关于互连电路(处理器或其他集成电路)以创建共生系统。 为了让这些单独的电路交换他们的信息,他们必须共享一个通用的通信协议。 已经定义了数百种通信协议来实现这种数据交换,并且通常每种协议都可以分为两类:并行或串行。

并行与串行

并行接口同时传输多个位。 他们通常需要数据总线 - 通过八根,十六根或更多的电线进行传输。 数据以巨大的1和0的巨大冲击波传输。

通信协议

一个8位数据总线,由一个时钟控制,每个时钟脉冲发送一个字节。 使用9根导线。

串行接口每次只传输一个数据。 这些接口可以在一根电线上工作,通常不会超过四根。

通信协议

串行接口示例,每个时钟脉冲发送一位。 只需要2根电线!

将两个接口想象成一串汽车:一个并行接口将是8+车道的大型高速公路,而串行接口更像是一条双线农村乡村公路。 在一段时间内,大型高速公路可能会让更多的人到达目的地,但是这个双向农村地区的服务宗旨和成本只是建立资金的一小部分。

并行通信当然有其好处。 它快速,简单并且相对容易实施。 但它需要更多的输入/输出(I / O)线。 如果你曾经将一个项目从一个基本的Arduino Uno移动到一个Mega,那么你就知道微处理器上的I / O线可能很珍贵,而且很少。 所以,我们经常选择串行通信,牺牲潜在的引脚传输速度。

异步串行

多年来,已经制作了数十种串行协议来满足嵌入式系统的特殊需求。 USB(通用串行总线)和以太网是几个更为人熟知的计算串行接口。其他非常常见的串行接口包括SPI,I2C和今天要讨论的串行标准。每个串行接口都可以分为两组:同步或异步。

同步串行接口总是将其数据线与时钟信号配对,因此同步串行总线上的所有器件共享一个公共时钟。这使得更简单,通常更快的串行传输,但它也需要通信设备之间至少一个额外的电线。同步接口的例子包括SPI和I2C。

异步意味着数据在没有外部时钟信号支持的情况下传输。这种传输方式非常适合最小化所需的线路和I / O引脚,但这确实意味着我们需要付出一些额外的努力来可靠地传输和接收数据。这里讨论的串行协议是异步传输的最常见形式。实际上,这是很常见的,当大多数人说“串行”时,他们正在谈论这个协议。

无时钟串行协议广泛用于嵌入式电子产品中。

串行规则

异步串行协议有许多内置的规则机制,这些机制有助于确保健壮且无错误的数据传输。这些机制,我们用来避开外部时钟信号,是:

数据位,

同步比特,

奇偶校验位,

和波特率。

通过各种各样的信号机制,您将发现没有一种方法可以串行发送数据。该协议是高度可配置的。关键部分是确保串行总线上的两个设备都配置为使用完全相同的协议。

波特率

波特率指定通过串行线路发送数据的速度。它通常以每秒比特数(bps)为单位表示。如果反转波特率,则可以发现传输单个位需要多长时间。此值决定发送器将串行线路保持高/低电平的时间或接收设备采样线路的时间。

波特率可以是任何合理的值。唯一的要求是两台设备的运行速度相同。最常见的波特率之一,特别是对于速度不重要的简单工具,其波特率为9600 bps。其他“标准”波特率分别为1200,2400,4800,19200,38400,57600和115200。

波特率越高,发送/接收的数据越快,但数据传输的速度有限。你通常看不到速度超过115200--这对于大多数微控制器来说速度很快。太高了,你会在接收端看到错误,因为时钟和采样周期不能跟上。

构建数据

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

通信协议

一个串行帧。 帧中的一些符号具有可配置的位大小。

我们来详细介绍这些框架的每个部分。

数据块

每个串行数据包的真正价值在于它携带的数据。 我们不明确地称这块数据为块,因为它的大小没有具体说明。 每个数据包中的数据量可以设置为5到9位。 当然,标准数据大小是您的基本8位字节,但其他大小有其用途。 7位数据块可以比8更有效,特别是如果您只是传输7位ASCII字符。

在达成字符长度之后,这两种串行设备也必须同意其数据的字节顺序。 数据最重要的位(msb)发送到最少,反之亦然? 如果没有另外说明,通常可以假设数据首先传输最低有效位(LSB)。

同步位

同步位是每个数据块传输的两个或三个特殊位。 它们是起始位和停止位。 与其名称一样,这些位标记数据包的开始和结束。 始终只有一个起始位,但停止位的数量可以配置为一个或两个(尽管它通常保持为一个)。

起始位总是由从1到0的空闲数据线指示,而停止位将通过将线保持为1转换回空闲状态。

奇偶位

奇偶校验是一种非常简单的低级错误检查。 它有两种:奇数或偶数。 为了产生奇偶校验位,数据字节的所有5-9位被相加,并且和的均匀性决定该位是否被设置。 例如,假设奇偶校验设置为偶数,并将其添加到数据字节(如奇数个1(5))的数据字节中,则奇偶校验位将设置为1.相反,如果奇偶校验模式设置为奇数 ,奇偶校验位将为0。

奇偶校验是可选的,不是非常广泛的使用。 它可能有助于跨嘈杂的媒体进行传输,但它也会减慢数据传输的速度,并要求发送者和接收者都执行错误处理(通常,必须重新发送失败的接收数据)。

9600 8N1(一个例子)

9600 8N1 - 9600波特,8个数据位,无奇偶校验和1个停止位 - 是最常用的串行协议之一。 那么,一个或两个9600 8N1数据会是什么样子呢? 举个例子吧!

传输ASCII字符'O'和'K'的设备必须创建两个数据包。 O(大写)的ASCII值为79,分解为8位二进制值01001111,而K的二进制值为01001011.剩下的就是追加同步位。

没有具体说明,但是假定数据首先传输到最低位。 注意两个字节在从右到左读取时是如何发送的。

通信协议

由于我们以9600bps的速度传输数据,因此将每个比特位保持在高位或低位的时间为每比特1 /(9600bps)或104μs。

对于发送的每个字节的数据,实际上有10位被发送:一个起始位,8个数据位和一个停止位。 所以,在9600bps时,我们实际上是每秒发送9600比特或每秒960(9600/10)字节。

现在您已经知道如何构建串行数据包了,我们可以转到硬件部分。 在那里我们将看到1和0以及波特率如何在信号电平上实现!

布线和硬件

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

通信协议

请注意,这些RX和TX标签是与设备本身相关的。所以来自一个设备的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(GND)信号表示一个起始位或一个数值为0的数据位。

通信协议

RS-232可以在一些更古老的计算机和外围设备上找到,就像TTL系列的头部翻转一样。 RS-232信号通常介于-13V和13V之间,但该规范允许+/- 3V至+/- 25V之间的任何值。 在这些信号上,低电压(-5V,-13V等)表示空闲线路,停止位或值为1的数据位。高RS-232信号表示启动位或0- 值数据位。 这与TTL系列相反。

通信协议

在两种串行信号标准之间,TTL更容易实现到嵌入式电路中。 然而,低电压水平在长传输线上更容易损失。 RS-232或更复杂的标准如RS-485,更适合长距离串行传输。

将两个串行设备连接在一起时,确保其信号电压匹配很重要。 您不能直接将TTL串行设备与RS-232总线连接。 你必须改变这些信号!

接下来,我们将探讨微控制器用于在串行接口上并行总线上转换数据的工具。UART!

UART

这个串行谜题的最后一部分是找到一些东西来创建串行数据包并控制这些物理硬件线路。 输入UART。

通用异步接收器/发送器(UART)是负责实现串行通信的电路块。 本质上,UART充当并行和串行接口之间的媒介。 在UART的一端是一条八线左右的数据线(加上一些控制引脚),另一端是两条串行线 - RX和TX。

通信协议

超简化的UART接口。 一端并行,另一端串行。

UART确实作为独立IC存在,但它们更常见于微控制器内部。 你必须检查你的微控制器的数据表,看它是否有任何UART。 有些没有,有的有一个,有的有很多。 例如,基于“老忠实”ATmega328的Arduino Uno只有一个UART,而基于ATmega2560的Arduino Mega则有四个UART。

由于首字母缩写词中的R和T指示,UART负责发送和接收串行数据。 在发送端,UART必须创建数据包(附加同步和奇偶校验位),并将该数据包以精确定时(根据设置的波特率)从TX线路发出。 在接收端,UART必须根据预期的波特率对RX线进行采样,挑出同步位并将数据吐出。

通信协议

内部UART框图(由Exar ST16C550数据表提供)

更高级的UART可能会将其接收到的数据放入缓冲区,直到微控制器获得它。 UART通常会以先进先出(FIFO)的方式释放其缓冲数据。 缓冲区可以小至几位,或者可以大至数千字节。

软件UART

如果一个微控制器没有UART(或者没有足够的),串行接口可能会被比特冲突 - 直接由处理器控制。 这就是SoftwareSerial所采用的Arduino库。 比特冲突是处理器密集型的,通常不像UART那么精确,但它在一个紧凑的环境中工作。

常见的陷阱

这就是关于串行通信的一切。 留下几个常见的错误,这对任何经验级别的工程师来说都很容易:

RX到TX,TX到RX

似乎很简单。 尽可能多地希望他们的标签匹配,请务必跨越串行设备之间的RX和TX线路。

FTDI Basic编程Pro Mini。 注意RX和TX交叉!

波特率不匹配

波特率就像串行通信的语言。如果两个设备不能以相同的速度说话,数据可能会被误解,或者完全被忽略。如果所有接收设备在接收线上看到的都是垃圾,请检查确保波特率匹配。

通信协议

数据以9600 bps传输,但以19200 bps传输。 波特不匹配=垃圾。

主线争夺

串行通信旨在允许只有两个设备通过一条串行总线进行通信。 如果多个设备试图在同一条串行线路上传输,则可能会遇到总线争用。 敦敦敦...

例如,如果您将GPS模块连接至Arduino,则可以将该模块的TX线连接至Arduino的RX线。 但是,Arduino RX引脚已连接到USB至串行转换器的TX引脚,无论何时您编程Arduino或使用串行监视器时都会使用该引脚。 这就设定了GPS模块和FTDI芯片同时尝试在同一条线路上传输的潜在情况。

通信协议

两个发送器发送给一个接收器会导致总线争用的可能性。

试图在同一行上同时传输数据的两台设备很糟糕! 在“最好”的情况下,这两款设备都不会发送数据。 在最坏的情况下,这两款器件的发射线路都工作(尽管这很罕见,并且通常受到保护)。

将多个接收设备连接到单个传输设备可能是安全的。 没有真正的规格,但它会起作用。 例如,如果将串行LCD连接到Arduino,最简单的方法可能是将LCD模块的RX线连接到Arduino的TX线。 Arduino的TX已连接到USB编程器的RX线,但仍然只剩下一个设备控制传输线。

通信协议

像这样分配TX线路从固件的角度来看仍然是危险的,因为你不能挑选哪个设备听到什么传输。 液晶显示器最终会收到不适合它的数据,这可能会命令它进入未知状态。

一般情况下 - 一个串行总线,两个串行设备!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分