差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
uart [2019/05/06 18:43]
gongyu
uart [2021/02/06 16:31] (当前版本)
gongyusu [UART的构成]
行 1: 行 1:
-{{ :​eetreewechat.png?​600 |}} <WRAP centeralign>​**扫描二维码,关注微公众号“电子森林”,可以在手机上查看本网站的所有文章** </​WRAP>​+## UART - 异步串行通
  
-一个通用的异步接收/​发射器,简称为UART /​ˈjuːɑːrt/,​ 是一种计算机硬件设备,它在计算机中的字符(通常是字节)之间转换数据,以及在起始位和停止位之间封装这些字符的异步串行通信格式,​ 其中数据格式和传输速度是可配置的。UART通常与通信标准结合使用,例如TIA(以前称为EIA)[[RS-232]],[[RS-422]]或[[RS-485]]。 通用名称表示数据格式和传输速度是可配置的。 电信号电平和方法(例如差分信号等)由UART外部的驱动电路处理。+----
  
-异步串行通信的计算机硬件设备,电信号电平和方法由UART外部的驱动电路处理。 UART通常是用于通过计算机或外围设备串行端口进行串行通信的单独(或部分)集成电路(IC)。 一个或多个UART外设通常集成在微控制器芯片中。 相关设备,通用同步和异步接收器 - 发送器(USART)也支持同步操作+一个通异步接收/​发射器,简称为UART /​ˈjuːɑːrt/,​ 是一种计算机硬件设备,它在计算机中的字符(通常是字节)之间转换数据,以及在起始位和停止位之间封装这些字符的异步串行通信格式,​ 其中数据格式和传输速度是可配置的。UART通常与通信标准结合使用,例如TIA(以前称为EIA)[[RS-232]],RS-422或RS-485。 通用名称表示数据格式和传输速度是可配置的。 ​电信号电平和方法(例如差分信号等)由UART外部的驱动电路处理。
  
 UART通常是用于通过计算机或外围设备串行端口进行串行通信的单独(或部分)集成电路(IC)。 UART现在通常包含在微控制器中。 双UART或DUART将两个UART组合成一个芯片。 八进制UART或OCTART将八个UART组合成一个封装,例如Exar XR16L788或NXP SCC2698。 相关设备,通用同步/​异步接收器/​发送器(USART)也支持同步操作。 UART通常是用于通过计算机或外围设备串行端口进行串行通信的单独(或部分)集成电路(IC)。 UART现在通常包含在微控制器中。 双UART或DUART将两个UART组合成一个芯片。 八进制UART或OCTART将八个UART组合成一个封装,例如Exar XR16L788或NXP SCC2698。 相关设备,通用同步/​异步接收器/​发送器(USART)也支持同步操作。
  
-#### 发送和接收串行数据 +UART采用字节数据并以顺序方式发送各个位。在目的地,第二个UART将这些位重新组合成完整的字节。每个UART都包含一个移位寄存器,它是串行和并行形式之间转换的基本方法。通过单线或其他介质的数字信息(比特)的串行传输比通过多条线的并行传输更便宜。
-通用异步接收器 - 发送器(UART采用字节数据并以顺序方式发送各个位。在目的地,第二个UART将这些位重新组合成完整的字节。每个UART都包含一个移位寄存器,它是串行和并行形式之间转换的基本方法。通过单线或其他介质的数字信息(比特)的串行传输比通过多条线的并行传输更便宜。+
  
-UART通常不直接生成或接收不同设备之间使用的外部信号。独的接口设备用于将UART的逻辑电平信号转换为外部信号电平和从外部信号电平转换,其可以标准的电平,电流电平或信号。+UART通常不直接生成或接收不同设备之间使用的外部信号。独的接口设备用于将UART的逻辑电平信号转换为外部信号电平和从外部信号电平转换。外部信号可以有许多不同的形式。电压信号标准的示例是来自EIA的[[RS-232]],RS-422和RS-485。历史上,路中使用电流流环路)。一些信令方案不使用电线。示例是其串行端口配置文件(SPP)中的光纤,IrDA(红外线)和(无线)蓝牙。一些信令方案使用载波信号的调制(有或没有线路)。例如,使用电话线调制解调器调制音频信号,使用数据无线电调制RF调制,以及使用DC-LIN进行电力线通信
  
 通信可以是单工的(仅在一个方向上,没有规定接收设备将信息发送回发送设备),全双工(两个设备同时发送和接收)或半双工(设备轮流发送和接收) )。 通信可以是单工的(仅在一个方向上,没有规定接收设备将信息发送回发送设备),全双工(两个设备同时发送和接收)或半双工(设备轮流发送和接收) )。
  
