文章目录
- UART 协议
- 主要特点
- UART控制器
- 组成部分
- 工作流程
- UART寄存器(fs4412)
- 输入输出重定向
UART 协议
- UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种串行通信协议,用于在计算机或外设之间进行数据交换。UART协议广泛应用于嵌入式系统和微控制器领域。
主要特点
-
异步通信:UART不需要时钟信号来同步发送和接收设备,而是通过预定的波特率来控制数据传输速度。
-
全双工通信:UART支持同时发送和接收数据。
-
帧结构
帧 = 起始位 ( 1 位 ) + 数据位 ( 5 到 8 位 ) + 校验位 ( 1 位 ) + 停止位 ( 1 位或 2 位 ) 帧 = 起始位(1位) + 数据位(5到8位) + 校验位(1位) + 停止位(1位或2位) 帧=起始位(1位)+数据位(5到8位)+校验位(1位)+停止位(1位或2位)
-
UART通信通常主要依赖三根线
- TX(Transmit):发送数据线。
- RX(Receive):接收数据线。
- GND(Ground):地线。
-
单工和双工
- 单工
- 数据只单向传输(如广播)
- 双工
- 半双工通信:双方可以传输数据,但不能同时进行(如对讲机)。
- 全双工通信:双方可以同时传输和接收数据(如电话通信)。
- 单工
-
波特率
- 串行通信中每秒钟传输的符号(信号)数,通常用于衡量数据传输速率。
- 在简单的通信系统中(如UART),每个符号(码元)通常对应1个比特,因此波特率和比特率相同。但是在某些通信系统中,一个符号可能代表多个比特,这时波特率和比特率就不再相等。例如,如果一个符号表示2个比特,那么比特率就是波特率的2倍。
- 波特率的选择
- 通信双方的波特率必须匹配
- 较高的波特率可以提高数据传输速度,但同时可能增加信号的噪声和错误风险,特别是在长距离通信中。
- 较低的波特率较为稳定可靠,但传输速度较慢。
- 波特率的计算
- 波特率通常由时钟频率和分频器设置确定。在许多微控制器或通信模块中,波特率由系统时钟频率和预分频寄存器共同决定。
波特率 = 系统时钟频率 分频值 波特率 = \frac{系统时钟频率}{分频值} 波特率=分频值系统时钟频率
- 波特率通常由时钟频率和分频器设置确定。在许多微控制器或通信模块中,波特率由系统时钟频率和预分频寄存器共同决定。
-
数据发送先行位
- I²C:默认情况下,数据总是按 高位先行(MSB First) 传输,即最高位先发出。
- SPI:默认也是 高位先行,但它可以灵活配置,你可以选择按 低位先行(LSB First) 传输数据。
- UART:UART 通信协议默认情况下使用低位先行(LSB First)进行数据传输。
-
轮询、中断和DMA
- 轮询:计算机主动发起,定期访问
- 中断:IO设备发起
- DMA:解放CPU
UART控制器
- UART控制器是处理UART通信的硬件模块或芯片,负责在发送和接收设备之间完成数据的串行通信。
- UART控制器的主要功能是将并行数据转换为串行数据(在发送时),以及将串行数据转换为并行数据(在接收时),并处理通信协议中的各个部分,如波特率控制、数据帧格式等。
组成部分
- 发送器(Transmitter)
- 数据寄存器:在发送数据之前,数据首先存储在发送寄存器(通常称为发送移位寄存器,TX Shift Register)。该寄存器负责把并行数据(通常是一个字节)转换为串行格式。
- 移位器:控制串行数据的输出顺序。UART发送器将数据按**低位先行(LSB First)**的方式逐位发送。
- 帧生成器:根据配置好的帧格式(起始位、数据位、校验位、停止位),自动生成符合UART协议的完整数据帧并通过TX线发送出去。
- 接收器(Receiver):
- 接收寄存器:接收的串行数据通过RX引脚输入,并逐位加载到接收寄存器中,通常称为接收移位寄存器(RX Shift Register)。
- 帧解析器:接收器解析输入的数据帧,识别起始位、数据位、校验位和停止位,并从帧中提取出实际的有效数据。
- 校验检测:如果启用了校验位,接收器会根据校验位的配置(奇校验或偶校验)对接收的数据进行错误检查。
- 波特率生成器(Baud Rate Generator)
- 波特率生成器负责产生用于控制数据传输速度的时钟信号。确保发送器和接收器能够按预定的波特率同步发送和接收数据。
- 波特率生成器会确保UART控制器按设定的速率发送每一位数据。
- 中断处理(Interrupt Handling)
- UART控制器通常会与系统的中断机制结合。它可以在发送完一帧数据或接收到完整的数据时触发中断,让主处理器执行相关操作,如读取接收到的数据或发送新的数据。
- 常见的中断类型包括发送完成中断、接收完成中断和错误中断(例如帧错误、超时、校验错误等)。
- FIFO缓冲区(First In First Out Buffer,部分UART支持)
- 一些UART控制器集成了发送和接收FIFO缓冲区,允许暂存多帧数据以避免数据丢失,尤其在数据传输速率较高或系统忙于处理其他任务时,FIFO缓冲区可以缓解压力。
- 状态寄存器(Status Registers):记录当前的通信状态
工作流程
- 发送数据:
- 用户程序将数据写入UART控制器的发送数据寄存器。
- UART控制器根据设定的波特率和帧格式将数据打包成帧,并通过TX引脚串行发送出去。
- 如果启用了中断,UART在完成发送时会产生中断通知主处理器,可以发送下一帧数据。
- 接收数据:
- 数据通过接收器的RX引脚逐位输入到UART控制器。
- 接收的数据被解析,提取有效数据并存储到接收寄存器中。
- UART控制器可以通过中断通知主处理器接收到新数据,等待处理。
- 波特率控制:
- 波特率生成器根据波特率寄存器中的设置,按设定的速率控制发送和接收的位速率,确保与另一端设备的波特率一致。
UART寄存器(fs4412)
- 裸机开发示例
- 总寄存器
- ULCONn
- 发送寄存器和接受寄存器
- 波特率设置(有误差:四舍五入)
#include “exynos4412.h”//要打开这个文件,查看其怎么定义的
/*1.将GPA1_0和GPA1_1分别设置成UART2的接收引脚和发送引脚GPA1CON[7:0]*// 连接起了
GPA1.CON = GPA1.CON & (~(0xFF<<0))|(0x22<<0);//0x22=0010 0010一次设置两个引脚//GPA1.CON & (~(0xFF<<0))低8位清零//|(0x22<<0)第二位和第六位为1
/*2.设置UART2的帧格式ULCON2 8位数据位 1位停止位 无校验位*// 串口寄存器
UART2.ULCON2 = UART2.ULCON2&(~(0x7F<<0))|(0x3<<0);//0000 0011/*3.设置UART2的接收和发送模式为轮询模式UCON[3:0]*/
UART2.UCON2 = UART2.UCON2 & (~(0xF <<0))|(0x5<<0);/*4.设置UART2的波特率为115200,UBRDIVn/UFRACVALn*/
UART2.UBRDIV2 = 53;
UART2.UFRACVALn = 4; //利用公式计算
while(1)
{/*将要发送的数据写入发生寄存器UTXH2*/UART2.UTXH2 = 'A';//默认显示字符,不显示数字UART2.UTXH2 = 'B';UART2.UTXH2 = 'C';UART2.UTXH2 = 'D';
}
/*还有许多寄存器*/
/**//**//**/
- 上面的数据发送时会乱码:CPU往寄存器中写入数据的速度和发送器往外发送数据的速度不一致,故而会造成乱码
解决方法:4.第一张图中的状态寄存器。另类延迟while (!(UART2.UTRSTAT2 & (1<<1))); // 等待发送完成UART2.UTXH2 = 'A';//默认显示字符,不显示数字while (!(UART2.UTRSTAT2 & (1<<1))); // 等待发送完成UART2.UTXH2 = 'B';while (!(UART2.UTRSTAT2 & (1<<1))); // 等待发送完成UART2.UTXH2 = 'C';while (!(UART2.UTRSTAT2 & (1<<1))); // 等待发送完成UART2.UTXH2 = 'D';
- 接受数据
// 函数功能:接收UART2的一个字节数据并返回
char UART_Rec_Byte(void)
{char Data = 0; // 定义变量Data,用于存储接收到的数据// 检查UART2的状态寄存器UTRSTAT2中的位1(接收数据是否准备好)// 假设位0为接收缓冲区是否有数据的标志if (UART2.UTRSTAT2 & 1) // 如果接收寄存器中有数据可读{Data = UART2.URXH2; // 从接收寄存器读取数据到Datareturn Data; // 返回接收到的数据}else{return 0; // 如果没有数据可读,返回0// 注意:返回0可能与接收字符0冲突,具体应用时需考虑如何处理}
}
输入输出重定向
- 没有操作系统的时候,只能自己写类似操作系统库函数
void UART_Send_Str(char *pstr)
{while(*pstr !='\0')UART_Send_Byte(*pstr++);
}