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

    2016-03-02 15:07:00
    uart串口协议 /* USART Word Length ---------------------------------------------------------*/ USART_WordLength_8b USART_WordLength_9b /* USART Stop Bits -------------------------...

     

    uart串口协议

     

    /* USART Word Length ---------------------------------------------------------*/

        USART_WordLength_8b

        USART_WordLength_9b

     

    /* USART Stop Bits -----------------------------------------------------------*/

        USART_StopBits_1

        USART_StopBits_0_5

        USART_StopBits_2

        USART_StopBits_1_5

     

    /* USART Parity --------------------------------------------------------------*/

    USART_Parity_No

    USART_Parity_Even

    USART_Parity_Odd

     

    示例:(stm32)

     

    基本配置:

    USART_InitStructure.USART_BaudRate = 115200;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

     

    更改设置,用逻辑分析仪观察不同配置下波形。

    (1)总长8位,8位数据位,无校验

     

    (2)总长9位,8位数据位,偶校验

    (3)总长8位,7位数据位偶校验

     

    转载于:https://www.cnblogs.com/mylinux/p/5235040.html

    展开全文
  • UART串口协议

    万次阅读 2018-02-10 16:50:47
    通用异步收发传输器(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”状态,表示当前线路上没有数据传输。

    如下图所示:



    2、UART工作原理

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

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

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

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

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



    展开全文
  • UART串口协议 1. 概念 2. UART关键参数及时序图 UART串口协议详解 1. 概念 概念:通用异步收发传输器:Universal Asynchronous Receiver/Transmitter, 数据发送时,将并行数据转换成串行数据,数据接收时,将串行...

    FPGA学习笔记

    UART串口协议

    1. 概念
    2. UART关键参数及时序图
    

    UART串口协议详解

    1. 概念

    • 概念:通用异步收发传输器:Universal Asynchronous Receiver/Transmitter, 数据发送时,将并行数据转换成串行数据,数据接收时,将串行数据转换成并行数据。
      在这里插入图片描述

    2.UART关键参数及时序图

    UART通信在使用前需做多项设置:数据位数,波特率,奇偶校验类型,停止位数。

    关键参数

    • 1. 空闲状态:UART规定,当总线处于空闲状态时,信号线的状态位高电平,1。

    • 2. 起始位:数据开始传送标志位。由于空闲状态信号线一直处于高电平,所以,起始位为低电平,0。

    • 3. 数据位data bits:单个UART数据传输在开始和停止期间发送数据位数。可选5,6,7,8(默认)

    • 4. 波特率baud:每秒钟可以通信的数据比特个数。典型的波特率:300, 1200, 2400, 9600, 19200, 115200等。收发两端设备都要设置相同的波特率。

    • 5. 奇偶校验位parity type:验证数据正确性。

      奇校验odd parity:数据中,1个的个数为奇数,校验位为1;1的个数为偶数,校验位为0。

      偶校验even parity:数据中,1的个数为偶数,校验位为0;1的个数为奇数,校验位为1。

      无奇偶校验non:如果数据长度为8,则无多余比特位用于奇偶校验,称为无奇偶校验non

    • 6. 停止位stop bits:标志一次数据传输完成,可帮助接收信号硬件同步。可选择1(默认),1.5, 2位。

    RS232标准中:8N1,八个数据位,一个停止位,无奇偶校验位。

    时序图

    在这里插入图片描述

    • 完整字节包括10位:一位起始位,8位数据位,一位停止位。需要11个波特脉冲完成。第一个脉冲标记一次传输的开始,第11个脉冲标记一次传输的结束。

    • 第1个波特脉冲上升沿:字节发送模块开始发送起始位;

      第2~9个波特脉冲上升沿:发送8位数据位;

      第10~11个波特脉冲上升沿:发送停止位;

    基本结构

    ⑴. 输出缓冲寄存器,它接收CPU从数据总线上送来的并行数据,并加以保存。

    ⑵. 输出移位寄存器,它接收从输出缓冲器送来的并行数据,以发送时钟的速率把数据逐位移出,即将并行数据转换为串行数据输出。

    ⑶. 输入移位寄存器,它以接收时钟的速率把出现在串行数据输入线上的数据逐位移入,当数据装满后,并行送往输入缓冲寄存器,即将串行数据转换成并行数据。

    ⑷. 输入缓冲寄存器,它从输入移位寄存器中接收并行数据,然后由CPU取走。

    ⑸. 控制寄存器,它接收CPU送来的控制字,由控制字的内容,决定通信时的传输方式以及数据格式等。例如采用异步方式还是同步方式,数据字符的位数,有无奇偶校验,是奇校验还是偶校验,停止位的位数等参数。

    ⑹. 状态寄存器。状态寄存器中存放着接口的各种状态信息,例如输出缓冲区是否空,输入字符是否准备好等。在通信过程中,当符合某种状态时,接口中的状态检测逻辑将状态寄存器的相应位置“1”,以便让CPU查询。

    接收端原理与实现代码UART串口接收端设计

    发送端原理与实现代码UART串口发送端设计_多字节传输
    UART串口发送端设计_单一字节传输


    [参考资料] FPGA系统设计与验证实战指南

    【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~


    展开全文
  • 1. UART串口协议以及串口接收端设计 1 原理图 2 Verilog 代码 3 Modelsim仿真 4. FPGA板级验证 1.1 串口协议发送端设计 目标:FPGA接收其他设备通过UART发送过来的数据。 实验现象:在Quartusz II中调用in system ...

    FPGA学习笔记

    1. UART串口协议以及串口接收端设计

    1 原理图
    2 Verilog 代码
    3 Modelsim仿真
    4. FPGA板级验证
    

    1.1 串口协议接收端设计

    • 目标:FPGA接收其他设备通过UART发送过来的数据。
    • 实验现象:在Quartusz II中调用in system sources and probes
      editor工具,查看UART接收模块接受到的数据,数据有pc机发出。
    • 知识点:
      1. uart的通信协议原理和工业环境下的数据接受实现
      2. in system sources and probes editor(ISSP)调试工具的使用

    1. 原理图

    在这里插入图片描述

    • 模块组成:
      1. 输入信号同步模块
      2. 起始数据检测模块
      3. 波特率产生模块
      4. 数据接受进程

    (1). 发送端实验室数据采集时序图

    在这里插入图片描述

    • 实验室环境:采样一个数据的中点

    (2). 发送端工业数据采集时序图
    在这里插入图片描述

    • 工业环境:工业环境的电磁干扰严重,噪音信号容易导致错误,只采样一次的数据不准确。
    • 方法:采每位数据采样的中间6次的结果,根据这6次结果的电平(0,1)出现的次数,判定最终结果。
      在这里插入图片描述

    2. Verilog 代码

    //----top---------------------------------------
    module uart_rx_r0
    (
    	input 				clk,
    	input 				rst_n,
    	input 				rs232_rx,
    	input [2:0]			baud_set,
    	
    	output 	reg		rx_done,
    //	output 			rx_state,
    	output reg  [7:0]   data_byte
    );
    
    	reg rs232_rx_reg1;
    	reg rs232_rx_reg2;
    	reg rs232_rx_syn1;
    	reg rs232_rx_syn2;
    	
    	reg uart_state;
    	reg [8:0] div_cnt;
    	reg [8:0] cnt_max;//div_cnt max value
    	reg baud_clk;
    	reg [7:0] baud_cnt;
    	reg [3:0] reg_data_byte [7:0];
    	reg [2:0] START;
    	reg [2:0] STOP;	
    //	wire pos_edge;
    	wire neg_edge;
    	
    //----asynch rs232_rx--> synch-----------
    	always@(posedge clk or negedge rst_n)
    		if(!rst_n)begin
    			rs232_rx_syn1 <= 0;
    			rs232_rx_syn2 <= 0;
    		end else begin
    			rs232_rx_syn1 <= rs232_rx;
    			rs232_rx_syn2 <= rs232_rx_syn1;
    		end
    //----start bit detect------------------
    	always@(posedge clk or negedge rst_n)
    		if(!rst_n)begin
    			rs232_rx_reg1 <= 0;
    			rs232_rx_reg2 <= 0;
    		end else begin
    			rs232_rx_reg1 <= rs232_rx_syn2;
    			rs232_rx_reg2 <= rs232_rx_reg1;
    		end
    //	assign pos_edge = (rs232_rx_reg1 & !rs232_rx_reg2);
    	assign neg_edge = (!rs232_rx_reg1 & rs232_rx_reg2); 
    	
    //------baud_set------------------------
    	always@(*)
    		case(baud_set)
    			3'd0: cnt_max <= 9'd325;
    			3'd1: cnt_max <= 9'd163;
    			3'd2: cnt_max <= 9'd81;
    			3'd3: cnt_max <= 9'd54;
    			3'd4: cnt_max <= 9'd27;
    		default: cnt_max <= 9'd325;
    		endcase
    //----uart_state-------------------------
    	always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    			uart_state <= 0;
    		else if(neg_edge)
    			uart_state <= 1;
    		else if(rx_done || (baud_cnt==12 && (START > 2))) 
    			uart_state <= 0;
    		else
    			uart_state <= uart_state;
    //----frequence div-->baud_clk-----------
    	always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    			div_cnt <= 0;
    		else if(uart_state)begin
    			if(div_cnt == cnt_max)
    				div_cnt <= 0;
    			else
    				div_cnt <= div_cnt + 9'd1;
    		end else
    				div_cnt <= 0;
    	always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    			baud_clk <= 1'd0;
    		else if(div_cnt == 9'd1)
    			baud_clk <= 1'd1;
    		else
    			baud_clk <= 1'd0;
    //----baud_cnt--------------------------
    	always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    			baud_cnt <= 0;
    		else if(rx_done || (baud_cnt==12 && (START > 2)))
    			baud_cnt <= 0;
    		else if(baud_clk)
    				baud_cnt <= baud_cnt + 8'd1;
    		else
    				baud_cnt <= baud_cnt;
    			
    //----rx_done----------------------------
    	always@(posedge clk or negedge rst_n)
    		if(!rst_n)
    			rx_done <= 1'b0;
    		else if(baud_cnt == 8'd159)
    			rx_done <= 1'b1;
    		else 
    			rx_done <= 1'b0;
    			
    //----data_byte--------------------------
    	always@(posedge clk or negedge rst_n) // asynchronos transimiter, reg_data_byte is used to keep input data stable 
    		if(!rst_n)
    			data_byte <= 8'd0;
    		else if(baud_cnt == 8'd159)begin
    			data_byte[0] <= reg_data_byte[0][2];
    			data_byte[1] <= reg_data_byte[1][2];
    			data_byte[2] <= reg_data_byte[2][2];
    			data_byte[3] <= reg_data_byte[3][2];
    			data_byte[4] <= reg_data_byte[4][2];
    			data_byte[5] <= reg_data_byte[5][2];
    			data_byte[6] <= reg_data_byte[6][2];
    			data_byte[7] <= reg_data_byte[7][2];
    		end
    
    //----reg_data_byte----------------------
    	always@(posedge clk or negedge rst_n)begin
    		if(!rst_n)begin
    			START <= 3'd0;
    			reg_data_byte[0] <= 3'd0; 
    			reg_data_byte[1] <= 3'd0;
    			reg_data_byte[2] <= 3'd0;
    			reg_data_byte[3] <= 3'd0;
    			reg_data_byte[4] <= 3'd0;
    			reg_data_byte[5] <= 3'd0;
    			reg_data_byte[6] <= 3'd0;
    			reg_data_byte[7] <= 3'd0;
    			STOP <= 3'd0;
    		end 
    		else if(baud_clk)begin
    			case(baud_cnt) //0:initial baud_cnt=0 --> after sending data, rs232_tx always be 0; 
    				0: begin
    						START <= 3'd0;
    						reg_data_byte[0] <= 3'd0; 
    						reg_data_byte[1] <= 3'd0;
    						reg_data_byte[2] <= 3'd0;
    						reg_data_byte[3] <= 3'd0;
    						reg_data_byte[4] <= 3'd0;
    						reg_data_byte[5] <= 3'd0;
    						reg_data_byte[6] <= 3'd0;
    						reg_data_byte[7] <= 3'd0;
    						STOP <= 3'd0;
    					end
    				6,7,8,9,10,11: START <= START + rs232_rx_reg2;
    				22,23,24,25,26,27:       reg_data_byte[0] <= reg_data_byte[0] + rs232_rx_reg2;
    				38,39,40,41,42,43:       reg_data_byte[1] <= reg_data_byte[1] + rs232_rx_reg2;
    			   54,55,56,57,58,59:       reg_data_byte[2] <= reg_data_byte[2] + rs232_rx_reg2;
    				70,71,72,73,74,75:       reg_data_byte[3] <= reg_data_byte[3] + rs232_rx_reg2;
    				86,87,88,89,90,91:       reg_data_byte[4] <= reg_data_byte[4] + rs232_rx_reg2;
    				102,103,104,105,106,107: reg_data_byte[5] <= reg_data_byte[5] + rs232_rx_reg2;
    				118,119,120,121,122,123: reg_data_byte[6] <= reg_data_byte[6] + rs232_rx_reg2;
    				130,131,132,133,134,135: reg_data_byte[7] <= reg_data_byte[7] + rs232_rx_reg2;
    				148,149,150,151,152,153: STOP <= STOP + rs232_rx_reg2;
    				default begin
    						START <= START;
    						reg_data_byte[0] <= reg_data_byte[0]; 
    						reg_data_byte[1] <= reg_data_byte[1];
    						reg_data_byte[2] <= reg_data_byte[2];
    						reg_data_byte[3] <= reg_data_byte[3];
    						reg_data_byte[4] <= reg_data_byte[4];
    						reg_data_byte[5] <= reg_data_byte[5];
    						reg_data_byte[6] <= reg_data_byte[6];
    						reg_data_byte[7] <= reg_data_byte[7];
    						STOP <= STOP;				
    				end
    		endcase
    	 end
    	end	
    	
    endmodule
    //------------------------------------------------
    //----testbench-----------------------------------
    `timescale 1ns/1ns
    `define clk_period 20
    
    module uart_rx_r0_tb;
    	reg clk;
       reg rst_n;
    	
    	reg [7:0] data_byte_tx;
    	wire rx_done;
    
    	reg send_en;
    	reg [2:0] baud_set;
    	wire [7:0] data_byte_rx;
    	wire	rs232_rx;
    	wire	tx_done;
    	//wire	uart_state; 
    	wire led;
    	
    	uart_rx_r0	uut_rx(
    		.clk(clk),
    		.rst_n(rst_n),
    		.rs232_rx(rs232_rx),
    		.baud_set(baud_set),
    		.rx_done(rx_done),
    		.data_byte(data_byte_rx)
    	);
    						
    		uart_tx_r0 uut_tx(
    		.clk(clk),
    		.rst_n(rst_n),
    		.send_en(send_en),
    		.baud_set(baud_set),
    		.tx_done(tx_done),
    		.data_byte(data_byte_tx),
    		.uart_state(led),
    		.rs232_tx(rs232_rx)
    	);
    	
    	
    		initial begin
    		clk = 1;
    		rst_n = 0;
    		send_en = 0;
    		baud_set = 3'd4;
    		#(`clk_period*20+1);
    		rst_n = 1;
    		#(`clk_period*50);
    		data_byte_tx = 8'haa;//8'b1010_1010
    		send_en = 1;
    		#`clk_period;
    		send_en = 0;
    		
    		@(posedge tx_done)
    		
    		#(`clk_period*5000);
    		data_byte_tx = 8'h55;//0101_0101
    		send_en = 1;
    		#`clk_period;
    		send_en = 0;
    		
    		@(posedge tx_done)
    		#(`clk_period*5000);
    		$stop;
    	end
    	always begin #(`clk_period/2) clk = ~clk;end
    	
    endmodule
    
    
    

    3. Modelsim仿真

    在这里插入图片描述

    4. FPGA板级验证
    在这里插入图片描述

    • 串口助手发送数据,ISSP软件实时接收数据。

    [参考资料] FPGA系统设计与验证实战指南

    【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~


    展开全文
  • uart串口协议与实现讲解 一、UART和RS232 1、UART的全称叫做通用异步收发传输器。将数据在串行通信和并行通信间的传输转换。通俗的讲就是把多比特的数据转化为单比特的数据,或者把单比特的数据转化为多比特的数据。...
  • 1. UART串口协议以及串口发送端设计 1.1 UART介绍 1.2 串口协议发送端设计 1.1 UART介绍 (1). 概念: UART: (Universal Asynchronous Receiver/Transmitter)通用异步收发器,是异步串行通信的总称。全双工,发送端...
  • UART(Universal Asynchronous Receiver/Transmitter)是一种异步全双工串行通信协议,由Tx和Rx两根数据线组成,因为没有参考时钟信号,所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数,...
  • 1. UART串口协议以及串口发送端设计2 发送多个字节 1.1 串口协议发送端设计_多个字节 (1). 串口协议发送端整体框图 目标:按键控制串口发送“HELLO”字符串 知识点: wait函数调用 发送字符串的方法:控制输入...
  • FPGA UART串口协议

    2021-01-13 20:48:31
    本篇博客主要是使用Verilog在FPGA实现UARTUART协议很简单,在单片机还是各种嵌入式设备上都是非常容易实现的,这篇文章的目的是借助UART,通过UART的收发协议,明白如何根据时序,借用Verilog语言来描述硬件电路,...
  • UART串口协议简单总结

    2021-03-18 20:42:53
    文章目录UART串口 ---通用异步收发传输器(串行/异步/全双工)UART的硬件链接---TTL直接连接 / 配合232电平转接芯片连接UART 通讯数据格式UART控制器举例介绍---s3c2440 uart控制器 UART串口 —通用异步收发传输器...
  • UART串口协议基础1

    万次阅读 2015-06-04 22:53:05
    串口协议基础  1 串口概述 串口由收发器组成。发送器是通过TxD引脚发送串行数据,接收器是通过RxD引脚接收串行数据。发送器和接收器都利用了一个移位寄存器,这个移位寄存器可以将数据进行“并转串”和“串转并”...
  • 常见的协议UART(通用异步收发传输器)、IIC(集成电路总线)、SPI(串行外围总线)、USB2.0/3.0(通用串行总线)以及 Ethernet(以太网)等。在这些协议当中,最为基础的就是UART,因其电路结构简单、成本较低,...
  • 通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议,在嵌入式领域应用的非常广泛。 UART作为异步串行通信协议的一种,工作原理是将传输数据的每个...
  • //---------------------------------顶层 ...module uart_all ( input refclk, input rst_n, input in_top,//接收 output out_tx ); wire [7:0]out_top; uart_top//rx接收模块 uart_top_inst ( .refclk(...
  • //---------------------------------顶层 ...module uart_all ( input refclk, input rst_n, input in_top,//接收 output out_tx ); wire [7:0]out_top; uart_top//rx接收模块 uart_top_inst ( .refclk(...
  • UART串口接收协议,这是Verilog学习者入门的必须学习的东西

空空如也

空空如也

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

uart串口协议