【北京迅为】i.MX6ULL终结者串口通信例程串口简介

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

串口的出现是在1980年前后,数据传输率是115kbps~230kbps。串口出现的初期是为了实现连接计算机外设的目的,初期串口一般用来连接鼠标和外置Modem以及老式摄像头和写字板等设备。串口也可以应用于两台计算机(或设备)之间的互联及数据传输。由于串口(COM)不支持热插拔及传输速率较低,部分新主板和大部分便携电脑已开始取消该接口。串口多用于工控和测量设备以及部分通信设备中。

按照接口划分标准可以分为同步串行接口(SSI)和异步串行(UART)。我们用到的串口就是异步传输的(UART)。

UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。其中各位的意义如下:
起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
数据位:数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。

UART分为TTL电平和RS232电平两种。TTL电平是就是指我们的处理器上具有串口功能的引脚直接引出来,他的电平就是TTL的(高电平表示1,低电平表示0)。RS232是TTL电平通过一个232的芯片转换出来的,-3v到-15v表示1,+3v到+15v表示1。

由于现在的电脑基本都没有外接串口了,但是串口设备在我们嵌入开发中非常常用,为了解决这个问题,市面上出现了很多的usb转串口模块,他们用到的usb转串口芯片有ch340,pl2303等等。
我们的i.MX6 ULL终结者底板上线集成了一路USB传串口接口,我们只需要使用一根mini USB数据线,一端连接电脑,另一端连接开发板的USB-UART接口,如图 1:
在这里插入图片描述

图 1

接下来我们来看下i.MX6ULL芯片的UART特性:
1.兼容高速TIA/EIA-232-F,最大速率能到5.0Mbit/s
2.支持低速的串行IR接口,IRDA接口,最大速率能到115.2Kbit/s
3.支持9位或者多点485模式(自动检测从地址)
4.7位或8位数据位,9位485模式
5.1位或2位停止位
6.支持奇偶校验
7.支持硬件流控
8.可以通过CTS_B控制485的传输方向
9.波特率自动检测功能,最高速率到115.2Kbit/s
10.数据收发引脚可以互相转换

I.MX6ULL的UART的功能很多,我们这里只用到最基本的数据收发功能,关于其他功能,大家可以参考《I.MX6ULL 参考手册.pdf》第五十五章。

我们使用UART必须要设置对应的时钟源以及分频值,关于UART的时钟,我们可以参考《I.MX6ULL 参考手册.pdf》的第18章Clock Controller Module (CCM),我们在该章节的18.3 CCM Clock Tree小节,可以看到UART的时钟使能位由寄存器CCM_CSCDR1的UART_CLK_SEL位来决定,CCM_CSCDR1的UART_CLK_PODF位设置分频,如图 2所示:
在这里插入图片描述

图 2

然后我们来看下CCM_CSCDR1寄存器的结构,如图 3所示:
在这里插入图片描述

图 3

我们可以看到该寄存器与UART相关的分别是:
UART_CLK_SEL(bit 6):选择时钟源,为0的时候选择pll3_80m,为1的时候选择osc_clk,我们的例程选择pll3_80m作为时钟源。

UART_CLK_PODF(bit5:bit0):串口时钟的分频参数。我们的例程设置成1分频(相当于不分频),最终UART的输入时钟就是pll3_80m的时钟(80MHz)。

接下来我们看下跟串口相关的几个寄存器。首先第一个是串口接收寄存器UARTx_URXD,结构图如图 4所示:
在这里插入图片描述

图 4

该寄存器的bit31到bit16作为保留。
CHARRDY(bit15):接收字符就绪标志位,如果UART接收到的数据准备就绪,可以读取了,该位为1,如果接收数据没有准备好,该位为0。
Bit14到bit10是一些错误标志位。
Bit9:bit8作为保留。
RX_DATA(bit7:bit0):接收到的数据。

