最近将以前写的东西整理总结了下,会陆续加载到自己博客中,学有疏,常有漏,只有不断地总结和归纳,才能有进一步的飞跃。
1 UART协议介绍
(1)UART使用的是 异步,串行通信,全双工通信
异步通信
以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。
串行通信
是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合
数据传送速率
用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。
波特率
是衡量数据传输速率的指征。表示每秒钟传送的二进制位数(bit数)。例如资料传送速率是120字符/秒,而每个字符是10位,则其传送的波特率为10x120=1200字符/秒=1200波特。
(2)数据传输格式
起始位:先发出一个逻辑”0”信号,表示传输字符的开始。
数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输
校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
电路图
(1)串口引脚图
![](https://img-blog.csdnimg.cn/20200812232345799.png#pic_center
(2)max3232芯片引脚图
(3)s5pv210 芯片控制引脚图
s5pv210寄存器(手册867页)
常用寄存器:
a) GPIO选择
b) Uart控制器(开关)
c) 数据格式控制ULCONn
d) 波特率配置UBRDIV UDIVSLOT
e) 数据收发缓存器UTXH URXH
f) 数据收发状态UTRSYAT
裸机部分核心代码
/uart.c/
#include "uart.h"
#include "cpu_io.h"
#include "gpio.h"
void uart_init()
{
struct s5pv210_gpio *gpio_base=(struct s5pv210_gpio *)S5PV210_GPIO_BASE;//这种定义方法不用重新请求分配空间
struct s5pv2xx_uart *uart_base=(struct s5pv2xx_uart *)S5PV210_UART_BASE;//这种定义方法不用重新请求分配空间
unsigned int var;
/*上面的等价于找到base地址来进行查找值
struct s5pv210_gpio *base
base->gpio_a0.con=xx;*/
/*根据引脚选择功能*/
var=readl(&gpio_base->gpio_a0.con);
var &=~(0xff<<0);//
var |=(0x22<<0);//p133
writel (var, &gpio_base->gpio_a0.con);
/*对串口控制器进行功能配置*/
_REG (&uart_base->ulcon)=0x3;//11 8 bit p867
_REG (&uart_base->ucon)=0x5;//0101 轮询模式p867
/*计算波特率*/
_REG (&uart_base->ubrdiv)=35;//p879计算公式得到,时钟频率为66.5MHZ,计算的35.07=35.1
_REG (&uart_base->udivslot)=0x80;//0101 轮询模式p867,0.1*16向下取整得1,查表
}
void myputc(char c){
struct s5pv2xx_uart *uart_base=(struct s5pv2xx_uart *)S5PV210_UART_BASE;
/*等待发送完成p873状态寄存器*///判断是否为空
while(_REG (&uart_base->utrstat)&(0x1<<2));
/*发送数据*/
_REG(&uart_base->utxh)=c;
}
void myputs(const char *str){
while(*str)
{
myputc(*str);
str++;
}
}