总线协议之 -- UART
总线协议之 – UART
UART简介
UART: Universal Asynchronous Receiver Transmitter(通用异步收发器),
通用的串行、异步通信总线,它有两条数据线,实现全双工发送和接收。
通信基础
串行、并行:
- 并行通信:总线在传递数据的时候,可以一次性收发多个位的数据。并行虽然快,但是要考虑多个线的资源占用,以及多条线互相干扰的问题;
- 串行通信:每一位数据逐次传递;(IIC\SPI都是串行通信)
单工、双工:
- 单工通信:只能是单向的,发送器给接收器发送数据,而不能反过来;
- 双工通信:可以是A到B,也可以是B到A;
- 半双工:不能同时发生;只有一根线,发送时就不能接收;
- 全双工:可以同时发送和接收,有两根线;
波特率:
波特率:描述UART通信速度,单位bps,(bit per second),每秒传送的bit的数量;
- 每秒的波特数,波特等于单个信号包含的码元数量
比特率:是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,每秒传送数据就越多。
波特率:表示每秒钟传送码元符号的个数,是衡量数据传送速率的指标。
- 在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。波特率是传输通道频宽的指标。
- 比特率=波特率x单个调制状态对应的二进制位数
- 两相调制(单个调制状态对应1个二进制位)的比特率等于波特率;四相调制(单个调制状态对应2个二进制位)的比特率为波特率的两倍;八相调制(单个调制状态对应3个二进制位)的比特率为波特率的三倍;依次类推。
UART帧格式
- 起始位:1bit的0,标志发送开始;因为空闲时为1,所以开始为0;
- 数据位: 5-8bit,先发低位,后发高位;
- 校验位:可有可无;奇偶校验,是校验奇数还是偶数个1;
- 停止位:高电平1;
- 空闲位:
注意: UART空闲的时候,用高电平表示;
串口协议从低位先发,最后发高位;
串口每次都只发一个byte,下一个byte又重新开始起始位,是因为它是异步的,发送方和接收方的时钟不是同一个,防止由于时钟不同步导致误差累积;
IIC和SPI都是同步通信,可以发多个字节;
Exynos4412下的UART控制器
串口的信号一般较弱,通信距离短,容易被干扰,所以增加了一块专有芯片用来增加抗干扰能力,使发送距离更远;(TTL信号转为232信号)
STEPs:
- 待发送数据放入FIFO
- 增加了UART协议的各种头,比如起始和校验,然后拷贝放入shifter;
- shifter每个bit依次移位到引脚来发送,先发低位,后发高位;
接收时顺序相反,RxD –> shifter –> FIFO;
UART控制器的总体框图
CPU会通过总线,和接收和发送的BUFFer相连,用来读写数据,另外,也和控制单元相连,对控制单元的设置进行修改;
UART寄存器详解
补充一个细节,回环模式look-back是在内部将Tx和Rx短接,一般用于测试;
三种工作模式:
- polling 轮询
- CPU不断地对FIFO进行访问,查询需要的数据有没有发过来;
- CPU的状态: 工作 –> 轮询 –> 工作 –> 轮询 …
- 直到查找到需要的数据;
- 费时费力,消耗资源
- interrupt 中断
- CPU和FIFO约定,CPU不主动去查询,当FIFO收到数据要发送过来的时候,给CPU发送中断信号,CPU中断当前工作,接收FIFO的数据;
- 比polling模式省资源;
- DMA 直接存储器访问
- CPU收到FIFO的数据,最终也是要放入某一块内存中去使用的;
- DMA模式跳过CPU,当FIFO数据过来时,直接放入需要的内存中;
UART编程之前,设置需要的寄存器,以及顺序:
UART编程
STEP 1: 串口初始化
STEP 2: main函数
STEP 3: 收发函数封装
- 发送数据:
- 接收数据:
STEP 4: 优化
电脑 – > 开发板, 然后开发板收到数据+1,再返回给电脑;
输入输出重定向
这种通过判断发送寄存器是不是空,来把数据放入UART的寄存器中,就是相当于printf重定向到UART串口,而其他操作系统中,是重定向到显卡或者磁盘;
尝试写一个发送字符串的函数:
总线协议之 -- UART