UART总线协议——esp32学习笔记

目录

UART理论部分

一、UART简介

二、通信基础

(一)并行和串行

(二)单工和双工

(三)波特率

三、UART帧格式

四、UART硬件连接

五、UART控制器

Exynos4412下的UART控制器

一、引脚功能设置

二、Exynos4412下的控制器

UART includes:

UART通信示例:

each UART contains:                每个UART包含:

UART寄存器详解

GPA0CON:

寄存器编程:

对寄存器的说明:


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]用于数据发送与接收

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BAKUMAN#0704

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值