UART协议简述及编程

article/2025/9/17 11:30:01

UART原理简述

        通用异步收发器简称UART(universal asynchronous receiver transmitter)。他的用途很广泛,一般常用的就是用来输出打印的信息,也可以外接各种模块,例如GPS和蓝牙等。

        正是因为这种协议非常的简单可靠,所以才那么的受欢迎。它只需要三条线,TxD用来发送数据,RxD用来接收数据,以及一根接地线Gnd。UART使用双方只要使用三根线就能进行通信。

            一般在发送之前,收发双方都要先约定好一定的规则:传输数据的速率(每位所占据的时间,其倒数就是波特率);数据格式(每帧包含多少位数据,包含开始位、数据位(5~8 bit)、校验位(可有可无)和停止位(1~2 bit))。

        UART使用标准的TTL/CMOS逻辑电平(0~5V,0~3.3V,0~2.5V或0~1.8V)来表示数据,1表示高电平,0表示低电平。为了提高抗干扰能力、提高传输的距离,通常也会TTL/CMOS逻辑电平转换为RS-232逻辑电平,3~12V表示0,-3~-12V表示1。

        下面以传输字符‘A’的过程来了解一下UART协议传输数据的流程:

(1)一开始保持高电平(芯片内部使用上拉电阻),等待数据传输开始发出的开始位

(2)当要开始传输数据后,TxD数据线的由1变为0,并保持一位的时间,以便接收方能检测到,并等待1.5位的时间后开始接收数据

(3)之后便是传输的数据(上图是7位数据)

(4)如果有校验位的话,数据位之后便是1位的校验位

(5)最后就是拉高电平,保持1、1.5或者2位的停止位,表示一帧的结束

 

S3C2440芯片的UART

下面是我使用的S3C2440的UART流程框图:

        发送数据的时候,先把数据放入64字节的FIFO寄存器(如果开启了FIFO模式),然后才会把数据放到发送移位器,串行的发送给接收方。类似的,接收数据的时候是先放到接收移位器,然后放到FIFO寄存器,CPU就是从FIFO寄存器取数据的。

        至于什么时候能发送数据,什么时候能从FIFO寄存器中取数据呢?芯片提供了状态寄存器UTRSTATn,后面编程我们将会看到怎么使用这个寄存器。

 

S3C2440的UART模块初始化

       虽然上面对于UART协议的描述有很多,但是真正初始化UART,只是简单设置一些寄存器而已,下面我们还是以JZ2440芯片为例。

(1)配置GPIO引脚

     上面是芯片原理图中对于UART所使用的GPIO。芯片有3个串口,一般用串口0用于调试,其他两个有它用,也就是配置TXD0/GPH2和RXD0/GPH3为10就可以了。

因为空闲状态时,TXD0和RXD0是高电平,所以我们要拉高相关GPIO,也就是把GPH[2]和GPH[3]配置为0

(2)设置波特率

芯片手册已经给出了计算波特率的公式,如上所示。我们一般使用115200的波特率,所以相关寄存器的值就可以这么得到:

UART clock = PCLK = 50M  (这个是我已经配置好的时钟频率,根据自己的实际情况设置)
UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26

可以直接把值26写入到寄存器UBRDIV0

(3)设置UART控制寄存器

这个控制寄存器UCONn一共16位,不过我们简单的设置前4位就能满足我们需求了,都设置为中断模式,所以设置UCON0=0x00000005

(4)设置数据格式

我这里设置的数据格式为:8N1  ->  8个数据位,没有校验位,1个停止位。

所以寄存器的值为:  ULCON0 = 00000011 = 0x00000003

 

初始化UART部分的代码:

