串口的结构和工作原理
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。
uART使用标准的CMOS逻辑电平(0~5v、0~3.3 V、0~2.5V或0~1.8V四种)来表示数据,高电平为1,低电平为0。为了增强数据的抗干扰能力,提高传输长度,通常将CMOS逻辑电平转换为RS-232逻辑电平(3~15v以o表示,-3~-15V以1表示)。
上图为串行接口的原理图,可以分为三部分分别为发送缓冲寄存器,波特率发生器,接受缓冲寄存器,发送缓冲寄存器从总线接受资源,通过波特发生器发送到接收缓存器中
一句话总结串口:异步全双通串行数据总线
串口寄存器的配置
我们通过查手册找到串口,和我们分析的一样,三条线一个AST,DSR,DGND
注:我们通过看原理图知道,他的两根线一个是接受数据的,一个是发送数据的,其中接地线是用来调节电平的,他的通信方式是通过是板子的串口线和笔记本的串口线,他中间通过一个电平转换芯片来进入这个
继续翻阅可以看见它通过排叉到核心板,这样就可以看见他连接到GPA0的引脚
传输实现
查看手册,对GPA0进行配置
#define GPA0CON *((volatile u32 *)(0x11400000))
#define UART0BASE 0x13800000
//将GPA0-0 1引脚配置为串口0的发送和接收功能
GPA0CON &= ~(0XFF<<0);
GPA0CON |= 0x22;
对串口进行配置
//配置数据位8N1
ULCON0 = 0x3 <<0;
//配置串口数据收发方式为中断或者论寻
UCON0 |= (0x1 << 2) | ( 0x1 << 0);
//使用无FIFO模式
UFCON0 = 0x0;
//禁用modem流控
UMCON0 = 0x0;
//配置波特率为115200
UBRDIV0 = 53;
UFRACVAL0 = 4;
通过这个寄存器来进行数据的收发,0=缓冲区为空,1=缓冲器接收到数据,所以我们这样来实现
void uart0_putchar(char ch)
{
while (!(UTRSTAT0 & (0x1 << 1)))
{
;
}
UTXH0 = ch;
}
char uart0_getchar(void)
{
char c;
while (!(UTRSTAT0 & (0x1 << 0)))
{
;
}
c = URXH0;
return c;
}
int main(void)
{
uart0_init();
u8 c;
while ((c = uart0_getchar()) != '@' )
{
uart0_putchar(c);
uart0_putchar('\r');
uart0_putchar('\n');
}
return 0;
}
通过这样的配置,然后我们通过交叉编译,在arm板中运行这个,就可以实现最简单的串口通信.
串口通信原理的理解
由于程序是跑在板子上的,所以我们的板子请求笔记本发送数据(通过kermit平台),不断的去查询寄存器是是否变化,之后将写入的数据发送给板子的串口