基于IMX6ULL 芯片 UART1
- 单工、半双工、全双工通信
- 单工通信:数据只能沿一个固定方向传输,比如广播电台向收音机发送信号,收音机不能向电台发信号。
- 半双工通信:数据能双向传输,但同一时间只能沿一个方向传,像对讲机,一方说话时另一方只能听,不能同时说。
- 全双工通信:数据可同时双向传输,例如打电话,双方能同时说话和听。
- 串行通信与并行通信
- 串行通信:数据一位一位依次传输,只需要一条或很少的传输线,比如电脑 USB 接口传输数据。
- 并行通信:数据的多位同时传输,需要多条传输线,像电脑内部的总线传输数据,能提高传输速度,但成本高。
- 异步通信与同步通信
- 异步通信:收发双方不用统一的时钟信号,通过起始位、停止位等方式同步数据,每次传输的是一个字符或字节,比如串口通信。
- 同步通信:收发双方用统一的时钟信号来同步,一次传输大量数据,比如 I2C、SPI 总线通信。
- 串口通信的类别串口通信属于串行通信、异步通信,通常为全双工通信(也可配置为半双工)
- 串口通信常见电气表达标准有 RS - 232、RS - 485、RS - 422,各有特点:
- RS - 232:采用负逻辑电平,与 TTL 电平不兼容,需电平转换;通信距离短(≤15 米)、速率低(最高约 20kbps),适用于计算机与打印机、Modem 等短距连接。
- RS - 485:差分信号传输,抗干扰强;通信距离远(100kbps 下达 1200 米),支持多节点(一主多从),广泛用于工业控制领域。
- RS - 422:差分传输,抗干扰强;通信性能好(10Mbps 时达 120 米,100kbps 时达 1200 米),支持全双工、一对多通信,多用于工业自动化、测量仪器等场景。
以下是对这段 IMX6ULL 芯片 UART1 初始化及基本操作代码的详细标注:
#include "uart.h" // 包含UART相关函数声明
#include "../imx6ull/MCIMX6Y2.h" // 包含IMX6ULL芯片寄存器定义
#include "../imx6ull/fsl_iomuxc.h" // 包含IOMUXC引脚复用配置函数/*** @brief 初始化UART1通信接口* 配置UART1的引脚复用、波特率、数据格式等参数*/
void uart1_init(void)
{// 配置UART1_TX引脚复用为UART1发送功能,第二个参数0表示默认配置IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);// 配置UART1_RX引脚电气属性:0x10B0包含下拉、100K上拉、速度等级等配置IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10B0);// 配置UART1_TX引脚电气属性:同上IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0);// 配置UART1_RX引脚复用为UART1接收功能IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);// 关闭UART1(UCR2寄存器的第0位为UART使能位,清零关闭)UART1->UCR2 &= ~(1 << 0);unsigned int t;t = UART1->UCR2; // 读取当前UCR2寄存器值t |= (1 << 14); // 使能忽略RTS引脚(硬件流控)t &= ~(1 << 8); // 禁用奇偶校验t &= ~(1 << 6); // 选择1个停止位t |= (1 << 5); // 使能接收功能t |= (1 << 2); // 使能发送功能t |= (1 << 1); // 数据位长度设置为8位UART1->UCR2 = t; // 写入配置后的UCR2值UART1->UCR3 |= (1 << 2); // 配置UART在停止模式下保持时钟(低功耗相关)UART1->UFCR &= ~(7 << 7); // 清除原有分频器配置UART1->UFCR |= (5 << 7); // 设置分频系数,用于波特率计算UART1->UBIR = 999; // 波特率整数部分配置(根据外部时钟计算)UART1->UBMR = 43402; // 波特率小数部分配置(9600波特率对应值)UART1->UCR1 |= (1 << 0); // 使能UART1(启动UART功能)
}/*** @brief 发送一个字节数据* @param ch 要发送的字节*/
void putc(unsigned char ch)
{// 等待发送缓冲区为空(USR2寄存器第3位为1表示可发送)while ((UART1->USR2 & (1 << 3)) == 0);UART1->UTXD = (ch & 0xFF); // 写入发送寄存器,发送数据
}/*** @brief 发送字符串* @param pStr 要发送的字符串指针(以'\0'结尾)*/
void puts(const char *pStr)
{while (*pStr) // 循环发送每个字符直到字符串结束{putc(*pStr++); // 发送当前字符并移动指针}putc('\n'); // 发送换行符,完成一行输出
}/*** @brief 接收一个字节数据* @return 接收到的字节*/
unsigned char getc(void)
{// 等待接收缓冲区有数据(USR2寄存器第0位为1表示有数据)while ((UART1->USR2 & (1 << 0)) == 0);return (unsigned char)(UART1->URXD & 0xFF); // 读取接收寄存器并返回
}/*** @brief 异常处理函数(标准库需要,此处空实现)* @param n 异常编号*/
void raise(int n)
{// 预留函数,用于处理程序异常
}
代码主要功能说明:
uart1_init()
:完成 UART1 的初始化配置,包括引脚复用、电气属性、数据格式(8 位数据位、1 位停止位、无校验)和波特率设置putc()
:阻塞式发送单个字节,确保数据正确发送puts()
:发送字符串并自动添加换行符getc()
:阻塞式接收单个字节,等待数据到来raise()
:标准库所需的异常处理函数,此处仅作为占位符
这段代码适用于 NXP IMX6ULL 芯片的 UART1 接口,实现了基本的串口收发功能,可用于调试信息输出或简单的串口通信。