ARM接口技术——UART
串口简介
UART,Universal Asynchronous Receiver Transmitter 即通用异步收发器,是一种通用的串行、异步通信总线该总线有两条数据线,可以实现全双工的发送和接收在嵌入式系统中常用于主机与辅助设备之间的通信。
Exynos 4412 SCP的串口控制器
UART数据帧格式
ARM架构的处理器封装厂商一般集成了各种控制器。Exynos 4412 SCP封装了UART控制器。所以了解原理即可,不需要具体操作数据帧格式时序,操作串口控制器即可。
Exynos 4412 SCP框图:
串口通信实验
串口通信硬件设计与分析
开发板串口通信设备原理图:
开发板使用的是CON6和CON7口,连接到了一个SP3232EEA芯片,这个芯片只是一个把信号做了一个提升,它连接到的核心板引脚是:
BUF_XuTXD2/UART_AUDIO_TXD
BUF_XuRXD2/UART_AUDIO_RXD。
开发板串口通信核心板原理图:
搜索BUF_XuTXD2/UART_AUDIO_TXD,引脚:
XuRXD2/UART_AUDIO_RXD/GPA1_0
XuTXD2/UART_AUDIO_TXD/GPA1_1
我们需要把GPA1_1和GPA1_0口设为UART功能,但是芯片有多个UART,原理图并没有说明这个引脚复用的是UART几,需要查看芯片手册。
芯片手册:
芯片手册的引脚表:
芯片手册说明了该引脚使用的是UART2。
芯片手册查看UART相关介绍:
UART Overview:
一个异步收发器包含4个独立的管道加一个GPS管道,各个管道FIFO空间不同;
可编程的波特率;
它拥有独立的时钟SCLK_UART(100MHz);
UART原理图:
相关寄存器
1. 前面找到的引脚是GPA1_0和GPA1_1,直接芯片手册搜GPA1相关寄存器,把复用引脚设置成UART功能。
GPA1地址是:0x1140 0000 + 0x0020,编程的时候不直接写地址,用厂商提供的封装宏定义GPA1.CON,后面同理。
设置CON0和CON1需设置[3:0]和[7:4]位,
设为UART需要分别设置为0x2,两个一起设置就是0x22,GPA1.CON = 0x22。
2. 除了把引脚设为UART,还需要操作UART设置相关控制器
它有5个基地址,说明它有5个UART,使用的是串口2,n=1(0,1,2,3,4),基地址为0x1382 0000,提供的头文件宏定义为UART2,此外还有UART[0-4]。
需要操作的主要有这几个寄存器:
- ULCON2设置、
- UCON2设置、
- UBRDIV2 UFRACVAL2 波特率设置、
- URXH2 UTXH2 收发缓存、
- UTRSTAT2查看收发状态,
这些寄存器地址都在UART2结构体,可以直接操作,其它的寄存器暂时用不到先不管。
3.1 ULCON2设置
数据位设为8位,[1:0]设为11;
停止位设为1位,[2]设为0;
校验位不用,[5:3]设为000;
模式不用红外,用线模式[6]设为0;
所以UART2.ULCON2设为0000011,16进制:0x3。
3.2 UCON2
收发器缓存默认是失能,设为中断或者轮询模式,[1:0]设为01,[3:2]设为01,其它不管;
UART2.UCON2[3:0]设为0101,16进制0x5。
3.3 UARSTAT2
UART状态寄存器,用来查看状态。
其它位不管,只看[1:0]位,判断这两位的值,可以得到收发器缓存状态,发送缓存为0,说明发完了,可以进行下一次发送。所以传输数据时,要判断UART2.UTRSTAT2和UART2.UTRSTAT2。
3.4 UBRDIV2和UFRACVAL2
波特率设置寄存器。
波特率设置,直接套公式把波特率分频的整数位和小数位填到两个寄存器即可。
前面提到UART独立的时钟频率是100MHz,使用波特率115200的话,计算结果是:整数位填53,小数位填4。
3.5 读写缓存URXH2 UTXH2
配置完前面的寄存器,传输时只需要对着两个寄存器读写即可,此外还要结合前面提到的状态寄存器。
UART寄存器开发
寄存器开发源码
实现一个简单的通信功能,PC发送字符'a',开发板返回一个'a'+1。
#include "exynos_4412.h"void UART2_Init(void) { /* 1.GPA1_0和GPA1_1 设置成UART2收发的引脚 */ /* GPA1CON[7:0] */ GPA1.CON = GPA1.CON & (~(0xFF << 0)) | (0x22 << 0); /* 2.设置UART2的帧格式 */ /* ULCON2 */ UART2.ULCON2 = UART2.ULCON2 & (~(0x7F << 0)) | (0X3 << 0); /* 3.设置UART2的收发模式位轮训模式*/ /* UCON2 [3:0] */ UART2.UCON2 = UART2.UCON2 & (~(0xF) << 0) | (0x5 << 0); /* 4.设置UART的波特率位115200*/ /* UBRDIV2 UFRACVAL2 */ UART2.UBRDIV2 = 0x35; UART2.UFRACVAL2 = 0x4; } void UART2_Send_Byte(char dat) { /* 检查发送器为空 */ while(!(UART2.UTRSTAT2&0x2)); /* 发送数据 UTXH2*/ UART2.UTXH2 = dat; } char UART2_Rec_Byte(void) { char dat = 0; if(UART2.UTRSTAT2&0x1) dat = UART2.URXH2; return dat; } void UART2_Send_Str(char *pstr) { while(*pstr != '\0') { UART2_Send_Byte(*pstr); pstr++; } } int main() { char dat = 0; UART2_Init(); while(1) { dat = UART2_Rec_Byte(); UART2_Send_Byte(dat+1); } return 0; }
下载程序
1. 连接后,打开开发板,会打印U Boot相关信息,打印倒计时时输入回车停止autoboot,
然后loadb 40008000地址。
2. 使用kermit协议下载二进制文件。
3. 输入go 400080000,进入应用。
输入aabbcc,收到开发板的回复是bbccdd,验证了代码开发板收到信息后回复a+1。
END