13. 通用异步收发器UART

13. 通用异步收发器UART

13.1 UART简介

CH559芯片提供2个全双工的异步串口:UART0和UART1。

UART0是标准MCS51串口,其数据接收和发送是通过SBUF访问物理上分开的收/发寄存器实现的。写入SBUF的数据装入发送寄存器,对SBUF的读操作则对应于接收缓冲寄存器。

UART1是增强型异步串口,特性如下:

  1. 兼容16C550异步串口并且有所增强;
  2. 支持5、6、7或者8个数据位以及1或者2个停止位;
  3. 支持奇、偶、无校验、空白0、标志1等校验方式;
  4. 可编程通讯波特率,支持115200bps以及最高达3Mbps的通讯波特率;
  5. 内置独立的收发缓冲区及8字节的FIFO先进先出缓冲器,支持4个FIFO触发级;
  6. 支持MODEM调制解调器信号CTS、DSR、RI、DCD、DTR、RTS,可外部转成RS232电平;
  7. 支持硬件流控制信号CTS和RTS自动握手和自动传输速率控制,兼容TL16C550C;
  8. 支持串口帧错误检测、支持Break线路间隔检测;
  9. 内置SIR红外线编解码器,支持2400bps到115200bps波特率的IrDA红外通讯;
  10. 支持全双工和半双工串口通讯,提供发送状态引脚用于切换RS485;
  11. 内置半双工差分收发器,直接支持简单的类似RS485总线的远距离多机通讯;
  12. 支持预置本机作为从机时的地址,用于多机通讯时自动匹配总线上的数据包。

13.2 UART寄存器

表13.2.1 UART相关寄存器列表

名称地址描述复位值
SBUF 99hUART0数据寄存器 xxh
SCON 98hUART0控制寄存器 00h
SER1_DLL 9AhUART1波特率除数锁存器低字节 xxh
SER1_RBR 9AhUART1数据接收缓冲寄存器(只读) xxh
SER1_THR 9AhUART1数据发送保持寄存器(只写) xxh
SER1_FIFO 9AhUART1数据FIFO读写寄存器 xxh
SER1_DIV 97h UART1预分频除数寄存器 xxh
SER1_ADDR 97hUART1总线地址预置寄存器FFh
SER1_MSR 96h调制解调器MODEM状态寄存器(只读) F0h
SER1_LSR 95hUART1线路状态寄存器(只读) 60h
SER1_MCR 94h调制解调器MODEM控制寄存器00h
SER1_LCR 93hUART1线路控制寄存器00h
SER1_IIR 92hUART1中断识别寄存器(只读)01h
SER1_FCR 92hFIFO控制寄存器(只写)00h
SER1_DLM 91hUART1波特率除数锁存器高字节80h
SER1_IER 91hUART1中断使能寄存器00h

13.2.1 UART0寄存器描述

UART0控制寄存器(SCON):

名称访问描述复位值
7SM0RWUART0工作方式选择位0,该位为0选择8位数据异步通信;该位为1选择9位数据异步通信0
6SM1RWUART0工作方式选择位1,该位为0设置固定波特率;该位为1设置可变波特率,由定时器T1或者T2产生0
5SM2RWUART0多机通信控制位:在模式2和3接收数据时,当SM2=1时,如果RB8为0,那么RI不置1,接收无效;如果RB8为1,那么RI置1,接收有效;当SM2=0时,不管RB8为0或者1,RI接收数据时都置位,接收有效;在模式1时,如果SM2=1,那么只有接收到有效的停止位时,接收才有效;在模式0时,SM2位必须置00
4RENRWUART0允许接收控制位,该位为0禁止接收;该位为1允许接收0
3TB8RW发送数据的第9位,在模式2和3时,TB8用于写入发送数据的第9位,可以是奇偶校验位;在多机通信中,用于表示主机发送的是地址字节还是数据字节,TB8=0为数据,TB8=1为地址0
2RB8RW接收数据的第9位,在模式2和3时,RB8用于存放接收数据的第9位;在模式1时,如果SM2=0,那么RB8用于存放接收到的停止位;在模式0时,不使用RB80
1TIRW发送中断标志位,一个数据字节发送完后由硬件置位,需要软件清零0
0RIRW接收中断标志位,一个数据字节接收有效后由硬件置位,需要软件清零0

表13.2.1.1 UART0工作模式选择

SM0SM1描述
0 0模式0,移位寄存器方式,波特率固定是Fsys/12
0 1模式1,8位异步通信方式,波特率可变,由定时器T1或者T2产生
1 0模式2,9位异步通信方式,波特率是Fsys/128(SMOD=0)或Fsys/32(SMOD=1)
1 1模式3,9位异步通讯方式,波特率可变,由定时器T1或者T2产生