-UART通常不直接生成或接收不同设备之间使用的外部信号。独立的接口设备用于将UART的逻辑电平信号转换为外部信号电平和从外部信号电平转换。外部信号可以有许多不同的形式。电压信号标准的示例是来自EIA的[[RS-232]],[[RS-422]]和[[RS-485]]。历史上,电流电路中使用电流(电流环路)。一些信令方案不使用电线。其示例是其串行端口配置文件(SPP)中的光纤,IrDA(红外线)和(无线)蓝牙。一些信令方案使用载波信号的调制(有或没有线路)。例如,使用电话线调制解调器调制音频信号,使用数据无线电调制RF调制,以及使用DC-LIN进行电力线通信。 
  
-通信可以是单工的(仅在一个方向上,没有规定接收设备将信息发送回发送设备),全双工(两个设备同时发送和接收)或半双工(设备轮流发送和接收) )。 +### UART的工作原理
- +
-#### UART的工作原理+
  
 UART(Universal Asynchronous Receiver/​Transmitter,翻译过来叫通用异步收发) 其实不是像SPI和I2C这样的通信协议,而是MCU(微控制器)中的物理电路或独立的IC,它的主要用途是发送和接收串行数据。 UART(Universal Asynchronous Receiver/​Transmitter,翻译过来叫通用异步收发) 其实不是像SPI和I2C这样的通信协议,而是MCU(微控制器)中的物理电路或独立的IC,它的主要用途是发送和接收串行数据。
行 49: 行 45:
 {{ :​uart_baud.jpg |}} {{ :​uart_baud.jpg |}}
  
-##### 数据帧构成+#### 数据帧构成
 发送的每个数据块(通常是一个字节)实际上是以比特或比特帧发送的。通过将同步和奇偶校验位附加到数据来创建帧。 发送的每个数据块(通常是一个字节)实际上是以比特或比特帧发送的。通过将同步和奇偶校验位附加到数据来创建帧。
 {{ :​uart_frame.jpg |}} {{ :​uart_frame.jpg |}}
行 62: 行 58:
 下面我们详细介绍一下每一部分。 下面我们详细介绍一下每一部分。
  
-###### 数据块+##### 数据块
 每个串行数据包的真正有营养的是它携带的数据,我们且称之为“数据块”,它没有具体的大小限制。 每个数据包中的数据量可以设置为5到9位。 标准数据的大小一般是最基本的8位字节,但其它大小也有其用途,有时候7位数据能比8位更高效,比如只是用来传输7位ASCII字符。 每个串行数据包的真正有营养的是它携带的数据,我们且称之为“数据块”,它没有具体的大小限制。 每个数据包中的数据量可以设置为5到9位。 标准数据的大小一般是最基本的8位字节,但其它大小也有其用途,有时候7位数据能比8位更高效,比如只是用来传输7位ASCII字符。
  
 在统一了字符长度后,两个串行设备也必须就其数据的字节顺序达成一致。 数据是最高位(msb)还是最低位先发送? 缺省设定为首先传输最低有效位(lsb)。 在统一了字符长度后,两个串行设备也必须就其数据的字节顺序达成一致。 数据是最高位(msb)还是最低位先发送? 缺省设定为首先传输最低有效位(lsb)。
  
-###### 同步位+##### 同步位
  
 同步位是每个数据块传输的两个或三个特殊位。 它们是起始位和停止位,顾名思义,这些位标记了数据包的开头和结尾。 始终只有一个起始位,但停止位的数量可配置为一个或两个(通常情况下保留为一个)。 同步位是每个数据块传输的两个或三个特殊位。 它们是起始位和停止位,顾名思义,这些位标记了数据包的开头和结尾。 始终只有一个起始位,但停止位的数量可配置为一个或两个(通常情况下保留为一个)。
行 76: 行 72:
   * 停止位: 单字节UART传输的最后一位。 其逻辑电平与信号的空闲状态相同,即逻辑高, 这是另一个开销。   * 停止位: 单字节UART传输的最后一位。 其逻辑电平与信号的空闲状态相同,即逻辑高, 这是另一个开销。
  
