精华内容
下载资源
问答
  • uart协议

    2021-02-14 23:51:38
    uart协议 一、基本概念 uart:Universal Asynchronous Receiver/Transmitte,简称通用串口 usart:有些单片机中会有uart和usart的区别,相比uart增加了同步信号 TTL/CMOS电平:信号电平标准, RS-232:在uart的基础...

    uart协议
    一、基本概念
    uart:Universal Asynchronous Receiver/Transmitte,简称通用串口
    usart:有些单片机中会有uart和usart的区别,相比uart增加了同步信号
    TTL/CMOS电平:信号电平标准,
    RS-232:在uart的基础上定义了信号的电气特性
    RS-422:在RS-232的基础上定义了差分信号的传输的电气特性
    RS-485:在RS-422的基础上定义了半双工模式
    二、硬件连接
    UART与IIC、SPI 等接口一样,都属于串行通信接口,但是UART只有数据线收和发,并无时钟线,故为异步串行通信接口,IIC和SPI属于同步串行通信接口。UART属于全双工通信。硬件连接如下:
    TX— — — — — — — — — RX
    RX— — — — — — — — —TX
    GND— — — — — — — — GND
    TX:发送端口,Transmitter,往接收器上发送数据,与RX相连。
    RX:接收端口,Receiver,从发送器上接收数据,与TX相连。
    GND:设备共地,进行串口通信的两个设备必须要共地。
    在进行硬件设计时,需要注意以下几点:
    (1)TX与RX需要交叉相连
    (2)如果RX TX在板上走向过长,需要串接一个100欧姆的电阻,接在源端即可。
    (3)确认通信双方是否共地。
    (4)串口通信并没有定义标准连接器端口,可以灵活设计。
    三、通信协议
    图1
    如图所示,串口的通信协议包含空闲状态,起始位置,数据位,校验位,停止位。
    空闲状态(IDLE):在串口没有进行通信时,TX与RX是呈现高电平状态,表示空闲状态IDLE。
    起始位(start bit):在空闲状态下,TX发送一个低电平,则表示开始通信。
    数据位(data):一次传输的数据,一共8位,一般从LSB开始发送。
    停止位(stop bit):在发送完数据位和检验位后,还需要发送高电平的停止位,表示一次串口通信结束。停止位可以是1位,1.5位,2位。
    校验位(Parity Bit):用于判断传输期间是否有数据错误,有无校验、奇偶检验、01校验方式。
    波特率(baud rate):TX和RX只有在相同波特率下,才能正常进行通信。通常用9600 bps,19200 bps,115200 bps。
    那么一次完整的串口通信流程是这样的:
    发送流程:首先TX和RX在没有传输任务时,保持高电平,处于空闲状态,然后需要传输数据时,TX端口首先发送一个低电平,表示串口通信开始,TX端口首先从最低位开始传输,先传bit0,最后传bit7,如果没有校验位,则在传输完数据后,直接发送高电平,通信停止,这样完成了传输一个字节的任务,如果有多个字节,重复传输即可。
    接收流程:首先RX在没有接收任务时,保持高电平,处于空闲状态,当检测到RX端口上有起始信号时,开始通信,一位一位地从RX端口上接收数据。最后接收到停止信号,完成接收一个字节的任务,如果有多个字节,重复传输即可。
    当然,上述通信过程都需要在相同的波特率下进行。
    四、其他
    TTL/CMOS
    TTL 电平,逻辑“0”等于 0V 电压,逻辑“1”等于+5V 电压。
    CMOS 电平,逻辑“0”接近 0V 电压,逻辑“1”接近电源电压(3.3V 或其他) TTL 电路与 CMOS 电路的区别如下:(1)TTL 电路是电流控制器件,而 CMOS 电路是电 压控制器件。(2)TTL 电路的速度快,传输延迟时间短(5-10ns),但是功耗大。(3)CMOS 电路的速度慢,传输延迟时间长(25-50ns),但功耗低。(4)CMOS 电路本身的功耗与输入信 号的脉冲频率有关,频率越高,芯片即越热,这是正常现象。 所以在日常开发中,UART 的电平往往是由 MCU 决定的,而 MCU 的电平,往往是 TTL/CMOS 电平。
    RS-232 电气标准
    在 TxD 和 RxD 信号管脚上: 逻辑“1”电压范围-3V~-15V 逻辑“0”电压范围+3~+15V 在 RTS、CTS、DSR、DTR 和 DCD 等控制线上: 信号有效(接通,ON 状态,正电压)电压范围+3V~+15V 信号无效(断开,OFF 状态,负电压)电压范围-3V~-15V。
    RS-422 电气标准
    RS-422 标准全称是“平衡电压数字接口电路的电气特性”,该协议制定了接口电路的电气 特性。除了信号线的电气特性,其他规范基本都是沿用 RS232 的规范。 RS-422 的信号线采用的是差分传输方式,即原来的 TxD、RxD 信号线,此时分别改用两 根线来完成,即 TxD+和 TxD-、RxD+和 RxD-两组,并且利用两根线之间的电压差值来表示数 据的逻辑“1”和逻辑“0”。 逻辑“1”的差分信号电压差范围:+2~+6V 逻辑“0”的差分信号电压差范围:-6~-2V 最大通信距离:1500 米 通信速率范围:100 kbit / s - 10 Mbit / s。
    RS-485 电气标准
    EIA 于 1983 年在 RS-422 基础上制定了 RS-485 标准,由之前的 4 线改为 2 线传输,即全 双工改为半双工,增加了多点、双向通信能力。

    展开全文
  • UART协议

    2020-07-27 16:48:50
    UART协议1. 定义2. 通信协议3. 工作原理4. UART、IIC、SPI的区别和联系 1. 定义 UART是(Universal Asynchronous Receiver/Transmitter)通用异步收发器的简称,是一种全双工、异步通信接口,工作于数据链路层,支持...

    1. 定义

    UART是(Universal Asynchronous Receiver/Transmitter)通用异步收发器的简称,是一种全双工、异步通信接口,工作于数据链路层,支持RS232、RS485等规范电路。虽然UART可以实现串并行数据的转换,但UART依然是串行接口。UART用于计算机内部与外部设备之间的通信,计算机内部数据传输都是并行的,但外部设备的数据传输往往都是串行的,这样就需要一个芯片去作为媒介,去解决这一问题。UART就可实现这一功能,UART将计算机内部的并行数据转化为串行输出,并将外部设备的串行数据转化为并行输入。UART是通信协议的一种,并不算真正意义上的总线

    • 串并行数据转换
      计算机内部是按并行方式传送数据的,但外部设备一般是按串行方式处理数据;当计算机采用串行方式与外部通信时,必须进行串并行变换。发送数据时,需通过并行输入、串行输出移位寄存器将CPU送来的并行数据转换成串行数据后,再发送到外部设备;接收数据时,则需经过串行输入、并行输出移位寄存器,将接收到的串行数据转换成并行数据后送到CPU去。

    • 全双工,异步
      UART有发送和接收引脚,可以同时进行数据的收发;I2C和SPI总线工作于同步方式,主设备和从设备使用的都是同一时钟信号,发送数据先发送一个“同步信号”,例如I2C先发送从设备地址,SPI先发送片选信号;因为主从设备使用的是同一时钟信号,两个节奏保持一致,所以当主从设备通信建立完成后,就开始发送一块数据,直到数据发送结束,中途都不在需要起始位和停止位;但异步方式就有所不同,发送的字符与字符之间的时间间隔是不定的,接收方不知道数据会在何时来临,所以必须时刻做好准备,这也就要求在发送的每个字符上都加上起始位和停止位,这样接收方才能准确的把数据接收下来。

    • 引脚说明
      以RS232为例,串口引脚有9脚和25脚两种,25脚主要用于早期设备,现已逐渐淘汰;实际使用中,一般只需三根线(发送、接收和接地)就能实现数据收发,将设备的TXD/RXD与计算机的RXD/TXD连在一起,就能实现全双工传输。

    • RS232/RS485
      RS232和RS485都是串行通信中的一种物理接口电气标准,规定传输介质(电缆)、收发电平等,其实UART只是一种通信协议,具体的数据传输需要专门的传输电路去做;UART工作于数据链路层RS232/RS485工作于物理层从这里也能看出RS232/RS485和UART是相对独立的。例如:RS232规定了信号传输电平;逻辑高电平,有负载时为-3V到-15V,无负载时为-25V;逻辑低电平,有负载时为+3V到+15V,无负载时为+25V。一般在个人台式计算机上会有两组 RS-232 接口,分别称为 COM1 和 COM2。但RS232只能用于点对点的通信,不能联网功能,而且如今大多计算机本身及I/O接口芯片都采用TTL电平(0到0.8V为逻辑0,+2.0V到+5V为逻辑1),所以使用RS232时,必须设计专门的电平转换电路。
      在这些条件限制下,新的接口标准RS485就产生了。RS485以两线间的电压差为+(2-6) V表示逻辑1;以两线间的电压差为-(2-6)V表示逻辑0。接口信号电平比RS-232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。

    2. 通信协议

    因为UART是异步传输,所以传输的每个字符都需要特定的格式;为了保证传输正确,UART为自己定义了数据格式。对于每一个传输的字符,数据格式都可以用下面的数据位定义。
    在这里插入图片描述
    起始位:当有数据要发送时,数据信号线变成低电平,并持续一段时间,用于表示字符的开始,这一位称为起始位。

    数据位:紧接着起始位之后。在信号线上会依次出现待发送的每一位字符,最低有效位D0最先出现,因此它最早被发送出去。采用不同的编码方案,数据位的个数不同,数据位的个数可以是4、5、6、7、8等;当字符用ASCII码表示时,数据位占7位(D0~D7)。

    奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性,例如数据传输采用奇校验时,如果数据“1”的个数是奇数,这一位就被置为“0”,反之置为“1”。当然系统中也可以不采用奇偶校验。

    停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。奇偶校验位的后面至少应该有一位高电平表示停止位,如果传输完一个字符后立即传输下一个字符,那么后一个字符的起始位就紧跟着前一个字符的停止位,否则停止位后又进入一个空闲状态。

    空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。
    由此可见,异步方式发送一个7位的ASCII字符时,实际发送10位,10.5位或11位。如果采用10位来发送的话,就意味着发送过程中,将会有30%的传输时间被浪费;如果是同步传输就不会出现这一问题。

    波特率 :波特率用来表示数据传输的速率,在计算机中把每秒钟内所传送的数据位数称为波特率,例如如果波特率设为9600,每个字符由1个起始位、7个数据位、1个奇偶校验位和1个停止位等10个数据位组成,则每秒可以传输9600/10=960个字符。

    3. 工作原理

    • 基本结构

    在这里插入图片描述
    输出缓冲寄存器:接收CPU从数据总线上送来的并行数据,并加以保存。
    输出移位寄存器:接收从输出缓冲器送来的并行数据,以发送时钟的速率把数据逐位移出,即将并行数据转换为串行数据输出。
    输入移位寄存器:以接收时钟的速率把出现在串行数据输入线上的数据逐位移入,当数据装满后,并行送往输入缓冲寄存器,即将串行数据转换成并行数据。
    输入缓冲寄存器:从输入移位寄存器中接收并行数据,然后由CPU取走。
    控制寄存器:接收CPU送来的控制字,由控制字的内容,决定通信时的传输方式以及数据格式等。例如采用异步方式还是同步方式,数据字符的位数,有无奇偶校验,是奇校验还是偶校验,停止位的位数等参数。
    状态寄存器:存放着接口的各种状态信息,例如输出缓冲区是否空,输入字符是否准备好等。在通信过程中,当符合某种状态时,接口中的状态检测逻辑将状态寄存器的相应位置“1”,以便让CPU查询。

    • 接收数据

    UART接收数据时,接收电路始终监视着串行输入端RxD,当发现数据线上出现一个起始位时,就开始一个字符的接收过程,在按相应的格式将串行数据转换成并行数据,送入输入缓冲寄存器,等CPU来读取。
    如果设置了奇偶校验位,在传输工程中还能进行奇偶检验;还能自动检测每个字符的停止位,若无停止位,则置帧出错标志FRERR。

    • 发送数据

    UART发送数据时,输出缓冲器把来自CPU的并行数据加上相应的控制信息(起始位,奇偶检验位,停止位等),再在时钟脉冲的控制下,经并/串转换电路,转换成串行数据后,从TxD引脚一位一位地发送出去。为了让CPU正确控制数据的接收与发送,电路中还设有接收就绪和发送缓冲器空等状态信息。

    • 工作模式

    UART在接收数据时有两种常用的方式,中断和轮询;中断监测到有数据接收时,产生接收中断,去处理数据;轮询即每隔一段时间就来监测一下有没有数据接收,有就处理。
    中断:UART通信时,中断方式是一种比较高效的方式,当有数据需要接收时,就会触发中断去处理数据,及时把缓冲区数据取走;早期没有FIFO时,UART是每次收发一个字符就产生一次中断,这种频繁的中断操作,显然会给CPU带来负担;但有了FIFO后,就可以在收发多个数据后,再触发中断,然后统一处理,这就很大程度上提高了收发效率;一般是在FIFO满了之后会触发中断,但如果数据量比较少或者发送端传送数据间隔时间比较长,会有超时中断来处理数据。
    轮询:轮询方式就是每隔一定时间就来检测一下有没有数据需要处理,这种方式相对于中断来说,实时性就差了很多;而且对于没有FIFO的设备来说,如果字符没有被及时的取走,就会被后面的数据覆盖而导致数据出错。所以轮询操作一般用于对数据处理实时性要求不是很高,或者频繁的中断操作对CPU影响较大的场合。但有了FIFO之后,轮询方式容易丢失数据的问题,就得到了很大的改善。

    4. UART、IIC、SPI的区别和联系

    • 电气信号线上

    SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。

    如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。

    I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。
    如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。(注:I2C资料了解得比较少,这里的描述可能很不完备)

    UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。
    显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。

    • SPI和UART可以实现全双工,I2C半双工
    • UART一帧可以传5/6/7/8位,IIC必须是8位。IIC和SPI都从最高位开始传。
    • SPI用片选信号选择从机,IIC用地址选择从机。
    • SPI 速率与芯片有关,有的400K,有的到几兆;
      rs232速率一般最大115200;
      iic一般应用400K,CAN最高可到1M;
      spi和iic一般应用在芯片之间通讯,RS232可应用与设备与设备之间短距离通讯,最大15米,CAN适用设备间通讯,抗干扰能力强,理论上通讯距离可到10KM
    展开全文
  • UART 协议

    2020-04-03 10:28:01
    发送 在串口通信中波特率表示每秒能传输的数据位,9600就是每秒能传输9600位 字节的发送 //-------1字节数据的发送------- module uart_tx( input clk, input rst_n, input cnt_start, //发送使能 input [7:0]tx_...

    异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。
    串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。
    在这里插入图片描述
    起始位:先发出一个逻辑”0”信号,表示传输字符的开始。
    数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输
    校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)
    停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
    空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

    发送
    在串口通信中波特率表示每秒能传输的数据位,9600就是每秒能传输9600位
    在这里插入图片描述
    在这里插入图片描述
    字节的发送

    //-------1字节数据的发送-------
    module uart_tx(
        input clk,
        input rst_n,
        input cnt_start,                                        //发送使能
    	input [7:0]tx_data,
        output reg tx,
        output reg tx_done                                      //传输一个字节完成标志
        );
        
        reg [12:0]cnt_bps; 
        parameter bps_t = 13'd5207;                             //传输1bit所需计数值 
        always @(posedge clk or negedge rst_n)
        begin
           if(!rst_n) 
              cnt_bps <= 13'd0;
           else if(cnt_bps == bps_t) 
              cnt_bps <= 13'd0;
           else if(cnt_start) 
              cnt_bps <= cnt_bps + 1'b1;
           else 
              cnt_bps <= 1'b0;
        end
        wire bps_sig;
        assign bps_sig = (cnt_bps ==  13'd2604) ? 1'b1 : 1'b0;  //将采集数据的时刻放在波特率计数器每次循环计数的中间位置
           
        reg [3:0]state;	
        always @(posedge clk or negedge rst_n)
        begin
           if(!rst_n) begin
              state <= 4'd0;
              tx <= 1'b1;
              tx_done <= 1'b0;
    		  end
           else begin
              case(state)
    			0: if(cnt_start & bps_sig) begin
    				state <= state + 1'b1;
    				tx <= 1'b0;
    				end
    			else begin
    				state <= state;
    				tx <= 1'b1;
    				end
    			1,2,3,4,5,6,7,8: if(bps_sig) begin
    					tx <= tx_data[state - 1'b1]; //注意,从低位依次往高位发送
    					state <= state + 1'b1;
    					end
    				else begin
    					state <= state;
    					tx <= tx;
    					end
    			9,10: if(bps_sig) begin
    					state <= state + 1'b1;
    					tx <= 1'b1;
    					end
    			11: begin
    					state <= state + 1'b1;
    					tx_done <= 1'b1;
    				end
    			12: begin
    					state <= 1'b0;
    					tx_done <= 1'b0;
    				end
              endcase
    		  end
        end
    endmodule
    
    

    数据的接收
    ,字节传输形式:1-0-x-x-x-x-x-x-x-x-0-1,检测到下降沿即-1-0-(起始标志)后开始进行接收字节,将接收到的一一存入寄存器中,8个bit后结束接收,就是简单的1个字节的接收。
    值得注意的是,虽然1字节=8bit,但是因为有起始标志(2bit:-1-0-)和结束标志(2bit:-0-1-),所以在发送和接收过程中,都需要考虑到这一点。

    //-------1字节的接收-------
    module uart_rx(
        input clk,
        input rst_n,
    	input data_rx,
        output [7:0] data_tx,
        output reg rx_int                                       //接收字节时状态为1
        );
        
        reg [12:0]cnt_bps;
    	reg bps_start;
        parameter bps_t = 13'd5207;                             //传输1bit所需计数值 
        always @(posedge clk or negedge rst_n)
        begin
           if(!rst_n) 
              cnt_bps <= 13'd0;
           else if(cnt_bps == bps_t) 
              cnt_bps <= 13'd0;
           else if(bps_start) 
              cnt_bps <= cnt_bps + 1'b1;
           else 
              cnt_bps <= 1'b0;
        end
        wire bps_sig;
        assign bps_sig = (cnt_bps ==  13'd2604) ? 1'b1 : 1'b0;  //将采集数据的时刻放在波特率计数器每次循环计数的中间位置
    	
    	reg	[1:0]	rx;
    	always @(posedge	clk	or	negedge	rst_n)begin
    		if(!rst_n)	rx <= 2'b11;
    		else	begin
    			rx[0]	<=	data_rx;
    			rx[1]	<=	rx[0];
    		end
    	end
    	wire nege_edge;
    	assign nege_edge= rx[1]	& ~rx[0];						//检测下降沿
    
    	reg	[3:0]num;	
    	always@(posedge	clk	or	negedge	rst_n)begin
    		if(!rst_n)	begin	
    			bps_start <= 1'b0;	
    			rx_int <= 1'b0;
    		end
    		else	if(nege_edge)begin
    			bps_start <= 1'b1;
    			rx_int <= 1'b1;
    		end
    		else if(num == 4'd10)begin
    			bps_start <= 1'b0;	
    			rx_int <= 1'b0;
    		end
    	end
    
    	reg	[7:0]	rx_data_temp_r;								//当前数据接收寄存器
    	reg	[7:0]	rx_data_r;									//用来锁存数据
    	always@(posedge	clk	or	negedge	rst_n)begin
    		if(!rst_n)	begin	
    			rx_data_r	<= 8'd0;
    			rx_data_temp_r	<= 8'd0;
    			num <= 4'd0;
    			end
    		else if(rx_int) begin
    			if(bps_sig) begin
    				num <= num + 1'b1;
    				case(num)
    					4'd1: rx_data_temp_r[0] <= data_rx;		//锁存第0bit
    					4'd2: rx_data_temp_r[1] <= data_rx;		//锁存第1bit
    					4'd3: rx_data_temp_r[2] <= data_rx;		//锁存第2bit
    					4'd4: rx_data_temp_r[3] <= data_rx;		//锁存第3bit
    					4'd5: rx_data_temp_r[4] <= data_rx;		//锁存第4bit
    					4'd6: rx_data_temp_r[5] <= data_rx;		//锁存第5bit
    					4'd7: rx_data_temp_r[6] <= data_rx;		//锁存第6bit
    					4'd8: rx_data_temp_r[7] <= data_rx;		//锁存第7bit
    					default: ;
    				endcase
    			end
    			else if(num == 4'd10)begin
    				rx_data_r <= rx_data_temp_r;
    				num <= 4'd0;
    			end
    		end
    	end
    
    	assign	data_tx = rx_data_r;							
    	
    endmodule
    
    

    tb

    module tb_uart_rx;
    
    	// Inputs
    	reg clk;
    	reg rst_n;
    	reg data_rx;
    
    	// Outputs
    	wire [7:0] data_tx;
    	wire rx_int;
    
    	// Instantiate the Unit Under Test (UUT)
    	uart_rx uut (
    		.clk(clk), 
    		.rst_n(rst_n), 
    		.data_rx(data_rx), 
    		.data_tx(data_tx), 
    		.rx_int(rx_int)
    	);
    
    	always #10 clk = ~clk;
    	initial begin
    		clk = 0;
    		rst_n = 0;
    		data_rx = 0;
    		// Wait 20 ns for global reset to finish
    		#20
    		rst_n = 1;
    		data_rx = 1;
    		#104160
    		rst_n = 1;
    		data_rx = 0;	//起始位:-1-0-
    		#104160			//传输11001011 (倒序)
    		rst_n = 1;
    		data_rx = 1;
    		#104160
    		rst_n = 1;
    		data_rx = 1;
    		#104160
    		rst_n = 1;
    		data_rx = 0;
    		#104160
    		rst_n = 1;
    		data_rx = 1;
    		#104160
    		rst_n = 1;
    		data_rx = 0;
    		#104160
    		rst_n = 1;
    		data_rx = 0;
    		#104160
    		rst_n = 1;
    		data_rx = 1;
    		#104160
    		rst_n = 1;
    		data_rx = 1;
    		#104160			//结束位 -0-1-
    		rst_n = 1;
    		data_rx = 0;
    		#104160
    		rst_n = 1;
    		data_rx = 1;
    		
    		#104160			//复位
    		rst_n = 0;
    		data_rx = 0;
    	end
          
    endmodule
    
    

    ref

    https://blog.csdn.net/qq_40789587/article/details/84073419?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5

    ref
    https://blog.csdn.net/zjy900507/article/details/79789671

    展开全文
  • 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UATR,是一种异步收发传输器。...1、UART通信协议UART作为异步串口通信协议的一种,工作原理是将传输数据的每一个字符一...

    通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UATR,是一种异步收发传输器。将数据由串行通信与并行通信间做传输转换,作为并行输入称为串行输出的芯片。UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。

    1、UART通信协议

    UART作为异步串口通信协议的一种,工作原理是将传输数据的每一个字符一位一位地传输。其中每一位(bit)的意义如下:

    起始位:先发出一个逻辑“0”的信号,表示传输字符开始。

    数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

    奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以次来校验数据传送的正确性。

    停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也就越慢。

    空闲位:处于逻辑“1”状态,表示当前线路上没有数据传输。

    2fe81a9fe7455ba2e3cbde2fb99116f8.png

    2、UART工作原理

    发送数据过程:空闲状态,线路处于高电平;当收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。

    数据接收过程:空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲。

    由于UART是异步传输,没有传输同步时钟,为了保证数据的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误吗。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。

    UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这是计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第一位数据,依次类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,数据接收完成。

    一个标准的10位异步串行通信协议(1个起始位、1个停止位和8个数据位)收发时序,如下图所示:

    e55a6f11477d93a965f380d3579ff4e9.png
    展开全文
  • Uart协议介绍

    2021-02-08 14:31:24
    文章目录前言一、Uart协议(即串口)的基本概念二、Uart配置基本属性1.波特率2.起始位3.数据位4.奇偶校验位5.停止位6.空闲位7.传输方向总结 前言 通用的硬件接口协议很多,我们通过几篇博文来一一介绍,今天要来了解...
  • uart协议_UART协议简介

    2020-12-10 20:49:13
    1UARTUART是异步串口通信协议,英文全称是Universal Asynchronous Receiver /Transmitter 即通用异步收发传输器,它不像SPI和I2C这样的通信协议,但在SOC中也是一种比较常用的IP。它最大的优点是仅用两根线进行通信,...
  • uart协议中文版

    2018-11-07 14:13:05
    UART(Universal Asynchronous Receiver/Transmitter)即通用异 步收发传输器,工作于数据链路层(协议层...UART 协议作为一 种低速通信协议,广泛应用于通信领域等各种场合。UART 基本可分 为并口通信及串口通信两种。
  • UART协议介绍

    2020-07-08 15:15:04
    UART简介 通用异步收发传输器(Universal Asynchronous Receiver/...下面具体讲解一些uart协议以及是如何通信的。 图-1 图-2 上图是uart协议传输一个”A”字符通过示波器的uart解码而得到的波形示意图。根据此图来
  • UART协议总结

    2018-03-06 13:29:00
    今天刚买了一个逻辑分析仪,于是使用该分析仪对UART数据进行分析,以便更好的理解UART协议原理。 UART协议虽然速率较低,但协议简单,实现起来很便捷。 首先,需要了解UART协议的几个参数,解释如下: 波特率:即...
  • UART协议详解

    千次阅读 2018-04-06 09:13:29
    UART简介 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART通信在工作中相当常见,项目中需要生成uart信号,在博客中记录下。...下面具体讲解一些uart协议以及是如何通信...
  • 这些设备正是使用UART协议与计算机进行通信。虽然USB几乎完全取代了旧的电缆和连接器,但UART绝对没有过时。您会发现目前许多项目中使用UART的GPS模块、蓝牙模块和RFID读卡器模块等连接到Raspberry Pi,Arduino或...
  • uart协议_UART通信协议

    2020-11-27 07:51:22
    UART基本概念通用异步收发器(Universal Asynchronous Receiver/Transmitter), 通常称作UARTUART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工的发送和接收。嵌入式里面说的串口也是指的...
  • UART协议通信记录

    2019-03-04 11:04:11
    收录比较好的UART串口通信协议博客: UART协议详解 串口通信中的数据的奇偶校验位 RS_232和RS_485,TTL的区别 RS_485的(全)半双工实现
  • 通俗易懂的UART协议帧格式

    千次阅读 2020-08-06 21:13:13
    通俗易懂的UART协议帧格式,值得你一看
  • 看下面这个图,大家已经知道今天的主角是UART,我们通常说的串口,UART包含TTL电平和RS-232电平两种,嵌入式系统里面,单片机的串口一般都是TTL电平。今天的内容关于UART的帧格式,比较简单,玩过单片机的小伙伴应该...
  • 15.UART协议

    2018-07-10 08:06:15
    UART简介 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。UART通信在工作中相当常见,项目中需要生成uart信号,在博客中记录下...下面具体讲解一些uart协议以及是如何通信的。...
  • UART串口Verilog通信cpld quartus10.1逻辑工程源码+自定义uart协议说明,已在项目中使用,可以做为你的设计参考。 下位机与上位机通信协议: 1、通信采用异步串口通信,波特率为115.2KBPS, 2、上位机发送数据格式:...
  • 这些设备正是使用UART协议与计算机进行通信。虽然USB几乎完全取代了旧的电缆和连接器,但UART绝对没有过时。您会发现目前许多项目中使用UART的GPS模块、蓝牙模块和RFID读卡器模块等连接到Raspberry Pi,Arduino或...
  • UART(Universal Asynchronous Receiver/Transmitter)是一种异步全双工串行通信协议,由Tx和Rx两根数据线组成,因为没有参考时钟信号,所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数,...
  • UART 协议笔记

    千次阅读 2013-06-19 16:17:05
    在工作中,对于UART协议又有了一些理解,这里做个笔记,以备忘。 UART 的全称为:Universal Asynchronous Receiver/Transmitter,通用异步收发器。它只需要两个线,分别是Sout和Sin。数据在进行发送的时候,先...
  • UART协议的verilog实现

    2012-02-15 22:03:49
    采用verilog实现的UART协议,仿真通过,并能够通过FPGA实现。非常好!!!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,300
精华内容 920
关键字:

uart协议