文章目录[隐藏]
目录
UART理论部分
一、UART简介
UART(Universal Asynchronous Receiver Transmitter)通用异步收发器,是一种通用的串行、异步通信总线,该协议有两条数据线,可以实现全双工的发送和接收,再嵌入式系统中常用于主机和辅助设备之间的通信。
注意:全双工:全是指可以同时工作,双是指可以双向工作
二、通信基础
(一)并行和串行
1、并行通信
一次性可以把数据的多个位同时发送
在同等条件下,速度要比串行快,但数据线多,布线难度也会大一点,并且最严重的是传递数据时线与线之间会存在信号的干扰
2、串行通信
一位一位将数据传输过去
(二)单工和双工
1、单工通信
通信双方分为发送器和接收器,数据只能从发送器发往接收器
2、双工通信
通信时分为A、B双方,都可以作为发送器和接收器来传输数据
半双工:A向B发送数据时,B不能向A发送数据(IIC)
全双工:A向B发送数据时,B也可以向A发送数据(SPI)
(三)波特率
波特率用于描述UART通信时的通信速度,其单位为bps(bit per second)即每秒传输的bit的数量
三、UART帧格式
起始位(1位,低电平):一次通信的开始 (为了区分空闲状态的信号来通知接收器)
数据位(5-8位,先发低位再发高位):要传输的数据
校验位(1位,可有可无):校验发送数据的正确性(奇偶校验,如果1有偶数个,则校验位为1(高电平)),只能校验不能修正,用的时候通信速度会慢。
停止位(1/1.5位或两位,高电平):通信的结束
数据线在空闲时为高电平
如果要发10个bit则需要分成两次通信过程(由于是异步通信,为了避免累计误差的出现)
串口通过波特率来确定发送的零和一的个数
四、UART硬件连接
TX:发送 RX:接收
五、UART控制器
一般情况下处理器中都会集成UART控制器,我们使用UART进行通信时候只需对其内部的相关寄存器进行设置即可
Exynos4412下的UART控制器
一、引脚功能设置
GPIO(产生高低电平) 设置引脚(Pin)功能的本质是将GPIO(某一具体控制器)与引脚相连
二、Exynos4412下的控制器
A Universal Asynchronous Receiver and Transmitter (UART) in Exynos 4412 provide four independent channels with asynchronous and serial input/output (I/O) ports for general purpose (Ch0 to 3). It also provides a dedicated channel for communication with Global Positioning System (GPS) (Ch4)
Exynos4412中共有5个串口控制器,前四个为从CH0到CH3,可以与芯片外围的其他芯片进行通信,最后一个与GPS进行通信。
Each UART channel contains two First In First Outs (FIFOs) to receive and transmit data.
每个串口通信频道包含两个先进先出(队列)如果想要发送数据,只需将数据写入这个队列(缓冲区)中即可,发送器和接收器都会存在这个缓冲区
UART includes:
Programmable Baud rates(可修改的波特率) Baud(波特):调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数。
Infrared (IR) transmitter/receiver IR(红外线),Exynos4412还支持红外通信
One or two stop bit insertion 一位或者两位的停止位,可通过寄存器进行设置
5-bit, 6-bit, 7-bit, or 8-bit data width and parity checking 5,6,7,8位的数据宽度,并且支持校验位(parity checking)
UART通信示例:
each UART contains: 每个UART包含:
Baud-rate generator 波特率产生器
Transmitter 发送器
Receiver 接收器
Control unit 控制单元
The Baud-rate generator uses SCLK_UART. The transmitter and the receiver contain FIFOs and data shifters. The data to be transmitted is written to Tx FIFO, and copied to the transmit shifter. The data is then shifted out by the transmit data pin (TxDn). The received data is shifted from the receive data pin (RxDn), and copied to Rx FIFO from the shifter.
波特率发生器使用SCLK_UART(时钟源,频率为100Mbps,这里指的是串口控制器的频率),波特率需要时钟来进行时间控制,发送器和接收器中包含队列和shifter(移位器),发送的数据要先写入到缓冲区,然后通过队列(Tx FIFO),然后拷贝到发送的移位器。数据就会被移出通过TXD。接收的数据通过RXD移位到接收的移位器,然后拷贝到队列(Rx FIFO)。移位器中会包含控制位和校验位。
Transmit Buffer Register:发送器
Receive Buffer Register:接收器
Peripheral BUS:总线,此控制器通过总线与CPU相连,CPU可控制控制器
UART寄存器详解
GPA0CON:
管理GPA0这一组引脚的功能
寄存器编程:
这里是寄存器的编程示例,如果有不懂的寄存器可以向下面看
#include"exynos4412.h"
void UART_Init(void)
{
/*1.将GPA1_0和GPA1_1分别设置成UART2的接收引脚和发送引脚*/
GPA1.CON = GPA1.CON & (~(0xFF << 0)) | (0x22 << 0);
/*2.设置UART2的帧格式 ULCON2/8位数据位 1位停止位 无校验位 normal mode*/
UART2.ULCON2 = UART2.ULCON2 & (~(0x7F << 0)) | (0x3)
/*3.设置UART2的接受和发送模式,设置为轮询模式UCON2[3:0]*/
UART2.UCON2 = UART2.UCON2 & (~(0xF << 0)) | (0x5)
/*4.设置UART2的波特率为115200,UBRDIV2/UFRACVAL2*/
UART2.UBRDIIV2 = 53;
UART2.UFRACVAL2 = 4; //相当于 set up
}
void UART_Send_Byte(char Dat)
{
/*将要发送的数据写入发送寄存器*/
while(!(UART2.UTRSTAT2 & (1 << 1))); //表示寄存器第一位的状态,如果为0,则非为1,一直循环
UART2.UTXH2 = 'Dat'; //串口控制器首先将A写到寄存器中,再通过TXD发送,但是CPU的速度大于波特率,所以顺序会乱变成'AABB'而不是'ABAB'
}
char UART_REC_Byte(void)
{
char Dat = 0;
/*判断接收寄存器是否接收到了数据*/
if(UART2.UTRSTAT2 & 1)
Dat = UART2.URXH2;
return Dat;
else
return 0;
int main()
{
char RecData = 0;
UART_Init();
while(1)
{
UART_REC_Byte(void);
if(RecData == 0)
{
}
else
{
UART_Send_Byte(RecData);
}
}
return 0;
}
//Exynos4412中5个串口控制器对应的是5个地址
注意:
/*将要发送的数据写入发送寄存器*/
while(!(UART2.UTRSTAT2 & (1 << 1))); //表示寄存器第一位的状态,如果为0,则非为1,一直循环
UART2.UTXH2 = 'A'; //串口控制器首先将A写到寄存器中,再通过TXD发送,但是CPU的速度大于波特率,所以顺序会乱变成'AABB'而不是'ABAB'
while(!(UART2.UTRSTAT2 & (1 << 1)));
UART2.UTXH2 = 'B';
对寄存器的说明:
ULCONn:控制串口通信的帧格式
UCONn:控制串口的寄存器
UFCONn:控制FIFO(发送与接收的队列)
UMCONn:控制寄存器的一些功能(与AFC相关,自动流控制)
UERSTATn:存储错误的状态码
UFSTATn:收发队列的状态
UTXHn:串口发送器,将寄存器中的数据发送
URXHn:串口接收器,将寄存器中的数据接收
UBRDIVn,UFEACVALn(小数部分):设置波特率相关
如果有小数,直接四舍五入就可以了
UINTPn,UINTSPn,UINTMn:设置与中断相关的寄存器
ULCONn寄存器:
o~1位: 控制数据的宽度,可选5678位数据(一般为8位)
2位:停止位的个数(一般为1位停止位)
3~5位:校验模式,校验数据正确性0xx:只要第5位为0,后面写任何东西都是无校验位。
6位:设置普通或者红外的模式
UCONn寄存器(里面东西很多,这里就不一一列举了):
5位(Loop-back,回环):在芯片内部把TXD与RXD短接自己发送数据自己接收,测试串口
2~3位:控制发送模式(复位后为00,记得设置为其他模式)
0~1位:控制接收模式(设置为0,接收器不工作;01,中断或者轮巡;10:DMA模式;11,保留模式)
20~22位:设置DMA
轮询:数据从芯片发送,接收器接收,CPU想用,不断读取缓冲区,查看是否有数据
中断:有数据时,接收器发送中断信号,CPU在缓冲区读取数据
DMA:直接存储器访问,将接收到的数据直接放到内存中
UTRn:
发送器里面发完了会自动变成1
接收器接收完了会自动变成0
UTXHn与URXHn寄存器:[7:0]用于数据发送与接收
版权声明:本文为CSDN博主「BAKUMAN#0704」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_53965184/article/details/121103566
暂无评论