在模式1和3下,当RCLK=0并且TCLK=0时,UART0波特率由定时器T1产生。应该设置T1为模式2自动重载8位定时器模式,bT1_CT和bT1_GATE必须都为0,分为以下几类时钟情况。

表13.2.1.2 由T1产生UART0波特率的计算公式

bTMR_CLKbT1_CLKSMOD描述
1 1 0 TH1 = 256 - Fsys / 32 / 波特率
1 1 1 TH1 = 256 - Fsys / 16 / 波特率
0 1 0 TH1 = 256 - Fsys / 4 / 32 / 波特率
0 1 1 TH1 = 256 - Fsys / 4 / 16 / 波特率
X 0 0 TH1 = 256 - Fsys / 12 / 32 / 波特率
X 0 1 TH1 = 256 - Fsys / 12 / 16 / 波特率

在模式1和3下,当RCLK=1或者TCLK=1时,UART0波特率由定时器T2产生。应该设置T2为16位自动重载波特率发生器模式,C_T2和CP_RL2必须都为0,分为以下几类时钟情况。

表13.2.1.3 由T2产生UART0波特率的计算公式

bTMR_CLKbT2_CLK描述
1 1 RCAP2 = 65536 - Fsys / 16 / 波特率
0 1 RCAP2 = 65536 - Fsys / 2 / 16 / 波特率
X 0 RCAP2 = 65536 - Fsys / 4 / 16 / 波特率

UART0数据寄存器(SBUF):

名称访问描述复位值
[7:0]SBUFRWUART0数据寄存器,包括发送和接收两个物理上分开的寄存器。向SBUF写数据对应发送数据寄存器;从SBUF读数据对应接收数据寄存器xxh

13.2.2 UART1相关寄存器

UART1数据FIFO读写寄存器SER1_FIFO,包括数据接收缓冲寄存器SER1_RBR和数据发送保持寄存器SER1_THR两个物理上分开的寄存器。

数据接收缓冲寄存器(SER1_RBR),仅当bLCR_DLAB=0时有效:

名称访问描述复位值
[7:0]SER1_RBRRO串口接收缓冲寄存器,如果SER1_LSR的bLSR_DATA_RDY位为1,则可以从该寄存器读取接收到的数据;如果bFCR_FIFO_EN为1,则从串口移位寄存器接收到的数据首先被存放于接收FIFO中,然后通过该寄存器读出xxh

数据发送保持寄存器(SER1_THR),仅当bLCR_DLAB=0时有效:

名称访问描述复位值
[7:0]SER1_THRWO串口发送保持寄存器,包括发送FIFO,用于写入准备发送的数据;如果bFCR_FIFO_EN为1,则写入的数据首先被存放于发送FIFO中,然后通过发送移位寄存器逐个输出xxh

中断使能寄存器(SER1_IER),仅当bLCR_DLAB=0时有效:

名称访问描述复位值
7 bIER_RESET RW串口软件复位控制位,该位为1则复位串口,该位能够自动清零,无需软件清零 0
6 bIER_EN_MODEM_O RWUART1调制解调器MODEM信号输出使能位,该位为1使能MODEM信号RTS/DTR输出,该位为0禁止输出 0
5 bIER_PIN_MOD1 RWUART1引脚模式选择高位 0
4 bIER_PIN_MOD0 RWUART1引脚模式选择低位 0
3 bIER_MODEM_CHG RW调制解调器输入状态变化中断使能位,该位为1使能产生调制解调器输入状态变化中断;该位为0禁止 0
2 bIER_LINE_STAT RW接收线路状态中断使能位,该位为1使能产生接收线路状态中断;该位为0禁止 0
1 bIER_THR_EMPTY RW发送保持寄存器空中断使能位,该位为1使能产生发送保持寄存器空中断;该位为0禁止 0
0 bIER_RECV_RDY RW接收到数据中断使能位,该位为1使能产生接收数据完成中断和接收到数据后续超时中断,该位为0禁止 0

UART1的引脚模式由bIER_PIN_MOD1和bIER_PIN_MOD0两者以及bUH1_DISABLE、bXBUS_CS_OE、bXBUS_AL_OE、bALE_CLK_EN共同组合选择不同配置,其中,后四者可以先合并为RS485EN:

RS485EN = bUH1_DISABLE & ~ ( bXBUS_CS_OE & ~ bXBUS_AL_OE | bALE_CLK_EN )

