UART全称是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。串口顾名思义数据串行接口,即数据的传输是一位接一位传输,属于一种串行的数据总线,属于异步通讯,同时支持全双工数据传输(全双工数据传输:允许发送数据和接收数据在同一时刻发生) 。
除了UART,另外还有一种叫USART,全称是通用同步/异步串行接收/发送器(Universal Synchronous/Asynchronous Receiver/Transmitter),USART比 UART多了同步通信功能,但是百分之90的工程应用中不会应用该同步功能,都是将USART当做UART使用,即采取异步串行通讯。一般开发板或者产品中都会将UART串口标为serial或COM。
8.1.2 UART硬件连接 1) UART串口最精简的连接是TTL电平三线连接
UARTx_TXD:用于发送数据,应连接到接收设备的UARTx_RXD引脚上;
UARTx_RXD:用于接收数据,应连接到发送设备的UARTx_TXD引脚上;
GND:为双方提供一个相同的参考电平。
上图为UART串口TTL电平硬件连接,此时使用标准的TTL电平来表示数据,高电平表示1,低电平表示0,标准TTL输入高电平最小2V,输出高电平最小2.4V,典型值为3.4V,输入低电平最大0.8V,输出低电平最大0.4V,典型值为0.2V。
直接采用TTL电平进行串行通讯,由于其抗干扰能力差,导致传输距离短,且容易出现数据不可靠的情况。
为提高抗干扰能力和传输距离,一般采用下面两种硬件连接方式。
2)TTL电平转RS232电平
硬件连接如下图
RS232电平规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V,选用该电气标准以提高抗干扰能力。常用的TTL转RS232芯片有:MAX232,SP3232等。
3)TTL电平转USB电平
将TTL电平转换为USB电平(D+与D-一对差分信号采用NRZI编码实现通讯),提高抗干扰能力,常用的TTL转USB芯片有:PL2303,CH340, CP2102等
100ASK_IMX6ULL采用的是上述方案中的第三种(TTL转USB方案)。
8.1.3 UART通讯数据格式 UART之间为何能够准确可靠的的发送和接收数据?
首先我们需要约定好传输速率(每一秒传输的数据位数,即波特率),一般选择9600,19200,115200等。
确定好传输速率后,我们还需要确定传输数据的格式,UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。
举例波形说明如下图:
上图为:1位起始位+8位数据位+1位偶校验位+1位停止位 的波形。
根据查找ASCII码表得知’ A’字符的ASCII值为41(十进制),将其转换成二进制应该为0100 0001,小端传输,即低位(LSB)在前,高位(MSB)在后,和上图所示一致。
上图中各位的详细说明如下:
1) 空闲位:
平时没有数据时,数据线为高电平(逻辑1);
2) 起始位:
当需要发送数据时,UART将改变UARTx_TXD的状态,变为低电平,即为上图中的起始位(逻辑0);
3) 数据位:
可以有5、6、7或8位的数据,一般我们是按字节(8位)传输数据,发送方一位一位的改变数据线上的状态(高电平或低电平)将它们发送出去,传输数据时先传最低位,最后传送最高位。
字符’A’的8位二进制字符是0100 0001,先发送最低位bit 0,其值为1;再发送bit 1,其值为0,如此继续;最后发送最高位bit 7,其值为0。
4) 奇偶校验位
如果使用了奇偶校验功能,有效数据位发送完毕后,还要发送1个校验位(奇偶校验位)。
有两种校验方法:奇校验,偶校验-------数据位连同校验位中,“1”的数目等于奇数或偶数。奇偶校验只能检错,不能纠错的。而且只能检测1位误码,检测出有错后只能要求重发,没法纠正的。
上图中使用的是偶较验,即8个数据位和1个校验位中,一共有偶数个“1”:2个。
5) 停止位
停止位(逻辑1)用来表示当前数据传输完毕。
停止位的长度有三种:1位,1.5位,2位,通常我们选择1位即可。
8.2 IMX6ULL UART寄存器介绍 UART:Universal Asynchronous Receiver/Transmitter,通用异步收发传输器。
8.2.1 IMX6ULL UART模块简介 IMX6ULL共8个独立的UART通道,即8个UART,主要特性如下:
a.兼容高速串口标准TIA/EIA-232-F,高达5Mbit/s;
b.低速串行红外接口(IR),兼容Ir-DA(速度高达115.2Kbit/s);
c.支持9位或多点模式(RS-485)(自动从机地址检测);
d.1或2位停止位;
e.可编程奇偶校验(偶校验,奇校验,不校验);
f.自动波特率检测(最高支持115.2Kbit/s);
g.可屏蔽中断
h.软复位(SRST_B)
以上只是列举了部分常用的特性,如需要更加详细的了解需要查看芯片手册《Chapter 55 Universal Asynchronous Receiver/Transmitter(UART)》。
8.2.2 IMX6ULL UART寄存器简介 IMX6ULL 8路UART通道,每一路通道都有17个寄存器,掌握其中一路通道,其他通道都是照葫芦画瓢,只是基地址变了和IO复用管脚不同了。
UART1的寄存器如下图:
而我们本次实验使用到的只有上面红色框框9项。
8.2.2.1 UART1_URXD: 主要用于接收串口数据的寄存器,只有低八位的空间是存储接收数据的,其他是一些判断位,基本用不上;
用于发送串口数据的寄存器,只有低八位的空间用于发送数据,其他位保留不使用;
控制寄存器1,用于设置串口各类功能的使能,例如自动波特率检测的使能,发送中断,串口DMA使能,串口使能等。而我们本章节只使用bit0,串口使能即可。
控制寄存器2:主要用于设置串口的发送帧格式,帧长,是否奇偶校验,是否忽略有RTS,软复位等,本章只使用其中的5位,后续UART编程会详细讲解。
控制寄存器3:我们只设置bit2,官方要求设置,属于芯片特点。
串口FIFO控制寄存器,设置发送与接收的fifo的大小,最大32字节,串口时钟分频系数等,只要把RFDIV此位设置为不分频,其他用默认值即可,更详细使用会在后面的UART编程中讲解。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WY9zM06-1642060106751)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/08_UART_Promgram_image011.png)]
8.2.2.7 UART1_USR2: 串口状态寄存器,该寄存器里面主要是一些串口的状态位,我们本章只使用了TXDC发送完成位与ROR接收数据就绪位。详细使用会在后面UART编程中讲解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRrkCTPv-1642060106752)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/08_UART_Promgram_image012.png)]
8.2.2.8 UART1_UBIR与UART1_UBMR: 用于设置波特率即每秒可传输的位数,后面UART编程会详细讲解。
基本我们使用的寄存器就这些,其他都是一些功能扩展,想详细了解的可以查看芯片手册的《Chapter 55 Universal Asynchronous Receiver/Transmitter(UART)》
8.3 IMX6ULL UART编程 8.3.1 看原理图确定UART引脚 从上图可知,采用的UART转USB的方案,使用的是UART1。查看IMX6ULL芯片手册《Chapter 55 Universal Asynchronous Receiver/Transmitter(UART)》中涉及关键字UART1的寄存器并设置它。
8.3.2 涉及的UART1寄存器配置 寄存器配置共分为4步骤,该小节中的代码都在程序文件uart.c中
8.3.2.1 步骤1:配置并使能UART1时钟 配置并使能UART1时钟,参考资料:芯片手册《Chapter 18: Clock Controller Module (CCM)》
①需要配置UART模块的时钟(寄存器:CCM_CSCDR1)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-db7puYcS-1642060106753)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/08_UART_Promgram_image014.png)]
根据上图可知,我们需要设置CCM_CSCDR1 [UART_CLK_SEL]和CCM_CSCDR1 [UART_CLK_PODF]。
由上图CCM_CSCDR1寄存器,我们可以了解到
CCM_CSCDR1 [UART_CLK_SEL]默认值为0;CCM_CSCDR1 [UART_CLK_PODF]默认值为0
我们一般选择 pll3_80m 作为 UART 的时钟源,UART_CLK_PODF分频系数选1分频(不分频),最后得到UART的时钟频率为80MHz。
正好默认值都为0满足我们的时钟需求,所以后续的编程实验,串口时钟这部分可以不设置,用默认值就可以了。
②需要使能UART模块的时钟(寄存器:CCM_CCGR5)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q28rkb2b-1642060106755)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/08_UART_Promgram_image017.png)]
由上图CCM_CCGR5寄存器,我们可以了解到CCM_CCGR5[CG12] 的默认值为11
参考章节《4-1.3 CCM用于设置是否向GPIO模块提供时钟》我们了解到11表示该模块全程使能,使用默认值,无需设置。
因此时钟这块我们都不需要配置,直接使用默认值即可。
8.3.2.2 步骤2:复用相关GPIO为UART1功能 复用相关GPIO为UART1功能,参考资料:芯片手册《Chapter 32: IOMUX Controller (IOMUXC)》
根据前面硬件连接讲解,我们知道串口通信精简接法需要3根信号线,其中GND已由硬连接了,所以接下来我们需要配置剩余的两个GPIO引脚 (UART1_TXD与UART1_RXD)
①需要配置UART1_TX复用功能
(寄存器:IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA)
由上图我们得知IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA[MUX_MODE]的默认值为0101,因此我们需要将其改为0,用于UART_TX功能
②需要配置UART1_RX复用功能
(寄存器:IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPiLTrbP-1642060106756)(https://cdn.jsdelivr.net/gh/DongshanPI/HomeSite-Photos@main/IMX6ULL-BareMetal/08_UART_Promgram_image019.png)]
由上图我们得知IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA[MUX_MODE]的默认值为0101,因此我们需要将其改为0,用于UART_RX功能。(程序文件:uart.c)
IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA = (volatile unsigned int *)(0x20E0084);
IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA = (volatile unsigned int *)(0x20E0088);
*IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA = 0;
*IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA = 0;
③ 需要配置UART1_TX硬件参数(寄存器:IOMUXC_SW_PAD_CTL_PAD_UART1_TX_DATA)
参考章节《4-1.3 IOMUXC:引脚的模式(Mode、功能)》,经过比对,我们使用默认值(0x10b0)即可,无需配置。
④ 需要配置UART1_RX硬件参数(寄存器:IOMUXC_SW_PAD_CTL_PAD_UART1_RX_DATA)
参考章节《4-1.3 IOMUXC:引脚的模式(Mode、功能)》, 经过比对,我们使用默认值(0x10b0)即可,无需配置。
8.3.2.3 步骤3:设置UART1传输格式,波特率 设置UART1传输格式,波特率
① 配置寄存器UART1_UCR2(0x2020084)
设置UART1传输格式
UART1->UCR2 |= (1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?