然后是UART的发送寄存器UARTx_UTXD,结构图如图 5所示:
在这里插入图片描述

图 5

我们从上图可以看到bit31:bit8作为保留,没有用到。
TX_DATA(bit7:bit0):发送数据位。

然后是UART控制寄存器1 UARTx_UCR1,结构图如图 6所示:
在这里插入图片描述

图 6

我们看到该寄存器的bit31:bit16作为保留了。
ADEN(bit15):波特率自动检测中断使能,为0的时候关闭波特率自动检测中断,为1的时候使能波特率自动检测中断。
ADBR(bit14):波特率自动检测使能位。为0的时候关闭波特率自动检测,为1的时候使能波特率自动经检测。
TRDYEN(bit13):传输就绪中断使能位。
IDEN(bit12):空闲状态检测中断使能位。
ICD(bit11:bit10):空闲状态检测。
RRDYEN(bit9):接受就绪中断使能位。
RXDMAEN(bit8):DMA接收使能。
Bit7:bit1我们在例程中暂时用不到,我就不一一列举出来了。
UARTEN(bit0):UART使能位。为0的时候关闭UART,为1的时候使能UART。

然后是串口控制寄存器2 UARTx_UCR2,结构图如图 7所示:
在这里插入图片描述

图 7

该寄存器的bit31:bit16作为保留。
ESCI(bit15):转义序列中断使能位。
IRTS(bit14):RTS引脚使能位。
CTSC(bit13):CTS引脚使能位。
Bit12:bit9本例程我们没有使用到。
PREN(bit8):奇偶校验使能位。为0关闭奇偶校验,为1使能奇偶校验
PROE(bit7):奇偶校验选择位。为0是偶校验,为1是奇校验。
STPB(bit6):停止位个数选择位。为0的时候1位停止位,为1的时候2位停止位
WS(bit5):数据位长度。为0的时候7位数据位,为1的时候8位数据位。
RTSEN(bit4):请求发送中断使能位。为0关闭,为1使能。
ATEN(bit3):启用老化计时器位。为0是关闭,为1是使能。
TXEN(bit2):发送使能位。为0关闭发送,为1使能发送
RXEN(bit1):接收使能位。为0关闭接收,为1使能接收。
SRST(bit0):软件复位。为0的时候复位。

然后是UART的控制寄存器3 UARTx_UCR3,结构图如图8所示:
在这里插入图片描述

图 8

在该寄存器中,我们只需要设置RXDMUXSEL(bit2)为1即可。
接下来我们看下UART的UARTx_UFCR,UARTx_UBIR,UARTx_UBMR。这三个寄存器决定串口的波特率。波特率的计算公式:
Baud Rate = Freq/(16x((UARTx_UBMR+1)/(UARTx_UBIR+1)));
其中的Freq:经过分频以后进入UART的时钟,然后该时钟通过寄存器UARTx_UFCR的RFDIV(bit9:bit7)在分频得到的最终时钟。

RFDIV(bit9:bit7)是三位表示,根据手册我们可以得到下表:
RFDIV(bit9:bit7) 分频
000 6分频
001 5分频
010 4分频
011 3分频
100 2分频
101 1分频
110 7分频
111 保留

比如现在我们要设置UART的波特率为115200,那么设置RFDIV为5(101b),参照上表就是1分频,所以Freq=80MHz。,如果设置UARTx_UBIR为61,那么UARTx_UBMR应该设置为3124。

关于UART的寄存器我们就介绍到这里,如果想了解更多关于UART的知识,可以参考《I.MX6ULL 参考手册.pdf》的第55章。我们使用UART1实现串口的通信功能,所以我们需要做如下的步骤来实现:
1.设置UART1的时钟源
2.初始化UART1,IO复用成UART模式,然后设置波特率,停止位,奇偶校验位,数据位,停止位等等。
3.使能UART1。
4.实现UART1的收发函数。在这里插入图片描述