RS485ENbIER_PIN_MOD1bIER_PIN_MOD0描述
x 0 0RXD1使用引脚P4.0,TXD1禁止输出
0 1 0RXD1和TXD1分别使用引脚P2.6/RXD1和P2.7/TXD1
0 0 1RXD1和TXD1分别使用引脚P4.0/RXD1_和P4.4/TXD1_
0 1 1RXD1和TXD1及TNOW分别使用引脚P2.6和P2.7及P2.5
1 1 0RXD1和TXD1共同使用iRS485差分引脚XA和XB
1 0 1RXD1和TXD1共同使用引脚XA和XB,TNOW使用引脚P4.4
1 1 1RXD1和TXD1共同使用引脚XA和XB,TNOW使用引脚P2.5

上表的后三种配置是iRS485半双工通讯模式,此时RS485EN=1,RXD1和TXD1共同使用iRS485差分引脚XA和XB,通过内置的半双工差分收发器,直接支持简单的类似RS485总线的远距离多机通讯。在iRS485半双工通讯模式下,还需要设置以下参数:

  1. 设置SER1_MCR中的bMCR_HALF为1,半双工收发模式;
  2. 设置UHUB1_CTRL中的bUH1_DISABLE为1,禁用HP/HM引脚。

中断识别寄存器(SER1_IIR):

名称访问描述复位值
[7:6]MASK_U1_IIR_IDR0FIFO使能标志位,11表示已经使能FIFO00b
[5:4]保留R0保留00b
[3:0]MASK_U1_IIR_INTR0UART1中断状态标志位0001b
0bIIR_NO_INTR0UART1有无中断标志位,为1无中断;为0有中断1

UART1的中断状态由bIIR_INT_FLAG3、bIIR_INT_FLAG2、bIIR_INT_FLAG1和bIIR_INT_FLAG0共4位组成MASK_U1_IIR_INT,作为UART1的串口中断标志,具体中断如下表。

中断名称中断值中断类型中断源清中断方法
U1_INT_SLV_ADDR0Eh总线地址匹配接收到1个数据是串口总线地址,且该地址与预置值匹配或是广播地址读SER1_IIR或禁用多机模式
U1_INT_LINE_STAT06h接收线路状态bLSR_OVER_ERR或bLSR_PAR_ERR或bLSR_FRAME_ERR或bLSR_BREAK_ERR读SER1_LSR
U1_INT_RECV_RDY04h接收数据可用接收到的字节数达到FIFO的触发点读SER1_RBR
U1_INT_RECV_TOUT0Ch接收数据超时已接收到数据,但是超过4个数据字节的时间未收到下一数据读SER1_RBR
U1_INT_THR_EMPTY02hSER1_THR寄存器空发送保持寄存器空,bIER_THR_EMPTY从0变1可以重新使能该中断读SER1_IIR或写SER1_THR
U1_INT_MODEM_CHG00hMODEM输入变化△CTS或△DSR或△RI或△DCD读SER1_MSR
U1_INT_NO_INTER01h没有中断产生没有中断

FIFO控制寄存器(SER1_FCR):

名称访问描述复位值
7bFCR_FIFO_TRIG1W0接收FIFO的中断和硬件流控制的触发点设置高位0
6bFCR_FIFO_TRIG0W0接收FIFO的中断和硬件流控制的触发点设置低位0
[5:3]保留R0保留000b
2bFCR_T_FIFO_CLRW0发送FIFO数据清空使能位,该位为1清空发送FIFO中的数据(不含正在发送的数据);该位能够自动清零,无需软件清零0
1bFCR_R_FIFO_CLRW0接收FIFO数据清空使能位,该位为1清空接收FIFO中的数据(不含正在接收的数据);该位能够自动清零,无需软件清零0
0bFCR_FIFO_ENW0FIFO使能位,该位为1启用FIFO;该位为0禁用FIFO。
禁用FIFO后为16C450兼容模式,相当于FIFO只有一个字节深度,建议启用FIFO
0

bFCR_FIFO_TRIG1和bFCR_FIFO_TRIG0组成MASK_U1_FIFO_TRIG,用于设置接收FIFO的中断和硬件流控制的触发点:11对应7个字节,即接收满7个字节产生接收数据可用的中断,并在使能硬件流控制bMCR_AUTO_FLOW=1时自动无效RTS引脚电平;10对应4个字节;01对应2个字节;00对应1个字节。

线路控制寄存器(SER1_LCR):