void uart0_init()
{/*设置引脚用于串口*//*GPH2,3 用于TxD0, RxD0*/GPHCON &= ~( (3<<4) | (3<<6) );GPHCON |= ( (2<<4) | ((2<<6)) );GPHUP &= ~( (1<<2) | (1<<3) );/*设置波特率*//* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1 *//*UART clock = PCLK = 50MUBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26*/UCON0 = 0x00000005; //PCLK, 终端或者查询模式UBRDIV0 = 26;/*设置数据格式*/ULCON0 = 0x00000003; //8N1: 8个数据位,没有校验位,1个停止位}

(6)发送和接收数据

       上面我们已经提到过,可以根据UTRSTAT0寄存器进行判断,什么时候可以写数据到发送buffer,什么时候可以从接收buffer中取数据。

上图翻译成中文就是:

       所以当我们想发送数据时,可以循环等待UTRSTAT0[2]是否为1,如果为1证明buffer中的数据都发送完了,我们可以继续往buffer中写数据。

        类似的,我们想读取数据时,可以循环等待UTRSTAT0[0]是否为1,如果为1,证明已经接收到数据了,我们就可以到相应的寄存器读取数据。

写数据的寄存器:

读数据寄存器:

我们这里使用小端模式。

收发数据的示例代码如下:

int putchar(int c)
{/*UTXH0*/while ( !(UTRSTAT0 & (1<<2)) ); //为0代表上次的数据还没发送UTXH0 = (unsigned char)c;}int getchar(void)
{/*read URXH0*/while ( !(UTRSTAT0 & (1<<0)) );return URXH0;}int puts(const char *s) //发送字符串
{while(*s){putchar(*s);s++;}
}

 


http://chatgpt.dhexx.cn/article/xHh67amq.shtml

相关文章

UART协议及串口回环

UART协议及串口回环 一、异步通信的分类1、UART&#xff08;通用异步收发器&#xff09;2、RS4223、RS4854、Modbus5、接口标准 二、UART协议要求1、空闲状态2、起始位3、数据位4、校验位5、停止位6、波特率7、比特率 三、汉字发送四、串口回环uart_txuart_rxctrltop 五、参考六…

基于verilog的uart协议实现

目录 1、理论介绍 2、架构设计 3、代码设计 一、发送模块代码 二、接收代码设计 三、顶层模块设计 四、测试代码 4、仿真实验 1、理论介绍 uart&#xff1a;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;是一种串行的收发方式…

UART协议快速扫盲(图文并茂+超详细)

文章目录 1 UART发展历史1.1 早期的串行通讯设备1.2 早期的芯片级UART1.3 现代UART的发展 2 预备知识3 协议层起始位数据校验位停止位波特率 4 传输过程5 物理层6 优缺点 1 UART发展历史 1.1 早期的串行通讯设备 早期的电报机器使用长度可变的脉冲信号进行数据传输&#xff0…

UART协议学习

通信协议分层 物理层 物理层规定通讯系统具有的机械、电子功能部分的特性&#xff0c;确保原始数据在物理媒体的传输。如RS232、RS485等就是电气协议&#xff0c;规定了数据传输时的电平标准&#xff0c;网络上许多博主将UART看作一个协议族&#xff0c;这些电气协议都是UART…

c语言模拟uart协议的收发

这篇文章注重思想的讲解,理解下来肯定对uart协议有一个更深的认识。 uart协议,通常用在嵌入式设备之间的通信。像下面这样: 问题一:uart是全双工还是半双工? 你完全可以将两个设备想象成两个人,上图中的两条线想象成A和B的对话。A对B说话和B对A说话的一个场景。问大家一个问题…

UART协议详解

通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART。 定义&#xff1a;UART是一种通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输和接收。在嵌入式设计中&#xff0c;UART用于主…

Linux·UART协议

目录 一、什么是UART&#xff1f; 二、UART的帧格式 2.1 为什么UART的传输需要起始位&#xff1f; 2.2 UART基本的数据形式 2.3 为什么UART的数据位可变&#xff1f; 三、UART的波特率 3.1 什么是波特率 3.2 如何换算波特率 3.3 波特率和采样频率是一样的吗&#xff1f…

通信协议(一)——UART协议

1、知识点 基础部分参考&#xff1a;UART串口发送模块设计Verilog_发光中请勿扰的博客-CSDN博客_uart设计verilog &#xff08;1&#xff09;什么是串口&#xff08;UART&#xff09;&#xff1f; 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#…

uart协议学习,从了解到入门,看这篇文章

uart协议从了解到入门 背景知识介绍&#xff1a;1、并行和串行的意思&#xff1a;2、串转并和并转串传输&#xff1a;3、单工、半双工、全双工区别&#xff1a; uart协议介绍1、uart简介2、uart通信3、uart工作原理 uart的优缺点 背景知识介绍&#xff1a; 1、并行和串行的意思…

FPGA实现uart协议

简介 使用verilog实现uart协议&#xff0c;能够和pc进行通信&#xff0c;实现串口回环功能&#xff0c;各参数设置如下&#xff1a; 波特率&#xff1a;115200数据位&#xff1a;8停止位&#xff1a;任意校验位&#xff1a;无 系统时钟为50M&#xff0c;115200波特率下&…

协议篇之UART协议

协议篇之UART协议 一、写在前面二、UART协议简介三、UART协议数据帧结构3.1 UART发送过程3.2 UART接收过程3.3 UART传输速率 四、UART收发模块设计4.1 UART接收模块设计4.2 UART发送模块设计4.3 UART回环顶层模块4.4 UART回环上板验证 五、写在最后 一、写在前面 由于设计需要&…

UART通信协议

UART通信协议 UART ( universal asynchronous receiver-transmitter&#xff09;是一种采用异步串行通信方式的通用异步收发传输器;它在发送数据时将并行数据转换成串行数据来传输&#xff0c;在接收数据时将接收到的串行数据转换成并行数据。UART串口通信需要两根信号线来实现…

UART协议讲解

UART协议讲解 一、什么是UART协议二、通信方式的分类1、串行通信&#xff08;一&#xff09;、同步通信和异步通信&#xff08;二&#xff09;、单工和半双工以及全双工 2、并行通信 三、UART协议具体介绍1、UART数据传输的格式2、UART电平标准 三、UART的优缺点四、参考 一、什…

【数字IC】深入浅出理解UART协议

深入浅出理解UART协议 一、什么是UART&#xff1f;二、UART的帧格式2.1 为什么UART的传输需要起始位&#xff1f;2.2 UART基本的数据形式2.3 为什么UART的数据位可变&#xff1f; 三、UART的波特率3.1 什么是波特率3.2 如何换算波特率3.3 波特率和采样频率是一样的吗&#xff1…

最详细的 UART协议 分析在这里!

1. 协议基础 1.1. 协议简介 UART是“Universal Asynchronous Receiver/Transmitter”&#xff0c;通用异步收发器的缩写。在19世纪60年代&#xff0c;为了解决计算机和电传打字机通信&#xff0c;Bell发明了UART协议&#xff0c;将并行输入信号转换成串行输出信号。因为U…

UART协议

UART协议 简介 UART是通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART&#xff0c;是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换&#xff0c;并规定了帧…

【云域网络社区】云域网络社区APP

【软件名称】云域社区 【功能介绍】资源分享&#xff0c;游戏交流交友 【下载地址】http://sss.shmmec.com/apk.apk 图片

怎么划分领域、子域、核心域、通用域和支撑域

怎么划分领域、子域、核心域、通用域和支撑域 如何理解领域和子域&#xff1f;什么是领域什么是子域怎么划分领域和子域如何理解核心域、通用域和支撑域&#xff1f;为什么要划分核心域、通用域和支撑域 总结 DDD 的知识体系提出了很多的名词&#xff0c;像&#xff1a;领域、子…

网络安全-域服务器(二)

域服务器&#xff1a; 域服务器&#xff08;一&#xff09;&#xff1a;网络安全-域&#xff08;一&#xff09;_IT之一小佬的博客-CSDN博客域服务器&#xff08;二&#xff09;&#xff1a;网络安全-域服务器&#xff08;二&#xff09;_IT之一小佬的博客-CSDN博客 域 11.O…

网课管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 3. 功能简介 用户中心 1.1用户注册&#xff1a;用户需要注册才能登陆进入web 1.2用户登录&#xff1a;通过判断匹配来进…