嵌入式设备通信--UART
一、概述
1、数据传输模式
并行通信与串行通信
通信模式 | 说明 |
串行通信 | 将数据拆分成一个个比特,按照先后次序在一根总线上进行发送 占用资源少、结构简单 与并行通信相比通信距离较长 常见串行通信有UART、IIC |
并行通信 | 可以实现多比特数据同时传输,传输速率高 占用芯片资源较多、成本较高 适用于短距离通信 常见并行通信有PIC、RAM |
单工、半双工、全双工
工作模式 | 说明 |
单工模式 | 通过一根总线实现数据传输 主机通信收发方固定,只能单向接受/发送数据 |
半双工 | 通过一根总线实现数据传输 数据可以双向交互(能收也能发) 不能同时收发 |
全双工 | 通过两根总线实现数据传输 数据可以在两个方向进行(允许同时收发) |
异步通信与同步通信
同步通信:通信双方通过共享时钟信号同步数据传输时序(如SPI、I2C)
异步通信:无统一时钟、通过起始位与停止位标识边界(如UART)
2、UART
UART是一种全双工(通过Tx和Rx两各引脚实现同步收发)异步串行通信协议,用于在设备间的数据传输
使用UART进行数据传输时,双方需定义数据传输速率(波特率),只有在双方波特率匹配时数据才能准确收发
波特率计算公式
BaudRate:波特率
RefFreq:时钟频率
UBMR、UBIR:调节参数,用于调整波特率数值
UART数据传输的过程如下图所示
- 空闲时数据线为高电平,发送方拉低电平表示起始位
- 数据位用于存储实际发送的数据(5 - 9位,一般为8位)
- 校验位用于错误检测(奇偶校验)
- 停止位:1 - 2位逻辑高电平,标志数据包发送结束
UART的特点
优点 | 缺点 |
简单易用,硬件成本低 | 通信速度较慢 |
支持长距离通信(RS-485) | 仅支持点对点通信 |
抗干扰强 | 数据帧长度固定,不灵活 |
二、使用示例
1、串口初始化
void uart1_init(void)
{IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0);IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10B0);//复位UART1->UCR2 &= ~(1 << 0); unsigned int t;t = UART1->UCR2; //相关控制寄存器配置......UART1->UCR2 = t;UART1->UCR3 |= (1 << 2);UART1->UFCR &= ~(7 << 7);UART1->UFCR |= (5 << 7);UART1->UBIR = 999; //波特率设置UART1->UBMR = 43401;//使能UART1UART1->UCR1 |= (1 << 0);
}
2、写入与接收
void putc(char ch)
{while((UART1->USR2 & (1 << 3)) == 0); //发送完成标志位,检测是否已发送UART1->UTXD = ch;
}void puts (const char *p)
{while (*p){putc(*p++);}putc('\n');
}char getc(void)
{while((UART1->USR2 & (1 << 0)) == 0); //接收完成标志位,检测是否接受到数据return UART1->URXD & 0xFF;
}