名称访问描述复位值
7bLCR_DLABRW波特率除数锁存器存取使能位,该位为0允许存取寄存器SER1_RBR、SER1_THR、SER1_IER、SER1_ADR;该位为1允许存取寄存器SER1_DLL、SER1_DLM、SER1_DIV0
6bLCR_BREAK_ENRW强制产生BREAK线路间隔使能位,该位为0不产生BREAK输出;该位为1强制产生BREAK输出0
5bLCR_PAR_MOD1RW奇偶校验模式高位0
4bLCR_PAR_MOD0RW奇偶校验模式低位0
3bLCR_PAR_ENRW奇偶校验使能位,该位为0无奇偶校验位;该位为1允许发送时产生和接收时校验奇偶校验位0
2bLCR_STOP_BITRW停止位格式设置位,该位为0有一个停止位;该位为1有两个停止位0
1bLCR_WORD_SZ1RW数据字长设置高位0
0bLCR_WORD_SZ0RW数据字长设置低位0

bLCR_PAR_MOD1和bLCR_PAR_MOD0组合,当bLCR_PAR_EN为1时设置奇偶校验位的格式:00则奇校验,01则偶校验,10则标志位(MARK,置1),11则空白位(SPACE,清0)。

bLCR_WORD_SZ1和bLCR_WORD_SZ0组合,设置单个数据的字长度,不含奇偶校验位:00则5个数据位,01则6个数据位,10则7个数据位,11则8个数据位。

MODEM控制寄存器(SER1_MCR):

名称访问描述复位值
7bMCR_HALFRW半双工收发模式使能位,该位为0禁止半双工收发模式,支持全双工;该位为1进入自动半双工收发模式,发送优先,发送期间暂停接收,不发送时自动转为接收0
6bMCR_TNOWRWRTS引脚功能选择位,该位为0则为标准RTS输出;该位为1则转为TNOW输出,输出正在发送的状态,可以用于控制RS485等半双工模式的收发切换0
5bMCR_AUTO_FLOWRWCTS和RTS硬件自动流控制使能位,该位为0禁用硬件流控;该位为1启用硬件自动流控制。
启用硬件流控后,仅在检测到CTS引脚输入低电平有效时串口才继续发送下一个数据,否则暂停串口发送;启用硬件流控后,如果bMCR_RTS为1,那么当接收FIFO空时,串口会自动低电平有效RTS引脚,直到接收的字节数达到FIFO的触发点时,串口才自动无效RTS引脚,并能够在接收FIFO空时再次有效RTS引脚;启用硬件流控后的CTS输入状态变化不会产生MODEM状态中断。通过将己方的CTS引脚接到对方的RTS引脚,并将己方的RTS引脚送到对方的CTS引脚,可以实现硬件自动速率控制
0
4bMCR_LOOPRW内部回路的测试模式使能位,该位为0禁止内部回路测试;该位为1使能内部回路测试。
在内部回路的测试模式下,串口所有对外输出引脚均为无效状态,TXD1内部返回到RXD1,RTS内部返回到CTS,DTR内部返回到DSR,OUT1内部返回到RI,OUT2内部返回到DCD
0
3bMCR_OUT2RW串口的中断请求输出使能位,该位为0禁止串口的中断请求输出,该位为1使能串口的中断请求输出0
2bMCR_OUT1RW用户自定义MODEM控制位,没有连接实际输出引脚,用于内部回路测试,或者作为通用数据位0
1bMCR_RTSRWRTS引脚输出控制位,该位为0则RTS引脚输出无效(高电平);该位为1则RTS引脚输出有效(低电平)0
0bMCR_DTRRWDTR引脚输出控制位,该位为0则DTR引脚输出无效(高电平);该位为1则DTR引脚输出有效(低电平)0

线路状态寄存器(SER1_LSR):

名称访问描述复位值
7bLSR_ERR_R_FIFOR0接收FIFO的错误标志位,该位为1说明接收FIFO中存在至少一个bLSR_PAR_ERR、bLSR_FRAME_ERR或bLSR_BREAK_ERR错误0
6bLSR_T_ALL_EMPR0发送相关寄存器全空标志位,该位为1表示发送保持寄存器SER1_THR和FIFO以及发送移位寄存器全空1
5bLSR_T_FIFO_EMPR0该位为1表示发送保持寄存器SER1_THR和FIFO空1
4bLSR_BREAK_ERRR0该位为1表示检测到BREAK线路间隔状态0
3bLSR_FRAME_ERRR0该位为1表示接收FIFO中的当前数据的帧错误,缺少有效的停止位0
2bLSR_PAR_ERRR0该位为1表示接收FIFO中的当前数据的奇偶校验错0
1bLSR_OVER_ERRR0该位为1表示接收FIFO缓冲区溢出0
0bLSR_DATA_RDYR0该位为1表示接收FIFO中有接收到的数据,将FIFO中所有数据读取后,该位自动清零0