-###### 奇偶校验位+##### 奇偶校验位
 奇偶校验是一种非常简单的低级错误检查方式,它分为两种方式:奇数或偶数。 为了产生奇偶校验位,数据字节的所有5-9位相加,并且求和的奇偶性决定该位是否置位。 例如,假设奇偶校验设置为偶数并且正被添加到数字字节(如0b01011101,这串数中有奇数(5)个1,奇偶校验位将被设置为1。相反,如果奇偶校验模式设置为奇数 ,奇偶校验位则为0。 奇偶校验是一种非常简单的低级错误检查方式,它分为两种方式:奇数或偶数。 为了产生奇偶校验位,数据字节的所有5-9位相加,并且求和的奇偶性决定该位是否置位。 例如,假设奇偶校验设置为偶数并且正被添加到数字字节(如0b01011101,这串数中有奇数(5)个1,奇偶校验位将被设置为1。相反,如果奇偶校验模式设置为奇数 ,奇偶校验位则为0。
    
行 111: 行 107:
 {{ :​uart_bitstream.jpg |}} {{ :​uart_bitstream.jpg |}}
  
-#### UART的优点和缺点+### UART的优点和缺点
 没有任何一种通信方式和协议是完美的,因此没中方式都有其优点,也有其缺点,我们来看看UART的主要优缺点。 没有任何一种通信方式和协议是完美的,因此没中方式都有其优点,也有其缺点,我们来看看UART的主要优缺点。
  
-##### UART的优点:+#### UART的优点:
   * 只需要使用两根信号线就可以实现全双工的数据传输(不算电源线)   * 只需要使用两根信号线就可以实现全双工的数据传输(不算电源线)
   * 无需时钟信号   * 无需时钟信号
行 122: 行 118:
   * 相对比较容易配置和运行   * 相对比较容易配置和运行
  
-##### UART的缺点:+#### UART的缺点:
   * 与并行通信以及USART相比,数据传输的速度较慢   * 与并行通信以及USART相比,数据传输的速度较慢
   * 帧的大小被限定为最多9位   * 帧的大小被限定为最多9位
行 159: 行 155:
  
  
-#### PC和微控制器的连接+### PC和微控制器的连接
  
 实际的项目中可以有多种方式来连接PC和MCU,最方便的是下面列出的几种方式中的最后一种。 实际的项目中可以有多种方式来连接PC和MCU,最方便的是下面列出的几种方式中的最后一种。
行 183: 行 179:
  
  
-#### 使用UART最容易碰到的问题:+### 使用UART最容易碰到的问题:
  
-##### RX-To-TX & TX-To-RX+#### RX-To-TX & TX-To-RX
  
 工程师经常犯的错误就是将RX和TX线错误连接,因此在遇到连接不通的时候一定要先检查确定一下是否存在这方面的问题。 工程师经常犯的错误就是将RX和TX线错误连接,因此在遇到连接不通的时候一定要先检查确定一下是否存在这方面的问题。
行 191: 行 187:
  
  
-##### 波特率失配+#### 波特率失配
  
 如果数据以9600bps的波特率传输,并以19200bps的速率接收。 收到的数据将是一团垃圾! 波特率必须在发送端和接收端匹配,这是UART串行通信的经验法则,波特率的最大允许偏移趋于介于(1-2%)之间。 因此尝试在两端生成完全相同的波特率,以避免错配错误。 如果数据以9600bps的波特率传输,并以19200bps的速率接收。 收到的数据将是一团垃圾! 波特率必须在发送端和接收端匹配,这是UART串行通信的经验法则,波特率的最大允许偏移趋于介于(1-2%)之间。 因此尝试在两端生成完全相同的波特率,以避免错配错误。
 {{ :​baudrateerror.jpg |}} {{ :​baudrateerror.jpg |}}
  
-#### UART总线长度 vs 波特率+### UART总线长度 vs 波特率
 UART串行总线可以传输很长的距离,但传输的距离以及最高能够达到的波特率都取决于传输得越远,波特率也就会降低,它还取决于UART协议本身的硬件实现(物理层)。我们只提到TTL-UART和RS-232标准。 UART串行总线可以传输很长的距离,但传输的距离以及最高能够达到的波特率都取决于传输得越远,波特率也就会降低,它还取决于UART协议本身的硬件实现(物理层)。我们只提到TTL-UART和RS-232标准。
  
-##### RS-232+#### RS-232
 RS-232的最大电缆长度为50英尺。 但实际上它取决于波特率、电缆的等效电容和环境噪声。 下表是TI多年前通过实验总结的一些经验法则。 RS-232的最大电缆长度为50英尺。 但实际上它取决于波特率、电缆的等效电容和环境噪声。 下表是TI多年前通过实验总结的一些经验法则。
 {{ :​baudlength.png |}} {{ :​baudlength.png |}}
  
-##### TTL-UART+#### TTL-UART
  
 TTL电平的UART仅支持5V的电压摆幅,因此信号传输的距离以及能够支持到的波特率取决于下面的3个元素: TTL电平的UART仅支持5V的电压摆幅,因此信号传输的距离以及能够支持到的波特率取决于下面的3个元素:
行 210: 行 206:
   * 噪声:任何环境中都会有噪声,带屏蔽的双绞线电缆对信号的传输会有帮助   * 噪声:任何环境中都会有噪声,带屏蔽的双绞线电缆对信号的传输会有帮助
  
-====== 结构 ======+### UART的
 一个UART一般包含了如下的一些组成部分:​ 一个UART一般包含了如下的一些组成部分:​
   * 一个时钟发生器,​通常是比特率的整数倍,以便能够在一个bit周期的中间进行采样   * 一个时钟发生器,​通常是比特率的整数倍,以便能够在一个bit周期的中间进行采样
行 222: 行 218:
   * 掌管DMA控制器的集成化总线(可选)   * 掌管DMA控制器的集成化总线(可选)
  
-====== 特殊接收器条件 ====== +### 用FPGA实现UART功能 
- +  - [[uart_verilog|UART的Verilog代码]] 
-===== Overrun error ===== +  [[uart串口块|基于STEP FPGA的UART串口通信模块驱动]]
- +
-An "​overrun error" occurs when the receiver cannot process the character that just came in before the next one arrives. Various devices have different amounts of buffer space to hold received characters. The CPU or DMA controller must service the UART in order to remove characters from the input buffer. If the CPU or DMA controller does not service the UART quickly enough and the buffer becomes full, an Overrun Error will occur, and incoming characters will be lost. +
- +
-===== Underrun error ===== +
- +
- +
-An "​underrun error" occurs when the UART transmitter has completed sending a character and the transmit buffer is empty. In asynchronous modes this is treated as an indication that no data remains to be transmitted,​ rather than an error, since additional stop bits can be appended. This error indication is commonly found in USARTs, since an underrun is more serious in synchronous systems. +
- +
-===== Framing error ===== +
- +
- +
-A "​framing error" occurs when the designated "​start"​ and "​stop"​ bits are not found. As the "​start"​ bit is used to identify the beginning of an incoming character, it acts as a reference for the remaining bits. If the data line is not in the expected state (hi/lo) when the "​stop"​ bit is expected, a Framing Error will occur. +
- +
-===== Parity error ===== +
- +
- +
-A Parity Error occurs when the parity of the number of 1 bits disagrees with that specified by the parity bit. Use of a parity bit is optional, so this error will only occur if parity-checking has been enabled. +
- +
-===== Break condition ===== +
- +
-A "break condition"​ occurs when the receiver input is at the "​space"​ (logic low, i.e., '​0'​) level for longer than some duration of time, typically, for more than a character time. This is not necessarily an error, but appears to the receiver as a character of all zero bits with a framing error. The term "​break"​ derives from current loop signaling, which was the traditional signaling used for teletypewriters. The "​spacing"​ condition of a current loop line is indicated by no current flowing, and a very long period of no current flowing is often caused by a break or other fault in the line. +
- +
-Some equipment will deliberately transmit the "​space"​ level for longer than a character as an attention signal. When signaling rates are mismatched, no meaningful characters can be sent, but a long "​break"​ signal can be a useful way to get the attention of a mismatched receiver to do something (such as resetting itself). Unix-like systems can use the long "​break"​ level as a request to change the signaling rate, to support dial-in access at multiple signaling rates. +
- +
-====== UART式 ====== +
- +
-====== Modem中的UART ​====== +
-Modems for personal computers that plug into a motherboard slot must also include the UART function on the card. The original 8250 UART chip shipped with the IBM personal computer had a one character buffer for the receiver and the transmitter each, which meant that communications software performed poorly at speeds above 9600 bits/​second,​ especially if operating under a multitasking system or if handling interrupts from disk controllers. High-speed modems used UARTs that were compatible with the original chip but which included additional FIFO buffers, giving software additional time to respond to incoming data. +
- +
-A look at the performance requirements at high bit rates shows why the 16, 32, 64 or 128 byte FIFO is a necessity. The Microsoft specification for a DOS system requires that interrupts not be disabled for more than 1 millisecond at a time. Some hard disk drives and video controllers violate this specification. 9600 bit/s will deliver a character approximately every millisecond,​ so a 1 byte FIFO should be sufficient at this rate on a DOS system which meets the maximum interrupt disable timing. Rates above this may receive a new character before the old one has been fetched, and thus the old character will be lost. This is referred to as an overrun error and results in one or more lost characters. +
- +
-A 16 byte FIFO allows up to 16 characters to be received before the computer has to service the interrupt. This increases the maximum bit rate the computer can process reliably from 9600 to 153,000 bit/s if it has a 1 millisecond interrupt dead time. A 32 byte FIFO increases the maximum rate to over 300,000 bit/s. A second benefit to having a FIFO is that the computer only has to service about 8 to 12% as many interrupts, allowing more CPU time for updating the screen, or doing other chores. Thus the computer'​s responses will improve as well.+