1、UART原理
UART: Universal Asynchronous Receiver/Transmitter (通用异步收发寄存器),用于传输串行数据。
发送数据时,CPU将并行数据写入UART,UART按照一定格式在TxD线上串行发出;
接收数据时,UART检测到RxD线上的信号,将串行收集放到缓冲区中,CPU即可读取UART获得数据。
UART最精简的连线形式只有3根线,TxD——》发送,RxD——》接收,GND——》参考电平。
数据传输单位:帧(包含:开始位、数据位、校验位、停止位)
发送数据前,互相通信的UART直接约定——数据传输速率(1/波特率 )、数据传输格式(…)。
2、波特率发生器
————为发送器和接收器提供串行时钟。
!!!!!!未完全理解,待填充
3、关于发送和接收操作的寄存器
ULCONn :设置传输格式
UCONn :用于选择UART时钟源、设置UART中断方式
UFCONn :设置是否使用FIFO,触发阀值(发送/接收 产生中断的数据个数……)
UFSTATn :用于判断FIFO是否已满、其中的数据个数。
UTRSTATn :用于表明数据是否已经发送完毕、是否已经接收到数据
UTXHn :CPU将数据写入这个寄存器、UART会将其保存到缓冲区中,并自动发送出去
URXHn :当UART接收到数据时,CPU读取这个寄存器,可获得数据。
4、 code
//======UART发送一个字符,不用FIFO,直接用UART发送
void Uart_SendByte(char data)
{
if(data=='\n')
{
while(!(rUTRSTAT0 & 0x2));
//取出rUTRSTAT0(UART0发送/接收寄存器)寄存器中的第2位
//含义为Transmitbuffer是否为空,为1时表示空。
//在发送缓冲器为空时,再发送
WrUTXH0('\r'); //将数据写入到UART0发送缓冲器中
}
while(!(rUTRSTAT0 &0x2)); //Wait until THR is empty.
WrUTXH0(data);
}
5、rUTRSTAT0:
串口状态寄存器:UTRSTAT0 其位功能如下
位[2]:无数据发送时,自动设为1。当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。
位[1]:发送FIFO是否为空,本次未用此位
位[0]:接收缓冲区是否有数据,若有,此位设为1。需要用到这位,需要不断查询此位一判断是否有数据已经被接收。
while(!(rUTRSTAT0 & 0x4)); //判断位[2],等待,直到UART的发送器为空,就是发送完毕.
while(!(rUTRSTAT0 & 0x1)); //判断位[0],接收缓冲器接收到有效数据