调制解调器MODEM状态寄存器(SER1_MSR):

名称访问描述复位值
7bMSR_DCDR0该位是DCD引脚的位反,为1表示DCD引脚有效(低电平有效)1
6bMSR_RIR0该位是RI引脚的位反,为1表示RI引脚有效(低电平有效)1
5bMSR_DSRR0该位是DSR引脚的位反,为1表示DSR引脚有效(低电平有效)1
4bMSR_CTSR0该位是CTS引脚的位反,为1表示CTS引脚有效(低电平有效)1
3bMSR_DCD_CHGR0该位为1表示DCD引脚输入状态发生过变化0
2bMSR_RI_CHGR0该位为1表示RI引脚输入状态发生过变化0
1bMSR_DSR_CHGR0该位为1表示DSR引脚输入状态发生过变化0
0bMSR_CTS_CHGR0该位为1表示CTS引脚输入状态发生过变化0

UART1总线地址预置寄存器(SER1_ADDR),仅当bLCR_DLAB=0时有效:

名称访问描述复位值
[7:0]SER1_ADDRRW预置总线地址,用于多机通讯时自动比较FFh

SER1_ADDR预置本机作为从机时的地址,用于在多机通讯时自动比较接收到的地址,并在地址匹配时或者在接收到广播地址0FFH时产生中断,同时允许接收后续数据包。在地址没有匹配之前不接收任何数据,开始发送数据后或者重写SER1_ADDR寄存器后停止接收任何数据,直到下次地址再次匹配或者接收到广播地址时再允许接收。

SER1_ADDR为0FFH时或者bLCR_PAR_EN=0时,禁用总线地址自动比较功能。

SER1_ADDR不为0FFH并且bLCR_PAR_EN=1时,启用总线地址自动比较功能,同时应该配置下述参数:bLCR_WORD_SZ1和bLCR_WORD_SZ0都为1以选择8个数据位方式;bLCR_PAR_MOD1总是为1;对于地址字节为MARK的情况(即数据字节的位9为0)应置bLCR_PAR_MOD0为1,对于地址字节为SPACE的情况(即数据字节的位9为1)应置bLCR_PAR_MOD0为0,即按数据字节选择。

UART1波特率除数锁存器(SER1_DLM、SER1_DLL),仅当bLCR_DLAB=1时有效:

名称访问描述复位值
[7:0]SER1_DLLRWSER1_DLL是低字节,SER1_DLM是高字节,两者组成16位除数,用于由16位计数器构成的串口波特率产生器。只有当bLCR_DLAB为1时,才能读写这两个寄存器。该除数 = Fsys * 2 / SER1_DIV / 16 / 波特率xxh
[7:0]SER1_DLMRW80h

UART1预分频除数寄存器(SER1_DIV),仅当bLCR_DLAB=1时有效:

名称访问描述复位值
[7:0]SER1_DIVRW用于将系统主时钟Fsys倍频后再进行预分频,产生串口波特率产生器的内部基准时钟。只有当bLCR_DLAB为1时,才能读写该寄存器 xxh

13.3 UART应用

UART0应用:

  1. 选择UART0的波特率发生器,可以选择来自定时器T1或者T2,并配置相应计数器。
  2. 开启定时器。
  3. 设置SCON的SM0、SM1、SM2选择串口0的工作模式。设置REN为1,使能UART0接收。
  4. 可以设置串口中断或者查询RI和TI中断状态。
  5. 读写SBUF实现串口数据收发,串口接收信号的允许波特率误差不大于2%。

UART1应用:

  1. 设置SER1_LCR的位bLCR_DLAB为1,写UART1预分频寄存器SER1_DIV,根据波特率计算波特率除数,除数 = Fsys / 8 / SER1_DIV / 波特率,除数高低字节分别写入SER1_DLM和SER1_DLL。
  2. 设置SER1_LCR,选择合适的串口数据格式,数据字节和奇偶校验模式等。
  3. 可选设置SER1_IER,选择UART1中断状态触发。
  4. 如果使用中断方式那么需要将SER1_MCR的位bMCR_OUT2置1,使能中断输出;否则需要主动查询中断状态位。
  5. 读写SER1_FIFO实现串口数据收发,串口接收信号的允许波特率误差不大于2%。