学习芯圣HC18M003单片机已经很久了,一直都没有触及它的UART外设机能。现在为了调试IIC的通讯处理,提前把UART机能学习了。因为IIC通讯的过程有些复杂,产生中断时,根据IIC工作模式的不同,会产生不同的状态值。为了能及时输出中间调试信息,准备让UART接入,把通讯过程信息通过串口输出到电脑上,方便及时查看和调试。
一、特性
HC18M003单片机的UART具有以下特性:
➢ 自带波特率发生器
➢ 波特率发生器为一个 16 位向上的计数器
➢ 两种工作方式
➢ 增加帧错误,接收溢出及写冲突检测
➢ 增加地址自动识别
二、工作方式
UART有以下两种工作方式:
➢方式 0:8 位 UART,可变波特率,异步全双工
➢方式 1:9 位 UART,可变波特率,异步全双工
1、工作方式0
对于方式0,提供 10 位全双工异步通信,10 位由一个起始位(逻辑 0),8 个数据位(低位在前)和一个停止位(逻辑 1)组成。在接收时,这 8 个数据位存储在 SBUF 中而停止位储存在 RB8 中。方式 1中的波特率来源于波特率发生器。功能块框图如下图所示。
任何将 SBUF 作为目标寄存器的写操作都会启动发送,实际上发送是从 16 分频计数器中的下一次跳变之后的系统时钟开始的,因此位时间与 16 分频计数器是同步的,与对 SBUF 的写操作不同步。起始位首先在 TXD 引脚上移出,然后是 8 位数据位。在发送移位寄存器中的所有 8 位数据都发送完后,停止位在 TXD 引脚上移出,在停止位发出的同时 TI 标志置位。
只有REN置1时才允许接收。当RXD引脚检测到下降沿时串行口开始接收串行数据。为此,CPU对RXD不断采样,采样速率为波特率的16倍。当检测下降沿时,16分频计数器立即复位,这有助于16分频计数器与RXD引脚上的串行数据位同步。16分频计数器把每一位的时间分为16个状态,在第7、8、9状态时,位检测器对RXD端的电平进行采样。为抑制噪声,在这3个状态采样中至少有2次采样值一致数据才被接收。如果所接收的第一位不是0,说明这位不是一帧数据的起始位,该位被忽略,接收电路被复位,等待RXD引脚上另一个下降沿的到来。若起始位有效,则移入移位寄存器,并接着移入其它位到移位寄存器。8个数据位和1个停止位(包含错误的停止位,详细见寄存器SM2位说明)移入之后,
移位寄存器的内容和停止位(包含错误的停止位)被分别装入SBUF和RB8中,RI置1,但必须满足下列条件:
(1) RI = 0
(2) SM2 = 0或者接收的停止位= 1
如果这些条件被满足,那么停止位(包含错误的停止位)装入 RB8,8 个数据位装入 SBUF,RI被置位。否则接收的帧会丢失。这时,接收器将重新去探测 RXD 端是否另一个下降沿。用户必须用软件清零 RI,然后才能再次接收。
2、工作方式1
对于方式一,使用异步全双工通信中的 11 位。一帧由一个起始位(逻辑 0),8 个数据位(低位在前),一个可编程的第 9 数据位和一个停止位(逻辑 1)组成。方式 1 支持多机通信,在数据传送时,第 9数据位(TB8 位)可以写 0 或 1,例如,可写入 PSW 中的奇偶位 P,或用作多机通信中的数据/地址标志位。当接收到数据时,第 9 数据位移入 RB8 而停止位不保存。
任何将 SBUF 作为目标寄存器的写操作都会启动发送,同时也将 TB8 载入到发送移位寄存器的第9 位中。实际上发送是从 16 分频计数器中的下一次跳变之后的系统时钟开始的,因此位时间与 16 分频计数器是同步的,与对 SBUF 的写操作不同步。起始位首先在 TXD 引脚上移出,然后是 9 位数据。在发送转换寄存器中的所有 9 位数据都发送完后,停止位在 TXD 引脚上移出,在停止位开始发送时TI 标志置位。
只有REN置位时才允许接收。当RXD引脚检测到下降沿时串行口开始接收串行数据。为此,CPU对RXD不断采样,采样速率为波特率的16倍。当检测下降沿时,16分频计数器立即复位。这有助于16分频计数器与RXD引脚上的串行数据位同步。16分频计数器把每一位的时间分为16个状态,在第7、8、9状态时,位检测器对RXD端的电平进行采样。为抑制噪声,在这3个状态采样中至少有2次采样值一致数据才被接收。如果所接收的第一位不是0,说明这位不是一帧数据的起始位,该位被忽略,接收电路被复位,等待RXD引脚上另一个下降沿的到来。若起始位有效,则移入移位寄存器,并接着移入其它位到移位寄存器。9个数据位移入之后,移位寄存器的内容被分别装入SBUF和RB8中,但必须满足下列条件:
(1) RI = 0
(2) SM2 = 0或者接收的第9位= 1
如果这些条件被满足,那么第9位移入RB8,8位数据移入SBUF。但还需要检测停止位,只有停止位为1,才能置位RI,如果停止位为0,则RI不会置位。
三、波特率
UART 自带一个波特率发生器,它实质上就是一个 16 位递增计数器。波特率公式如下:
Baud = Fcpu/16 / (65536−SBRT) ,SBRT = [SBRTH : SBRTL]
例如:设置SBRT = [SBRTH : SBRTL] = 0xFFE6,系统Fcpu=4M模式下
那么波特率 = Fcpu/16/(65536−SBRT)=4000000/16/(65536-65510)=9615约等于9600。
四、收发数据过程中可能遇到的错误
1、帧出错检测
3个错误标志位被置位后,只能通过软件清零,尽管后续接收的帧没有任何错误也不会自动清零。
2、发送冲突
如果在一个发送正在进行时,用户软件写数据到SBUF寄存器时,发送冲突位(TXCOL位)置1。如果发生了冲突,新数据会被忽略,不能被写入发送缓冲器(即不影响传送)。
3、接收溢出
RI置1,接收缓冲器中的数据未被读取,RI被清0,又开始新的数据接收,若在新的数据接收完成前(RI置1)还未读取之前接收缓冲区中的数据,在那么接收溢出位(RXROV位)置位。如果发生了接收溢出,接收缓冲器中原来的数据不影响,后面的数据则丢失。
4、帧出错
如果检测到一个无效(低)停止位,那么帧出错位(FE位)置1。
五、和UART有关的寄存器
1、控制寄存器 SCON、SCON2
1.1 SCON
1.2 SCON2
2、数据缓冲寄存器 SBUF
3、波特率发生器 BRTL、BRTH
六、针对不同封装的芯片,UART用管脚设置
对于TSSOP20脚封装的HC18M003,
可以被使用的管脚如下:
TX: PB6,PA0,PC0,PD4
RX: PB7,PA7,PC2
我们在使用IIC时,已经预定使用PC0和PC2,所以,测试UART时,准备使用PB6和PB7作为串口的通讯管脚。
设置管脚时,需要使用特殊寄存器:端口通讯端口映射寄存器UARTMAP和端口映射寄存器 INTMAP。
1、端口通讯端口映射寄存器UARTMAP
注意:(1)、TXD 映射部分寄存器位于 INTMAP 寄存器之B5、B4位。
(2)、配置完成映射后,需要用户手动配置 IO 状态。
2、端口映射寄存器 INTMAP