第17 章 uart - microchip technologyww1.microchip.com/downloads/cn/devicedoc/70188c_cn.pdf注:...

42
© 2009 Microchip Technology Inc. DS70188C_CN 17-1 UART 17 17 UART 目录 本章包括下列主题: 17.1 简介 ............................................................................................................................. 17-2 17.2 控制寄存器 .................................................................................................................. 17-3 17.3 UART 波特率发生器 .................................................................................................. 17-10 17.4 UART 配置 ................................................................................................................ 17-12 17.5 UART 发送器 ............................................................................................................. 17-13 17.6 数据位检测 ................................................................................................................ 17-18 17.7 UART 接收器 ............................................................................................................. 17-19 17.8 使用 UART 进行 9 位通信 ......................................................................................... 17-23 17.9 UART 的其他特性 ..................................................................................................... 17-25 17.10 使用 DMA UART 操作 ........................................................................................... 17-27 17.11 CPU 休眠和空闲模式下的 UART 操作 ...................................................................... 17-30 17.12 UxCTS UxRTS 控制引脚的操作 ........................................................................... 17-31 17.13 红外支持 .................................................................................................................... 17-33 17.14 LIN 支持 .................................................................................................................... 17-36 17.15 寄存器映射 ................................................................................................................ 17-38 17.16 设计技巧 .................................................................................................................... 17-39 17.17 相关应用笔记 ............................................................................................................ 17-40 17.18 版本历史 .................................................................................................................... 17-41

Upload: others

Post on 06-Jul-2020

43 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UART

UA

RT

17

目录

本章包括下列主题:

17.1 简介 ............................................................................................................................. 17-217.2 控制寄存器 .................................................................................................................. 17-317.3 UART 波特率发生器 .................................................................................................. 17-1017.4 UART 配置 ................................................................................................................ 17-1217.5 UART 发送器 ............................................................................................................. 17-1317.6 数据位检测 ................................................................................................................ 17-1817.7 UART 接收器 ............................................................................................................. 17-1917.8 使用 UART 进行 9 位通信 ......................................................................................... 17-2317.9 UART 的其他特性 ..................................................................................................... 17-2517.10 使用 DMA 的 UART 操作 ........................................................................................... 17-2717.11 CPU 休眠和空闲模式下的 UART 操作 ...................................................................... 17-3017.12 UxCTS 和 UxRTS 控制引脚的操作 ........................................................................... 17-3117.13 红外支持 .................................................................................................................... 17-3317.14 LIN 支持 .................................................................................................................... 17-3617.15 寄存器映射 ................................................................................................................ 17-3817.16 设计技巧 .................................................................................................................... 17-3917.17 相关应用笔记 ............................................................................................................ 17-4017.18 版本历史 .................................................................................................................... 17-41

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-1 页

Page 2: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

17.1 简介

通用异步收发器(Universal Asynchronous Receiver Transmitter,UART)模块是 dsPIC33F 器件系列提供的串行 I/O 模块之一。UART 是可以与外设和个人计算机(使用 RS-232、RS-485、LIN 和 IrDA® 等协议)通信的全双工异步通信通道。模块还通过 UxCTS 和 UxRTS 引脚支持硬件流控制选项,其中还包括 IrDA 编码器和解码器。

UART 模块的主要特性有:

• 通过 UxTX 和 UxRX 引脚进行全双工 8 位或 9 位数据传输

• 偶校验、奇校验或无奇偶校验选项(对于 8 位数据)

• 一个或两个停止位

• 硬件自动波特率特性

• 通过 UxCTS 和 UxRTS 引脚支持硬件流控制选项

• 完全集成的波特率发生器,具有 16 位预分频器

• 当器件工作在 40 MIPS 时,波特率范围从 10 Mbps 到 38 bps• 4 级深度先进先出(First-In-First-Out, FIFO)发送数据缓冲区

• 4 级深度 FIFO 接收数据缓冲区

• 奇偶校验、帧和缓冲区溢出错误检测

• 支持带地址检测的 9 位模式 (第 9 位 = 1)• 发送和接收中断

• 用于诊断支持的环回模式

• IrDA 编码器和解码器逻辑

• LIN 总线支持

• 用于支持外部 IrDA 编码器 / 解码器的 16x 波特率时钟输出

图 17-1 给出了 UART 的简化框图。 UART 模块由以下主要硬件元件组成:

• 波特率发生器

• 异步发送器

• 异步接收器

图 17-1: UART 简化框图

注: 每个不同的 dsPIC33F 系列器件型号可能具有一个或多个 UART 模块。在引脚、控制 / 状态位和寄存器的名称中使用的“x”表示特定的 UART 模块编号。更多详细信息,请参见具体器件数据手册。

波特率发生器

UxRX

硬件流控制

UARTx 接收器

UARTx 发送器 UxTX

UxCTS

UxRTS

BCLKxIrDA®

DS70188C_CN 第 17-2 页 © 2009 Microchip Technology Inc.

Page 3: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.2 控制寄存器

本节概述控制 UART 模块操作的每个寄存器的具体功能:

• UxMODE:UARTx 模式寄存器

- 使能或禁止 UART 模块

- 使能或禁止 IrDA 编码器和解码器

- 使能或禁止 WAKE、 ABAUD 和环回特性

- 使能或禁止 UxRTS 和 UxCTS 引脚

- 将 UxRTS 引脚配置为所需的工作模式

- 配置 UxRx 引脚的极性

- 选择波特率的类型

- 选择数据位数、奇偶校验和停止位

• UxSTA:UARTx 状态和控制寄存器

- 选择发送中断模式

- 选择接收中断模式

- 使能或禁止 UART 传输

- 控制地址检测模式

- 指示各种状态条件,如发送和接收缓冲区状态、奇偶校验错误、帧错误和溢出错误

• UxRXREG:UARTx 接收寄存器

- 存储已接收的数据

• UxTXREG:UARTx 发送寄存器 (只写)

- 提供要发送的数据

• UxBRG:UARTx 波特率寄存器

- 存储已发送或接收数据的波特率值

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-3 页

Page 4: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

寄存器 17-1: UxMODE:UARTx 模式寄存器

R/W-0 U-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R/W-0UARTEN — USIDL IREN(1) RTSMD — UEN<1:0>

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0WAKE LPBACK ABAUD URXINV BRGH PDSEL<1:0> STSEL

bit 7 bit 0

图注:

R = 可读位 W = 可写位 U = 未实现位,读为 0-n = POR 时的值 1 = 置 1 0 = 清零 x = 未知

bit 15 UARTEN:UARTx 使能位

1 = 使能 UARTx ; UARTx 根据 UEN<1:0> 和 UTXEN 控制位的定义控制 UARTx 引脚0 = 禁止 UARTx ;由相应的 PORT、 LAT 和 TRIS 位控制 UARTx 引脚

bit 14 保留

bit 13 USIDL:空闲模式停止位

1 = 当器件进入空闲模式时,模块停止工作0 = 在空闲模式下模块继续工作

bit 12 IREN:IrDA 编码器和解码器使能位 (1)

1 = 使能 IrDA 编码器和解码器0 = 禁止 IrDA 编码器和解码器

bit 11 RTSMD:UxRTS 引脚模式选择位

1 = UxRTS 处于单工模式0 = UxRTS 处于流控制模式

bit 10 保留

bit 9-8 UEN<1:0>:UARTx 使能位

11 = 使能并使用 UxTX、 UxRX 和 BCLKx 引脚; UxCTS 引脚由端口锁存器控制10 = 使能并使用 UxTX、 UxRX、 UxCTS 和 UxRTS 引脚01 = 使能并使用 UxTX、 UxRX 和 UxRTS 引脚; UxCTS 引脚由端口锁存器控制00 = 使能并使用 UxTX 和 UxRX 引脚; UxCTS、 UxRTS 和 BCLKx 引脚由端口锁存器控制

bit 7 WAKE:在休眠模式下检测到启动位唤醒使能位

1 = 使能唤醒0 = 禁止唤醒

bit 6 LPBACK:UARTx 环回模式选择位

1 = 使能环回模式0 = 禁止环回模式

bit 5 ABAUD:自动波特率使能位

1 = 使能对下一个字符的波特率测量。需要接收同步字段(55h);完成时由硬件清零。0 = 禁止波特率测量或测量已完成

bit 4 URXINV:接收极性翻转位

1 = UxRX 的空闲状态为 00 = UxRX 的空闲状态为 1

注 1:此功能只能在低速模式(BRGH = 0)下使用。详细信息,请参见具体器件数据手册。

DS70188C_CN 第 17-4 页 © 2009 Microchip Technology Inc.

Page 5: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

bit 3 BRGH:高波特率选择位

1 = 高速0 = 低速

bit 2-1 PDSEL<1:0>:奇偶校验和数据选择位

11 = 9 位数据,无奇偶校验10 = 8 位数据,奇校验01 = 8 位数据,偶校验00 = 8 位数据,无奇偶校验

bit 0 STSEL:停止选择位

1 = 2 个停止位0 = 1 个停止位

寄存器 17-1: UxMODE:UARTx 模式寄存器 (续)

注 1:此功能只能在低速模式(BRGH = 0)下使用。详细信息,请参见具体器件数据手册。

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-5 页

Page 6: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

寄存器 17-2: UxSTA:UARTx 状态和控制寄存器

R/W-0 R/W-0 R/W-0 U-0 R/W-0 R/W-0 R-0 R-1UTXISEL1 UTXINV UTXISEL0 — UTXBRK UTXEN UTXBF TRMT

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R-1 R-0 R-0 R/C-0 R-0URXISEL<1:0> ADDEN RIDLE PERR FERR OERR URXDA

bit 7 bit 0

图注: C = 可清零位

R = 可读位 W = 可写位 U = 未实现位,读为 0-n = POR 时的值 1 = 置 1 0 = 清零 x = 未知

bit 15,13 UTXISEL<1:0> 发送中断模式选择位

11 = 保留10 = 当一个字符被传输到发送移位寄存器并且发送缓冲区变为空时,产生中断01 = 当 后一次发送完成(即, 后一个字符被移出发送移位寄存器)并且所有发送操作均完成时,

产生中断00 = 当任意字符被传输到发送移位寄存器(这意味着发送缓冲区中至少有一个单元为空)时产生中断

bit 14 UTXINV:发送极性翻转位

1 = UxTX 的空闲状态为 10 = UxTX 的空闲状态为 0

bit 12 未实现:读为 0

bit 11 UTXBRK:发送间隔位

1 = 无论发送器状态如何,都将 UxTX 引脚驱动为低电平(同步间隔发送——启动位后跟随 12 个 0,之后跟随 1 个停止位)

0 = 禁止或已完成同步间隔字符的发送

bit 10 UTXEN:发送使能位

1 = 使能 UARTx 发送器,由 UARTx 控制 UxTX 引脚 (如果 UARTEN = 1)0 = 禁止 UARTx 发送器;中止所有等待的发送,缓冲区复位;由端口控制 UxTX 引脚

bit 9 UTXBF:发送缓冲区满状态位(只读)

1 = 发送缓冲区已满0 = 发送缓冲区未满;至少还可写入一个或多个数据字

bit 8 TRMT:发送移位寄存器空位 (只读)

1 = 发送移位寄存器为空,同时发送缓冲区为空(即,上一次发送已完成)0 = 发送移位寄存器非空;发送在进行中或在发送缓冲区中排队

bit 7-6 URXISEL<1:0>:接收中断模式选择位

11 = 当接收缓冲区满(即,有 4 个数据字符)时,中断标志位置 110 = 当接收缓冲区 3/4 满(即,有 3 个数据字符)时,中断标志位置 10x = 当接收到一个字符时,中断标志位置 1

bit 5 ADDEN:地址字符检测位(接收数据的 bit 8 = 1)1 = 使能地址检测模式。如果没有选择 9 位模式,该控制位无效。0 = 禁止地址检测模式

bit 4 RIDLE:接收器空闲位(只读)

1 = 接收器空闲0 = 正在接收数据

DS70188C_CN 第 17-6 页 © 2009 Microchip Technology Inc.

Page 7: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

bit 3 PERR:奇偶校验错误状态位 (只读)

1 = 检测到当前字符的奇偶校验错误0 = 未检测到奇偶校验错误

bit 2 FERR:帧错误状态位(只读)

1 = 检测到当前字符的帧错误0 = 未检测到帧错误

bit 1 OERR:接收缓冲区溢出错误状态位 (清零 / 只读)

1 = 接收缓冲区已溢出0 = 接收缓冲区未溢出。(清零原来置 1 的 OERR 位将使接收缓冲区和 RSR 复位为空状态。)

bit 0 URXDA:接收缓冲区中是否有数据标志位(只读)

1 = 接收缓冲区中有数据;有至少一个或多个字符可被读取0 = 接收缓冲区为空

寄存器 17-2: UxSTA:UARTx 状态和控制寄存器 (续)

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-7 页

Page 8: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

寄存器 17-3: UxRXREG:UARTx 接收寄存器

U-0 U-0 U-0 U-0 U-0 U-0 U-0 R-0— — — — — — — URX8

bit 15 bit 8

R-0 R-0 R-0 R-0 R-0 R-0 R-0 R-0URX<7:0>

bit 7 bit 0

图注:

R = 可读位 W = 可写位 U = 未实现位,读为 0-n = POR 时的值 1 = 置 1 0 = 清零 x = 未知

bit 15-9 未实现:读为 0

bit 8 URX8:已接收字符的 bit 8 数据位(在 9 位模式下)

bit 7-0 URX<7:0>:已接收字符的 bit 7-0 数据位

寄存器 17-4: UxTXREG:UARTx 发送寄存器 (只写)

U-0 U-0 U-0 U-0 U-0 U-0 U-0 W-x— — — — — — — UTX8

bit 15 bit 8

W-x W-x W-x W-x W-x W-x W-x W-xUTX<7:0>

bit 7 bit 0

图注:

R = 可读位 W = 可写位 U = 未实现位,读为 0-n = POR 时的值 1 = 置 1 0 = 清零 x = 未知

bit 15-9 未实现:读为 0

bit 8 UTX8:已发送字符的 bit 8 数据位 (在 9 位模式下)

bit 7-0 UTX<7:0>:已发送字符的 bit 7-0 数据位

DS70188C_CN 第 17-8 页 © 2009 Microchip Technology Inc.

Page 9: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

寄存器 17-5: UxBRG:UARTx 波特率寄存器

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 W-xBRG<15:8>

bit 15 bit 8

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0BRG<7:0>

bit 7 bit 0

图注:

R = 可读位 W = 可写位 U = 未实现位,读为 0-n = POR 时的值 1 = 置 1 0 = 清零 x = 未知

bit 15-0 BRG<15:0>:波特率分频比位

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-9 页

Page 10: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

17.3 UART 波特率发生器

UART 模块包含一个专用的 16 位波特率发生器(Baud Rate Generator,BRG)。UxBRG 寄存器控制一个自由运行的 16 位定时器的周期。公式 17-1 给出了 BRGH = 0时计算波特率的公式。

公式 17-1: UART 波特率 (BRGH = 0)

例 17-1 给出了如下条件下的波特率误差计算:

• FCY = 4 MHz• 目标波特率 = 9600

例 17-1: 波特率误差计算(BRGH = 0)

大可能波特率(BRGH = 0)是FCY/16(当UxBRG = 0时), 小可能波特率是FCY/(16 * 65536)。

公式 17-2 给出了 BRGH = 1时计算波特率的公式。

注: FCY表示指令周期时钟频率 (FOSC/2)。

波特率FCY

16 UxBRG 1+( )×----------------------------------------------=

UxBRGFCY

16 波特率×------------------------------ 1–=

......(1)

......(2)

目标波特率FCY

16 UxBRG 1+( )×----------------------------------------------=

求解 UxBRG 值:

UxBRGFCY 目标波特率⁄

16-------------------------------------------- 1–=

计算波特率 400000016 25 1+( )×--------------------------------=

ŒÛðÓ 计算波特率 目标波特率–目标波特率

------------------------------------------------------------------=

9615 9600–9600

------------------------------=

0.16%=

4000000 9600⁄16

------------------------------------- 1–⎝ ⎠⎛ ⎞=

25=

......(1)

......(2)

9615=

误差

DS70188C_CN 第 17-10 页 © 2009 Microchip Technology Inc.

Page 11: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

公式 17-2: UART 波特率 (BRGH = 1)

大可能波特率(BRGH = 1)是FCY/4(当UxBRG = 0时), 小可能波特率是FCY/(4 * 65536)。

向 UxBRG 寄存器写入新值会使 BRG 定时器复位(清零)。这可以确保 BRG 无需等待定时器溢出就可以产生新的波特率。

17.3.1 BCLKx 输出

如果使能了 UART 和 BCLKx 输出(UEN<1:0> = 11),则 BCLKx 引脚将输出 16x 波特率时钟。此功能用于支持外部 IrDA 编码器 / 解码器(见图 17-2)。在休眠模式下,BCLKx 输出保持高电平。只要 UART 保持在该模式(UEN<1:0> = 11),则无论 PORTx 和 TRISx 锁存位状态如何,BCLKx 都强制为输出。

图 17-2: BCLKx 输出与 UxBRG 编程

注: FCY表示指令周期时钟频率。

波特率FCY

4 UxBRG 1+( )×-------------------------------------------=

UxBRGFCY

4 波特率×--------------------------- 1–=

......(1)

......(2)

(N + 1)Tcy

Tcy

BCLKx(BRG = 0)

BCLKx(BRG = 1)

BCLKx(BRG = 2)

BCLKx(BRG = 3)

BCLKx(BRG = 4)

BCLKx(BRG = N)

UxTX

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-11 页

Page 12: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

17.4 UART 配置

UART 使用标准的不归零(Non-Return-to-Zero,NRZ)格式(1 个启动位、8 或 9 个数据位和1 或 2 个停止位)。硬件提供奇偶校验,可由用户应用程序配置为偶校验、奇校验或无奇偶校验。

普通的数据格式是 8 位,无奇偶校验,有 1 个停止位(用 8, N, 1 表示),这是默认的(POR)设置。数据位数、停止位数以及奇偶校验均在 PDSEL<1:0> (UxMODE<2:1>)和 STSEL(UxMODE<0>)位中指定。片上专用的 16 位波特率发生器可用于由振荡器产生标准的波特率频率。UART 首先发送和接收 低有效位(Least Significant bit,LSb)。UART 模块的发送器和接收器在功能上是独立的,但使用相同的数据格式和波特率。

17.4.1 使能 UART通过将 UARTEN(UxMODE<15>)位和 UTXEN(UxSTA<10>)位置 1 来使能 UART 模块。一旦使能,UxTX和UxRX引脚就分别被配置为输出和输入,改写对应 I/O端口引脚的TRIS和PORT寄存器位设置。 UxTX 引脚在没有传输发生时处于逻辑 1状态。

17.4.2 禁止 UART通过清零 UARTEN(UxMODE<15>)位来禁止 UART 模块。这是任何复位后的默认状态。如果禁止了 UART,所有 UART 引脚在对应的 PORT 和 TRIS 位控制下用作端口引脚。

禁止 UART 模块会将缓冲区复位为空状态。缓冲区中的所有数据字符都将丢失,同时波特率计数器也将复位。

当 UART 模块被禁止时,所有与之相关的错误和状态标志都将复位。URXDA、OERR、FERR、PERR、UTXEN、UTXBRK 和 UTXBF 位被清零,而 RIDLE 和 TRMT 位被置 1。其他控制位(包括 ADDEN、URXISEL<1:0> 和 UTXISEL<1:0>)以及 UxMODE 和 UxBRG 寄存器均不受影响。

当 UART 处于活动状态时,清零 UARTEN 位将中止所有等待的发送和接收,同时如以上所述那样将模块复位。重新使能 UART 将使用同样的配置重新启动 UART。

注: 在 UARTEN 位置 1 之前,不应将 UTXEN 位置 1 ;否则,将无法使能 UART 发送。

DS70188C_CN 第 17-12 页 © 2009 Microchip Technology Inc.

Page 13: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.5 UART 发送器

图 17-3 给出了 UART 发送器框图。发送器的核心是发送移位(UxTSR)寄存器。该移位寄存器从发送 FIFO 缓冲区 UxTXREG 获取数据。通过软件将数据装入 UxTXREG 寄存器。在前一次装入数据的停止位发送前,不会向 UxTSR 寄存器装入新数据。一旦停止位发送完毕,就会将UxTXREG 寄存器中的新数据(如果有)装入 UxTSR。

图 17-3: UART 发送器框图

通过将 UTXEN 使能位(UxSTA<10>)置 1 来使能发送。实际的发送要到 UxTXREG 寄存器装入了数据并且波特率发生器(UxBRG)产生了移位时钟(图 17-3)后才发生。通常,第一次开始发送的时候,由于 UxTSR 寄存器为空,这样传输数据到 UxTXREG 寄存器会导致该数据立即传输到 UxTSR。发送期间清零 UTXEN 位将中止发送并复位发送器。因此,UxTX 引脚将回复到高阻抗状态。

若要选择 9 位发送, PDSEL<1:0> 位(UxMODE<2:1>)应设置为 11,第 9 位应写入 UTX8 位(UxTXREG<8>)。应向 UxTXREG 执行一次字写操作,这样可以同时写入所有的 9 位。

注: UxTSR 寄存器并未映射到数据存储器中,因此用户应用程序不能访问它。

只写字 写字或字节

UTX8 UxTXREG 低字节

装入 UxTSR

发送控制

– 控制 UxTSR– 控制缓冲区

– 产生标志

– 产生中断

UxTXIF

数据

(启动)

(停止)

奇偶校验奇偶校验发生器

发送移位寄存器(UxTSR)

÷ 16 分频器

控制信号

来自波特率发生器的 16x 波特率时钟

内部数据总线

UTXBRK

UxTX

注:“x”表示 UART 编号。

UxTX

UxMODE UxSTA

16

发送 FIFO

15 9 8 7 0

UxCTS

注: 在 9 位数据发送的情况下,不采用奇偶校验。

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-13 页

Page 14: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

器件复位时,UxTX 引脚被配置为输入;因此,UxTX 引脚的状态未定义。当 UART 模块使能时,发送引脚被驱动为高电平。它保持该状态,直到数据被写入发送缓冲区 (UxTXREG)。第一个数据被写入 UxTXREG 寄存器时,发送引脚立即被驱动为低电平。为确保启动位检测,建议在使能 UARTx (UARTEN = 1)和启动第一次发送之间留有一个延时。该延时依赖于波特率,应等于或大于发送一个数据位的时间。

图 17-4: UART 发送

17.5.1 发送缓冲区 (UxTXREG)

发送缓冲区有 9 位宽和 4 级深。算上发送移位 (UxTSR)寄存器,用户实际有一个 5 级深的缓冲区。它按先进先出(FIFO)的方式组织。一旦 UxTXREG 的内容被传输到 UxTSR 寄存器,当前缓冲单元就可以写入新的数据,下一个缓冲单元将成为 UxTSR 寄存器的数据源。每当缓冲区满时,UTXBF(UxSTA<9>)状态位就会置 1。如果用户应用程序试图向已满的缓冲区执行写操作,则新数据将不会被 FIFO 接收。

FIFO 在任何器件复位时复位,但当器件进入节能模式或从节能模式唤醒时, FIFO 不受影响。

17.5.2 发送中断

发送中断标志 (UxTXIF)位于对应的中断标志状态 (IFS)寄存器中。 UTXISEL<1:0> 控制位(UxSTA<15,13>)决定 UART 何时产生发送中断。

1. 如果 UTXISEL<1:0> = 00,当一个字符从发送缓冲区传输到发送移位(UxTSR)寄存器时,UxTXIF 被置 1。这意味着发送缓冲区中至少有一个单元为空。

2. 如果 UTXISEL<1:0> = 01,当 后一个字符移出 UxTSR 寄存器时,UxTXIF 被置 1。这意味着所有发送操作都已完成。

3. 如果 UTXISEL<1:0> = 10,当一个字符传输到 UxTSR 寄存器并且发送缓冲区为空时,UxTXIF 被置 1。

当模块第一次使能时, UxTXIF 位被置 1。用户应用程序应在 ISR 中清零 UxTXIF 位。

工作期间可以在两种中断模式间切换。

UxTXIF 标志位指示 UxTXREG 寄存器的状态,而 TRMT(UxSTA<8>)位指示 UxTSR 的状态。TRMT 状态位是只读位,当 UxTSR 为空时被置 1。因为没有与此位关联的中断逻辑,所以用户应用程序必须查询此位以判断 UxTSR 是否为空。

注: 如果 UTXISEL<1:0> = 00,当 UTXEN 位置 1 时,UxTXIF 标志位也会置 1,因为发送缓冲区尚未满(可以向 UxTXREG 寄存器移入待发送数据)。

UxTX

1 2

B0 B1 B2 B3 B4 B5 B6 B7

位时间 = T软件延时

1. UART 模块被使能(UARTEN = 1)。

2. 数据被写入发送缓冲区 (UxTXREG)以开始发送。

DS70188C_CN 第 17-14 页 © 2009 Microchip Technology Inc.

Page 15: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.5.3 设置 UART 发送

请使用以下步骤设置发送:

1. 对 UxBRG 寄存器进行初始化,设置合适的波特率(见第 17.3 节“UART 波特率发生器”)。

2. 通过写入 PDSEL<1:0>(UxMODE<2:1>)和 STSEL(UxMODE<0>)位来设置数据位数、停止位数和奇偶校验选择。

3. 如果需要发送中断,就要将对应中断允许控制寄存器 (IEC)中的 UxTXIE 控制位置 1。

使用对应中断优先级控制寄存器(IPC)中的 UxTXIP<2:0> 控制位来指定发送中断的中断优先级。同时,通过写 UTXISEL<1:0> (UxSTA<15,13>)位来选择发送中断模式。

4. 通过将 UARTEN (UxMODE<15>)位置 1 来使能 UART 模块。

5. 通过将 UTXEN (UxSTA<10>)置 1 来使能发送,与此同时将 UxTXIF 位置 1。

UxTXIF 位应在 UART 发送中断服务程序中清零。 UxTXIF 位的操作由 UTXISEL<1:0> 控制位控制。

6. 将数据装入 UxTXREG 寄存器 (开始发送)。

如果选择了 9 位发送,则装入一个字。如果使用了 8 位发送,则装入一个字节。数据可以装入缓冲区,直到 UTXBF 状态位(UxSTA<9>)被置 1 为止。

例 17-2 提供了设置 UART 进行数据发送的示例代码。

图 17-5: 发送(8 位或 9 位数据)

图 17-6: 发送(背靠背)

注: 在 UARTEN 位置 1 之前,不应将 UTXEN 位置 1 ;否则,将无法使能 UART 发送。

字符 1停止位

字符 1 到发送移位寄存器

启动位 bit 0 bit 1 bit 7/8

写入 UxTXREG

BCLKx/16(移位时钟)

UxTX

UxTXIF

TRMT 位

UxTXIF 由用户用软件清零

字符 1

发送移位寄存器

写入 UxTXREG

BCLKx/16(移位时钟)

UxTX

UxTXIF

TRMT 位

字符 1 字符 2

字符 1 到 字符 2 到

启动位 停止位 启动位

发送移位寄存器

字符 1 字符 2bit 0 bit 1 bit 7/8 bit 0

注:此时序图表示的是两次连续的发送。

(UTXISEL<1:0> = 00)

UxTXIF(UTXISEL<1:0> = 10)

UxTXIF 由用户用软件清零

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-15 页

Page 16: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

例 17-2: UART 发送与中断

#define FCY 40000000#define BAUDRATE 9600#define BRGVAL ((FCY/BAUDRATE)/16)-1unsigned int i;

int main(void){

// Configure Oscillator to operate the device at 40Mhz// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2// Fosc= 8M*40(2*2)=80Mhz for 8M input clock

PLLFBD=38; // M=40CLKDIVbits.PLLPOST=0; // N1=2CLKDIVbits.PLLPRE=0; // N2=2OSCTUN=0; // Tune FRC oscillator, if FRC is usedRCONbits.SWDTEN=0; // Disable Watch Dog Timer

while(OSCCONbits.LOCK!=1) {}; // Wait for PLL to lock

U1MODEbits.STSEL = 0; // 1-stop bitU1MODEbits.PDSEL = 0; // No Parity, 8-data bitsU1MODEbits.ABAUD = 0; // Auto-Baud DisabledU1MODEbits.BRGH = 0; // Low Speed mode

U1BRG = BRGVAL; // BAUD Rate Setting for 9600

U1STAbits.UTXISEL0 = 0; // Interrupt after one Tx character is transmittedU1STAbits.UTXISEL1 = 0;

IEC0bits.U1TXIE = 1; // Enable UART Tx interrupt

U1MODEbits.UARTEN = 1; // Enable UARTU1STAbits.UTXEN = 1; // Enable UART Tx

/* wait at least 104 usec (1/9600) before sending first char */for(i = 0; i < 4160; i++){ Nop();}

U1TXREG = 'a'; // Transmit one character

while(1){}

}

void __attribute__((__interrupt__)) _U1TXInterrupt(void){ IFS0bits.U1TXIF = 0; // clear TX interrupt flag U1TXREG = 'a'; // Transmit one character}

DS70188C_CN 第 17-16 页 © 2009 Microchip Technology Inc.

Page 17: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.5.4 间隔字符的发送

间隔字符发送包含 1 个启动位,随后的 12 个 0位和 1 个停止位。在发送移位寄存器中装有数据时,只要 UTXBRK 和 UTXEN 位置 1,就会发送帧间隔字符。必须对 UxTXREG 寄存器进行假写操作,才能启动间隔字符发送。请注意,在发送间隔字符时写入 UxTXREG 寄存器的数据值会被忽略。写操作通过发送全 0来启动适当的序列。

在发送了对应的停止位后,硬件会自动将 UTXBRK 位复位。这样用户应用程序可以在间隔字符(在 LIN 规范中通常是同步字符)后预先将下一个要发送字节装入发送 FIFO。

TRMT 位指示发送移位寄存器是空还是满,正如其在正常发送操作中一样。图 17-7 给出了发送间隔字符的时序。

图 17-7: 发送间隔字符序列

17.5.4.1 间隔和同步发送序列

以下序列会发送一个报文帧头,包括一个间隔字符和其后的一个自动波特率同步字节。此序列适用于典型的 LIN 总线主器件。

1. 将 UART 配置为所需的模式。

2. 将 UTXEN 和 UTXBRK 置 1 以发送间隔字符。

3. 将一个无效字符装入 UxTXREG 以启动发送 (值被忽略)。

4. 向 UxTXREG 写入 0x55——将同步字符装入发送 FIFO 中。

间隔字符发送后,硬件会将 UTXBRK 位复位。然后发送同步字符。

注: 在将 UTXBRK 置 1 之前,用户应用程序应先等待发送器变为空闲 (TRMT = 1)。UTXBRK 会覆盖所有其他发送器活动。如果用户应用程序在序列完成之前清零TXBRK 位,则可能导致意外的模块行为。发送间隔字符不会产生发送中断。

写入 UxTXREG

启动位 bit 0 bit 1 bit 11 停止位

间隔

UxTX

TRMT 位

UTXBRK 在此时采样 自动清零

UTXBRK 位

UxTXIF

BCLKx/16(移位时钟)

假写

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-17 页

Page 18: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

17.6 数据位检测

17.6.1 16X 时钟模式 (BRGH = 0)在 16x 时钟模式下,接收数据的每个位的宽度都是 16 个时钟脉冲。为检测传入数据位的值,会在时钟的第 7、第 8 和第 9 个上升沿采样该位。这些上升沿称为择多检测边沿(Majority DetectionEdge)。该模式比 4x 时钟模式更稳健。

图 17-8: 带择多检测的 16x 时钟模式

17.6.2 4X 时钟模式 (BRGH = 1)在 4x 时钟模式下,接收数据的每个位的宽度都是 4 个时钟脉冲。4X 时钟模式不能提供足够多的边沿来支持择多检测方法。因此,将在 1/2 位宽处采样接收到的数据。

图 17-9: 不带择多检测的 4x 时钟模式

.

注: 在 16x 时钟模式下,每个位都在时钟的第 7、第 8 和第 9 个上升沿采样。

空闲 启动位 Bit 0

MD2

MD3MD1

检测到启动位

16x 时钟

位时钟

内部位计数器(已接收数据)

启动位 Bit 0 Bit 1

采样点

4x 时钟

位时钟

内部位计数器

接收

注: 在 4x 时钟模式下,采样将只发生在 1/2 位宽处。

DS70188C_CN 第 17-18 页 © 2009 Microchip Technology Inc.

Page 19: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.7 UART 接收器

图 17-10 给出了接收器的框图。接收器的核心是接收(串行)移位(UxRSR)寄存器。在 UxRX引脚上接收数据,并发送到数据恢复模块中。数据恢复模块以 16 倍波特率工作,而主接收串行移位器以波特率工作。在采样到 UxRX 引脚上的停止位后, UxRSR 中接收到的数据传输到接收FIFO (如果为空)。

择多检测电路对UxRX引脚上的数据采样多次,以判定UxRX引脚上出现的是高电平还是低电平。

17.7.1 接收缓冲区 (UxRXREG)

UART 接收器有一个 4 级深、 9 位宽的 FIFO 接收数据缓冲区。 UxRXREG 是一个存储器映射的寄存器,可提供对 FIFO 输出的访问。在缓冲区溢出发生之前,可以有 4 个字的数据被接收并传输到 FIFO,从第 5 个字开始将数据移入 UxRSR 寄存器中。

17.7.2 接收器错误处理

如果 FIFO 已满(4 个字符),而第 5 个字符已被完全接收到 UxRSR 寄存器中,则溢出错误OERR (UxSTA<1>)位将被置 1。 UxRSR 中的字将被保留,但是只要 OERR 位置 1,就将禁止继续向接收 FIFO 传输。用户应用程序必须用软件清零 OERR 位,以允许继续接收数据。

如果需要保存溢出前接收到的数据,用户应用程序应先读所有 5 个字符,然后清零 OERR 位。如果这 5 个字符可以丢弃,则用户应用程序只要清零 OERR 位即可。这可有效地复位接收 FIFO,同时先前接收到的所有数据都将丢失。

如果检测到停止位为逻辑低电平,则帧错误位 FERR (UxSTA<2>)将被置 1。

如果检测到缓冲区顶部的数据字(即,当前的字)有奇偶校验错误,则奇偶校验错误位 PERR(UxSTA<3>)将被置 1。例如,如果奇偶校验设置为偶校验,但检测出数据中 1的总数为奇,就会产生奇偶校验错误。PERR 位在 9 位模式下是无关的。FERR 和 PERR 位与对应的字一起被缓冲,并且应在读取数据字之前读出。

如果发生了这些错误(OERR、FERR 和 PERR)中的任意错误,则会产生中断。用户应用程序需要允许对应的中断允许控制位(IEC4<UxERIE>)才能跳转到对应的中断向量单元。

17.7.3 接收中断

UART 接收中断标志 (UxRXIF)位于对应的中断标志状态(IFS)寄存器中。 URXISEL<1:0>(UxSTA<7:6>)控制位决定 UART 接收器何时产生中断。

a) 如果 URXISEL<1:0> = 00 或 01,每当一个数据字从接收移位 (UxRSR)寄存器传输到接收缓冲区,就会产生中断。接收缓冲区中可能有一个或多个字符。

b) 如果 URXISEL<1:0> = 10,当一个字从 UxRSR 寄存器传输到接收缓冲区使接收缓冲区中有3 或 4 个字符时,产生中断。

c) 如果 URXISEL<1:0> = 11,当一个字从 UxRSR 寄存器传输到接收缓冲区使接收缓冲区中有4 个字符(即,缓冲区满)时,产生中断。

工作期间可以在三种中断模式间切换。

注: UxRSR 寄存器并未映射到数据存储器中,因此用户应用程序不能直接访问它。

注: 接收 FIFO 中的数据应在清零 OERR 位之前读出。当 OERR 清零时,FIFO 复位,这将导致缓冲区中的所有数据丢失。

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-19 页

Page 20: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

URXDA 和 UxRXIF 标志位指示 UxRXREG 寄存器的状态,而 RIDLE 位 (UxSTA<4>)指示UxRSR 寄存器的状态。 RIDLE 状态位是只读位,当接收器空闲(即, UxRSR 寄存器为空)时被置 1。因为没有与此位关联的中断逻辑,所以用户应用程序需要查询此位以判断 UxRSR 是否空闲。

URXDA 位(UxSTA<0>)指示接收缓冲区有数据还是为空。只要接收缓冲区中至少有一个可以读出的字符,该位就将置 1。 URXDA 是只读位。

图 17-10 给出了 UART 接收器的框图。

图 17-10: UART 接收器框图

URX8 UxRXREG 低字节

将 UxRSR 内容

UxMODE

接收缓冲区控制

– 产生标志

– 产生中断

UxRXIF

UxRX

· 启动位检测

接收移位寄存器

控制信号

来自波特率发生器的 16x 波特率时钟

UxSTA

– 移位数据字符

装入缓冲区

9

(UxRSR) PER

R

FER

R

· 奇偶校验· 停止位检测· 移位时钟产生· 唤醒逻辑

16内部数据总线

1

0

LPBACK来自 UxTX

15 9 8 7 0

只读字 读字或字节

BCLKx/UxRTS

UxCTSUEN 选择

BCLKx

UEN1 UEN0

÷ 16 分频器

UxRTS

UxCTS

注:“x”表示 UART 编号。

DS70188C_CN 第 17-20 页 © 2009 Microchip Technology Inc.

Page 21: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.7.4 设置 UART 接收

请使用以下步骤设置接收:

1. 对 UxBRG 寄存器进行初始化,设置合适的波特率(见第 17.3 节“UART 波特率发生器”)。

2. 通过写入 PDSEL<1:0>(UxMODE<2:1>)和 STSEL(UxMODE<0>)位来设置数据位数、停止位数和奇偶校验选择。

3. 如果需要中断,就要将对应中断允许控制(IEC)寄存器中的 UxRXIE 位置 1。

使用对应中断优先级控制寄存器(IPC)中的 UxRXIP<2:0> 控制位来指定中断的优先级。同时,通过写入 URXISEL<1:0> (UxSTA<7:6>)位来选择接收中断模式。

4. 通过将 UARTEN (UxMODE<15>)位置 1 来使能 UART 模块。

5. 接收中断取决于 URXISEL<1:0> 控制位的设置。

如果没有允许接收中断,用户应用程序可以查询 URXDA 位。UxRXIF 位应在 UART 接收中断服务程序中清零。

6. 从接收缓冲区中读取数据。

如果选择了 9 位发送,则读一个字;否则,读一个字节。每当缓冲区中有数据时,URXDA状态位(UxSTA<0>)就会被置 1。

例 17-3 提供了设置 UART 进行数据接收的示例代码。

图 17-11: UART 接收

图 17-12: UART 在接收溢出下的接收

启动位 bit 1bit 0 bit 7 bit 0停止

启动位 bit 7 停止

位UxRX

RIDLE 位

字符 1 到 UxRXREG

字符 2 到 UxRXREG

注:此时序图显示了在 UxRX 输入引脚上接收了 2 个字符。

UxRXIF(URXISEL<1:0> = 0x)

启动位 bit 7/8bit 1bit 0 bit 7/8 bit 0停止

启动位

启动位bit 7/8 停止

位UxRX

OERR 位

RIDLE 位

字符 1、2、3 和 4存储在接收 FIFO 中

字符 5保存在 UxRSR 中

停止位

字符 1 字符 2、3、4 和 5 字符 6

OERR 由用户用软件清零

注:该图显示了用户无需读取输入缓冲区即可接收 6 个字符。第 5 个接收到的字符保存在接收移位寄存器中。第 6 个字符开始时,发生溢出错误。

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-21 页

Page 22: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

例 17-3: UART 接收与查询 (禁止中断)

#define FCY 40000000#define BAUDRATE 9600#define BRGVAL ((FCY/BAUDRATE)/16)-1

int main(void){

// Configure Oscillator to operate the device at 40Mhz// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2// Fosc= 8M*40(2*2)=80Mhz for 8M input clock

PLLFBD=38; // M=40CLKDIVbits.PLLPOST=0; // N1=2CLKDIVbits.PLLPRE=0; // N2=2OSCTUN=0; // Tune FRC oscillator, if FRC is used

RCONbits.SWDTEN=0; // Disable Watch Dog Timer

while(OSCCONbits.LOCK!=1) {}; // Wait for PLL to lock

U1MODEbits.STSEL = 0; // 1-stop bitU1MODEbits.PDSEL = 0; // No Parity, 8-data bitsU1MODEbits.ABAUD = 0; // Auto-Baud DisabledU1MODEbits.BRGH = 0; // Low Speed mode

U1BRG = BRGVAL; // BAUD Rate Setting for 9600

U1STAbits.URXISEL = 0; // Interrupt after one RX character is received;

U1MODEbits.UARTEN = 1; // Enable UART

while(1){

char ReceivedChar;

/* check for receive errors */if(U1STAbits.FERR == 1){

continue;}

/* must clear the overrun error to keep uart receiving */if(U1STAbits.OERR == 1){

U1STAbits.OERR = 0;continue;

}

/* get the data */if(U1STAbits.URXDA == 1){

ReceivedChar = U1RXREG;}

}

DS70188C_CN 第 17-22 页 © 2009 Microchip Technology Inc.

Page 23: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.8 使用 UART 进行 9 位通信

在 9 位数据模式下,UART 接收器可用于进行多处理器通信。在 9 位数据模式下,当 ADDEN 位置 1 时,接收器可以在数据的第 9 位为 0时忽略数据。该功能可以在多处理器环境中使用。

17.8.1 多处理器通信

典型的多处理器通信协议会区别数据字节和地址 / 控制字节。一般的方法是使用第 9 个数据位来识别数据字节是地址还是数据信息。如果第 9 位置 1,数据就作为地址或控制信息处理。如果第9 位清零,接收到的数据字就作为和前面的地址 / 控制字节相关的数据处理。

协议操作如下:

• 主器件发送一个第 9 位置 1 的数据字。数据字包含从器件的地址。

• 通信链中的所有从器件接收地址字并检查从地址值。

• 被寻址的从器件将接收和处理主器件发送的后续数据字节。所有其他从器件将丢弃后续的数据字节,直到接收到新的地址字(第 9 位置 1)。

17.8.2 ADDEN 控制位

UART 接收器有一个地址检测模式,该模式允许接收器忽略第 9 位清零的数据字。这降低了中断开销,因为第 9 位清零的数据字不被缓冲。此功能通过将 ADDEN 位(UxSTA<5>)置 1 来使能。

要使用地址检测模式,UART必须配置为9位数据模式。当接收器配置为8位数据模式时,ADDEN位不起作用。

17.8.3 设置 9 位发送

除了 PDSEL<1:0> 位(UxMODE<2:1>)应设置为 11外,设置 9 位发送的过程与设置 8 位发送模式相同(见第 17.5.3 节“设置 UART 发送”)。

应对 UxTXREG 寄存器执行字写操作 (开始发送)。

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-23 页

Page 24: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

17.8.4 设置使用地址检测模式的 9 位接收

除了 PDSEL<1:0> 位(UxMODE<2:1>)应设置为 11外,设置 9 位接收的过程与设置 8 位接收模式类似(见第 17.7.4 节“设置 UART 接收”)。

应通过写入 URXISEL<1:0> (UxSTA<7:6>)位来配置接收中断模式。

使用地址检测模式的过程如下:

1. 将 ADDEN (UxSTA<5>)位置 1 以使能地址检测。确保 URXISEL 控制位配置为每接收一个字就产生一个中断。

2. 通过读 UxRXREG 寄存器检查每个 8 位地址,以确定器件是否被寻址。

3. 如果该器件没有被寻址,就丢弃接收到的字。

4. 如果该器件被寻址,应将ADDEN位清零以允许后续数据字节被读进接收缓冲区并中断CPU。

如果预计收到的是一个长数据包,则需要改变接收中断模式,以使中断之间可以缓冲多于一个的数据字节。

5. 当接收到 后的数据字节时,应将 ADDEN 位置 1 以便只允许地址字节被接收。

同样,确保 URXISEL 控制位配置为每接收一个字就产生一个中断。

图 17-13: 带地址检测的接收 (ADDEN = 1)

注: 如果使能了地址检测模式(ADDEN = 1), URXISEL<1:0> 控制位应配置为接收到每个字后就产生中断。每个接收到的数据字在接收后必须立即用软件检查地址是否匹配。

启动位 bit 1bit 0 bit 8 bit 0停止

启动位 bit 8 停止

UxRX(引脚)

读接收缓冲寄存器UxRXREG

UxRXIF(中断标志)

字 1UxRXREG

bit 8 = 0,数据字节 bit 8 = 1,地址字节

传输到接收 FIFO

注:此时序图显示了一个数据字节,后跟一个地址字节。该数据字节没有被读入 UxRXREG(接收缓冲区),

因为 ADDEN = 1并且 bit 8 = 0。

DS70188C_CN 第 17-24 页 © 2009 Microchip Technology Inc.

Page 25: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.9 UART 的其他特性

17.9.1 环回模式下的 UART将 LPBACK 位置 1 将使能环回模式,在该模式下,UxTX 输出在内部连接到 UxRX 输入。当配置为环回模式时, UxRX 引脚从内部 UART 接收逻辑断开。但是, UxTX 引脚仍正常工作。

要选择环回模式,请执行以下步骤:

1. 将 UART 配置为所需的工作模式。

2. 按第 17.5 节 “UART 发送器”中所述使能发送。

3. 设置 LPBACK = 1(UxMODE<6>)以使能环回模式。

环回模式取决于 UEN<1:0> 位,如表 17-1 所示。

表 17-1: 环回模式引脚功能

17.9.2 自动波特率支持

要允许系统确定所接收字符的波特率,可以使能 ABAUD 位。如果使能了自动波特率检测(ABAUD = 1),则每当接收到启动位时, UART 就会开始自动波特率测量序列。波特率计算采用自平均的方式。一旦 ABAUD 位置 1,BRG 计数器值将被清零并开始检测一个启动位;在这种情况下,启动位定义为高电平到低电平跳变后跟随一个低电平到高电平跳变。

在启动位之后,自动波特率功能需要接收一个 ASCII “U”(55h),以计算相应的比特率。为了尽量减少输入信号不对称造成的影响,测量时段内要包含一个高位和一个低位时间。在 UxRX 引脚的第 5 个上升沿,统计相应 BRG 总周期数的累计 BRG 计数器值被传输到 UxBRG 寄存器。ABAUD 位自动清零。如果用户应用程序在序列完成之前清零 ABAUD 位,则可能导致意外的模块行为。关于自动波特率检测序列的信息,请参见图 17-14。

UEN<1:0> 引脚功能, LPBACK = 1(1)

00 UxRX 输入连接到 UxTX ; UxTX 引脚工作; UxRX 引脚忽略; UxCTS/UxRTS未使用

01 UxRX 输入连接到 UxTX ; UxTX 引脚工作; UxRX 引脚忽略; UxRTS 引脚工作; UxCTS 未使用

10 UxRX 输入连接到 UxTX ; UxTX 引脚工作; UxRX 引脚忽略; UxRTS 引脚工作; UxCTS 输入连接到 UxRTS ; UxCTS 引脚忽略

11 UxRX 输入连接到 UxTX ; UxTX 引脚工作; UxRX 引脚忽略; BCLKx 引脚工作;UxCTS/UxRTS 未使用

注 1: 应在使能与 UART 模块相关的其他位之后,才将 LPBACK 设为 1。

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-25 页

Page 26: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

图 17-14: 自动波特率计算

在进行自动波特率序列时, UART 状态机保持在空闲状态。无论 URXISEL<1:0> 设置如何,UxRXIF 中断均设为在第 5 个 UxRX 上升沿产生。接收器 FIFO 不会被更新。

BRG 计数器

UxRX

ABAUD 位

bit 0 bit 1

BRG 时钟

启动位

自动清零由用户软件置 1

XXXXh 0000h

边沿 1bit 2 bit 3边沿 2

bit 4 bit 5边沿 3

bit 6 bit 7边沿 4

停止位

边沿 5

001Ch

BRG 寄存器 XXXXh 001Ch

UxRXIF

DS70188C_CN 第 17-26 页 © 2009 Microchip Technology Inc.

Page 27: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.10 使用 DMA 的 UART 操作

在某些 dsPIC33F 器件上,可以使用直接存储器访问 (Direct Memory Access, DMA)模块在CPU 和 UART 之间传输数据,而无需 CPU 协助。请参见具体的 dsPIC33F 器件数据手册,以查看您的特定器件上是否存在 DMA。关于 DMA 模块的更多信息,请参见《dsPIC33F 系列参考手册》中的第 22 章 “直接存储器访问 (DMA)”(DS70182)。

如果 DMA 通道与 UART 接收器关联,则每次有字符准备好可从 UART 移入 RAM 时, UART 都将发出 DMA 请求。DMA 将从 UxRXREG 寄存器向 RAM 传输数据,并在预定义的传输次数之后发出 CPU 中断。类似地,如果 DMA 通道与 UART 发送器关联,则 UART 将在每次成功发送后发出 DMA 请求。每次 DMA 请求后,DMA 将新数据传输到 UxTXREG 寄存器中,并在预定义的传输次数之后发出 CPU 中断。由于 DMA 通道是单向的,如果将 UART 模块用于接收和发送,则需要两个 DMA 通道。每个 DMA 通道都必须如表 17-2 中所示进行初始化:

表 17-2: UART 与 DMA 关联的 DMA 通道寄存器初始化

此外,UART 必须配置为对于接收或发送的每个字符产生中断。为使 UART 接收器对于接收的每个字符产生接收中断,必须将状态和控制(UxSTA)寄存器中的接收中断模式选择位(URXISEL<1:0>)设置为 00或 01。为使 UART 发送器对于发送的每个字符产生发送中断,必须将 UxSTA 寄存器中的发送中断模式选择位 (UTXISEL0 和 UTXISEL1)设置为 0。

当 UART 和 DMA 通道正确配置时, UART 接收器会在接收到数据时立即发出 DMA 请求。用户应用程序不需要执行任何特殊步骤来启动 DMA 传输。但是,UART 发送器会在 UART 和发送器使能时立即发出 DMA 请求。这意味着必须在使能 UART 和发送器之前先初始化并使能 DMA 通道和缓冲区。或者,可以在使能 DMA 通道之前先使能 UART 和 UART 发送器。这种情况下,UART 发送器的 DMA 请求将丢失,用户应用程序必须通过将 DMAxREQ 寄存器中的 FORCE 位置 1 来发出 DMA 请求,以启动 DMA 传输。

例 17-4 提供了用于在两个 DMA 通道帮助下进行 UART 接收和发送的示例代码。UART 从超级终端以 9600 bps 的速度接收和缓冲字符。接收到 8 个字符之后, UART 将它们发回(回送)超级终端。

为 UART 发送配置 DMA 通道 0 时,使用以下配置:

• 从 RAM 向 UART 传输数据• 单数据块模式• 带后递增的寄存器间接寻址• 使用单个缓冲区• 每个缓冲区传输 8 次• 传输字

为 UART 接收配置 DMA 通道 1 时,使用以下配置:

• 从 UART 向 RAM 连续传输数据• 带后递增的寄存器间接寻址• 使用两个“乒乓”缓冲区• 每个缓冲区传输 8 次• 传输字

外设与 DMA 关联

DMAxREQ寄存器的

IRQSEL<6:0> 位

要从外设读取的DMAxPAD 寄存器值

要向外设写入的DMAxPAD 寄存器值

UART1RX——UART1 接收器 0001011 0x0226 (U1RXREG) —UART1TX——UART1 发送器 0001100 — 0x0224 (U1TXREG)

UART2RX——UART2 接收器 0011110 0x0236 (U2RXREG) —UART2TX——UART2 发送器 0011111 — 0x0234 (U2TXREG)

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-27 页

Page 28: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

例 17-4: 使用 DMA 的 UART 接收和发送

设置 UART 进行接收和发送:

#define FCY 40000000#define BAUDRATE 9600#define BRGVAL ((FCY/BAUDRATE)/16)-1

U2MODEbits.STSEL = 0; // 1-stop bitU2MODEbits.PDSEL = 0; // No Parity, 8-data bitsU2MODEbits.ABAUD = 0; // Auto-Baud Disabled

U2BRG = BRGVAL;// BAUD Rate Setting for 9600

U2STAbits.UTXISEL0 = 0; // Interrupt after one Tx character is transmittedU2STAbits.UTXISEL1 = 0;U2STAbits.URXISEL = 0; // Interrupt after one RX character is received

U2MODEbits.UARTEN = 1; // Enable UARTU2STAbits.UTXEN = 1; // Enable UART Tx

设置 DMA 通道 0 在单数据块、单缓冲区模式下发送数据:

unsigned int BufferA[8] __attribute__((space(dma)));unsigned int BufferB[8] __attribute__((space(dma)));

DMA0CON = 0x2001; // One-Shot, Post-Increment, RAM-to-PeripheralDMA0CNT = 7; // 8 DMA requestsDMA0REQ = 0x001F; // Select UART2 Transmitter

DMA0PAD = (volatile unsigned int) &U2TXREG;DMA0STA = __builtin_dmaoffset(BufferA);

IFS0bits.DMA0IF = 0; // Clear DMA Interrupt FlagIEC0bits.DMA0IE = 1; // Enable DMA interrupt

设置 DMA 通道 1 在连续乒乓模式下接收数据:

DMA1CON = 0x0002; // Continuous, Ping-Pong, Post-Inc., Periph-RAMDMA1CNT = 7; // 8 DMA requestsDMA1REQ = 0x001E; // Select UART2 Receiver

DMA1PAD = (volatile unsigned int) &U2RXREG;DMA1STA = __builtin_dmaoffset(BufferA);DMA1STB = __builtin_dmaoffset(BufferB);

IFS0bits.DMA1IF = 0; // Clear DMA interruptIEC0bits.DMA1IE = 1; // Enable DMA interruptDMA1CONbits.CHEN = 1; // Enable DMA Channel

DS70188C_CN 第 17-28 页 © 2009 Microchip Technology Inc.

Page 29: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

例 17-4: 使用 DMA 的 UART 接收和发送(续)

设置 DMA 中断处理程序:

void __attribute__((__interrupt__)) _DMA0Interrupt(void){ IFS0bits.DMA0IF = 0;// Clear the DMA0 Interrupt Flag;}

void __attribute__((__interrupt__)) _DMA1Interrupt(void){

static unsigned int BufferCount = 0; // Keep record of which buffer contains Rx Data

if(BufferCount == 0) {

DMA0STA = __builtin_dmaoffset(BufferA);// Point DMA 0 to data// to be transmitted

}else{

DMA0STA = __builtin_dmaoffset(BufferB); // Point DMA 0 to data // to be transmitted

}

DMA0CONbits.CHEN = 1;// Enable DMA0 ChannelDMA0REQbits.FORCE = 1;// Manual mode:Kick-start the 1st transfer

BufferCount ^= 1;IFS0bits.DMA1IF = 0;// Clear the DMA1 Interrupt Flag}

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-29 页

Page 30: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

17.11 CPU 休眠和空闲模式下的 UART 操作

17.11.1 休眠模式下的 UART 操作

当器件进入休眠模式时,UART 模块的所有时钟源被关闭并保持逻辑 0状态。如果器件在 UART发送或接收操作过程中进入休眠模式,将中止操作, UART 引脚 (BCLKx、 UxRTS 和 UxTX)被驱动为默认状态。

在 UART 接收 (UxRX)引脚上检测到启动位时,如果 WAKE 位(UxMODE<7>)刚好在器件进入休眠模式前置 1,会将器件从休眠模式唤醒。在该模式下,如果允许了 UART 接收中断(UxRXIE),在 UART 接收引脚的下降沿会产生 UART 接收中断(UxRXIF)。

接收中断将器件从休眠状态唤醒,并且会发生以下情况:

• 如果为中断分配的优先级小于或等于当前的 CPU 优先级,则器件将被唤醒并从启动休眠模式的 PWRSAV 指令的下一条指令开始继续执行代码。

• 如果为中断源分配的优先级大于当前的 CPU 优先级,则器件将被唤醒并开始执行 CPU 异常处理。将从捕捉 ISR 的第一条指令开始执行代码。

发生唤醒事件后,在 UxRX 线上出现低电平到高电平跳变时, WAKE 位自动清零。

17.11.2 空闲模式下的 UART 操作

当器件进入空闲模式时,系统时钟源保持工作,但 CPU 停止执行代码。 UART 模式寄存器中的UART 空闲模式停止位 USIDL (UxMODE<13>)决定模块在空闲模式下是停止工作还是在空闲模式下继续工作。

• 如果 USIDL (UxMODE<13>) = 0,则模块在空闲模式下继续工作,提供完整的功能。

• 如果 USIDL (UxMODE<13>) = 1,则模块在空闲模式下停止工作。模块在空闲模式下停止工作时执行和在休眠模式下相同的功能(见第 17.11.1 节“休眠模式下的 UART 操作”)。

图 17-15: 休眠模式下的自动唤醒位(WAKE)时序

注 1:同步间隔(或唤醒信号)字符必须足够长,以便使选定振荡器有充足的时间起振并保证 UART 正确初始化。为确保 UART 及时唤醒,用户应用程序应读取 WAKE 位的值。如果该位清零,则说明 UART 可能未能及时准备就绪以接收下一个字符,可能需要将模块与总线重新同步。

2:在休眠模式下如果检测到启动位,则只有当 WAKE 位(UxMODE<7>)刚好在器件进入休眠模式前置 1 时,才会将器件唤醒。

OSC1

WAKE 位 (2)

UxRX

UxRXIF

休眠

注 1: 如果唤醒事件需要较长的振荡器预热时间,在系统时钟仍然有效时会发生 WAKE 位自动清零。该时序与 FCY 出现与否无关。

2: 当 WAKE 位有效时, UART 状态机保持在空闲模式下。

(注 1)

由用户软件置 1 自动清零

DS70188C_CN 第 17-30 页 © 2009 Microchip Technology Inc.

Page 31: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.12 UxCTS 和 UxRTS 控制引脚的操作

UxCTS(允许发送)和 UxRTS(请求发送)是与 UART 模块相关的两个由硬件控制的引脚。这两个引脚使 UART 可以工作于流控制和单工模式,第 17.12.2 节“流控制模式下的 UxRTS 功能”和第 17.12.3 节“单工模式下的 UxRTS 功能”分别详细说明了这两种模式。它们用于控制 UART与 DTE (数据终端设备)之间的发送和接收。

17.12.1 UxCTS 功能

在 UART 操作中,UxCTS 用作可以控制发送的输入引脚。该引脚由另一个器件(通常为个人计算机)控制。 UxCTS 引脚使用 UEN<1:0> 进行配置。当 UEN<1:0> = 10时, UxCTS 配置为输入。如果 UxCTS = 1,则发送器会装入发送移位寄存器中的数据,但不会启动发送。这使 DTE可以根据其需求通过控制器控制和接收数据。

UxCTS 引脚在发送数据改变的同时(即,在 16 倍波特率时钟开始时)进行采样。只有采样到UxCTS 为低电平时才会开始发送。 UxCTS 在内部使用 TCY 进行采样,这意味着 UxCTS 上的脉冲宽度应至少为 1 个 TCY。但是,这不能作为规范,因为 TCY 会随所使用的时钟不同而不同。

用户应用程序也可以通过读相关的端口引脚来读取 UxCTS 的状态。

17.12.2 流控制模式下的 UxRTS 功能

在流控制模式下, DTE 的 UxRTS 连接到 dsPIC33F 系列的 UxCTS, DTE 的 UxCTS 连接到dsPIC33F 系列的 UxRTS,如图 17-16 所示。 UxRTS 信号指示器件准备好接收数据。每当UEN<1:0> = 01或 10时,UxRTS 引脚就被驱动为输出。每当接收器准备好接收数据时,UxRTS引脚就变为有效(驱动为低电平)。当 RTSMD 位 = 0时(器件处于流控制模式时),UxRTS 引脚在接收缓冲区未满或 OERR 位未置 1 时驱动为低电平。当 RTSMD 位 = 0时,UxRTS 引脚在器件未准备好接收(即,接收缓冲区已满或正在进行移位时)时驱动为高电平。

由于 DTE 的 UxRTS 连接到 dsPIC33F 系列的 UxCTS,因此每当它准备好接收数据时, UxRTS就会将UxCTS驱动为低电平。当UxCTS变为低电平时,数据发送开始,如第17.12.1节“UxCTS功能”中所述。

17.12.3 单工模式下的 UxRTS 功能

在单工模式下,DCE的UxRTS连接到dsPIC33F系列的UxRTS,DCE的UxCTS连接到dsPIC33F系列的 UxCTS,如图 17-17 所示。在单工模式下, UxRTS 信号指示 DTE 已准备好发送。每当DCE 准备好接收发送数据时, DCE 就会通过有效的 UxCTS 对 UxRTS 信号作出答复。当 DTE接收到有效的 UxCTS 时,它将开始发送。

如图 17-18 所示, IEEE-485 系统中也使用单工模式来使能发送器。当 UxRTS 指示 DTE 准备好发送时, UxRTS 信号将使能驱动器。

每当 UEN<1:0> = 01或 10时,UxRTS 引脚就会被驱动为输出。当 RTSMD = 1时,每当有数据可发送时(TRMT = 0), UxRTS 就会变为有效(驱动为低电平)。当 RTSMD = 1时,在发送器为空时(TRMT = 1), UxRTS 就会变为无效(驱动为高电平)。

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-31 页

Page 32: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

图 17-16: DTE-DTE 的 UxRTS/UxCTS 流控制 (RTSMD = 0,流控制模式)

图 17-17: DTE-DCE 的 UxRTS/UxCTS 握手(RTSMD = 1,单工模式)

图 17-18: IEEE-485 系统的 UxRTS/UxCTS 总线使能 (RTSMD = 1)

UxRTS UxRTS

UxCTS UxCTS

DTE(通常为个人计算机)

DTE(通常为另一个系统或 dsPIC33F)

已准备好接收

如果允许,将进行发送

已准备好接收

如果允许,将进行发送

UxRTS UxRTS

UxCTS UxCTS

DTE(通常为 dsPIC33F)

DCE(通常为调制解调器)

是否可以发送?

UxRTS 有效,接收器准备就绪

如果允许,将进行发送 允许,请继续并发送

UxRTS

UxCTS

DTE(通常为 dsPIC33F)

是否可以发送?

如果允许,将进行发送

UxTX

UxRX

D

R

BA

TTL 至 RS-485收发器

集成的 CKT

DS70188C_CN 第 17-32 页 © 2009 Microchip Technology Inc.

Page 33: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.13 红外支持

UART 模块提供两种类型的红外 UART 支持:一种是 IrDA 时钟输出,用于支持外部 IrDA 编码器和解码器(传统模块支持);另一种是完全实现的 IrDA 编码器和解码器。

17.13.1 外部 IrDA 支持——IrDA 时钟输出

为了支持外部 IrDA 编码器和解码器,可将BCLKx引脚配置为产生 16x波特率时钟。当 UEN<1:0> = 11时,如果使能了 UART 模块,BCLKx 引脚将输出 16x 波特率时钟;它可以用于支持 IrDA 编解码器芯片。

17.13.2 内置 IrDA 编码器和解码器

UART 模块在其内部完全实现了 IrDA 编码器和解码器。内置 IrDA 编码器和解码器的功能可通过IREN 位(UxMODE<12>)来使能。当使能 (IREN = 1)时,接收引脚 (UxRX)可作为红外接收器的输入引脚。发送引脚(UxTX)可作为红外发送器的输出引脚。

17.13.2.1 IrDA 编码器功能

编码器的工作方式为:从 UART 获取串行数据,并使用下面所述的方法替换它。

对于 16x 波特率时钟的全部 16 个周期,值为 1的发送数据位编码为 0。对于 16x 波特率时钟的前 7 个周期,值为 0 的发送数据位编码为 0,对于接下来的 3 个周期,编码为 1,对于余下的 6个周期,则编码为 0。详细信息,请参见图 17-19 和图 17-21。

17.13.2.2 发送极性

发送极性通过 UTXINV 位(UxSTA<14>)进行选择。当 UTXINV = 0时,UxTX 线的空闲状态为0(见图 17-19)。当 UTXINV = 1时, UxTX 线的空闲状态为 1(见图 17-20)。

图 17-19: IrDA® 编码方式

图 17-20: 位数据为 0时的 IrDA® 编码方式

注: 此功能仅在低速模式(BRGH = 0)下可用,波特率高于 1200 波特。

UxTX 数据

UxTX

UxTX 数据

UxTX

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-33 页

Page 34: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

图 17-21: 对应于 16x 波特率时钟,位数据为 0时的 IrDA® 编码方式

17.13.2.3 IrDA 解码器功能

解码器的工作方式为:从 UxRX 引脚获取串行数据,并将其替换为解码后的数据流。数据流基于UxRX 输入的下降沿检测进行解码。

UxRX 的每个下降沿都会使解码数据被驱动为低电平并保持 16x 波特率时钟的 16 个周期。如果在 16 个周期结束之前,检测到另一个下降沿,则在接下来的 16 个周期,解码数据继续保持为低电平。如果未检测到下降沿,则解码数据被驱动为高电平。

请注意,进入器件的数据流在实际报文源的 16x 波特率时钟的 7 到 8 个周期之间移位。存在一个时钟的不确定性是由于时钟边沿分辨率的原因(详细信息,请参见图 17-22)。

图 17-22: IrDA® 解码方式

第 11 个第 8 个

发送位为 0

16x 波特率时钟

UxTX 数据

UxTX

周期开始 周期开始

16 个周期 16 个周期 16 个周期 16 个周期 16 个周期

启动 BRG TIRDEL

在 IrDA® 编码器之前

UxRX

解码数据

(发送器件)

DS70188C_CN 第 17-34 页 © 2009 Microchip Technology Inc.

Page 35: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.13.2.4 IrDA 接收极性

IrDA 信号的输入可以具有反相的极性。同一逻辑可以解码信号串,但在这种情况下,解码数据流在原始报文源的 16x 波特率时钟的 10 到 11 个周期之间移位。同样,存在一个时钟的不确定性是由于时钟边沿分辨率的原因(详细信息,请参见图 17-23)。

图 17-23: 反相极性解码结果

17.13.2.5 时钟抖动

由于时钟抖动或器件之间微小的频率差,可能会导致错过某个 16x 周期的下一个下降位边沿。在这种情况下,在解码数据流中会出现一个时钟宽的脉冲。由于 UART 在位中点附近执行择多检测,因此这不会导致错误数据(详细信息,请参见图 17-24)。

图 17-24: 时钟抖动导致在连续的 0之间产生脉冲

16 个周期 16 个周期 16 个周期 16 个周期 16 个周期

启动 BRG TIRDELI

在 IrDA® 编码器之前

UxRX

解码数据

(发送器件)

16 个周期 16 个周期

多余的脉冲被忽略

UxRX(rx_in)

解码数据

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-35 页

Page 36: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

17.14 LIN 支持

17.14.1 简介

LIN 协议以名为“帧”的小块形式发送数据。每个帧由以下部分组成:带定界符的间隔字符、同步字节、受保护的标识符,以及要发送的数据(见图 17-25)。

• 间隔序列:间隔序列表示新帧的开始。间隔序列由主节点产生,由 1 个启动位,随后的 12个 0位和 1 个间隔定界符组成。

• 同步字节:同步字节是装入 0x55 数据值的字节字段。当自动波特率功能使能时, UART 模块使用同步字节来计算传入数据的波特率。

• 受保护的标识符:受保护的标识符包含标识符和标识符奇偶校验。

图 17-25: 帧结构

17.14.2 使用 LIN 协议接收数据

当使用 LIN 协议时,UART 模块以帧形式接收数据,传入数据被装入接收缓冲区。为提高接收数据的效率,应将传入数据的波特率装入 BRG 计数器。

如果发生以下情况,可检测传入数据的比特率:

• 自动波特率功能使能 • WAKE 位在 ABAUD 位置 1 前置 1

UART 模块使用同步字节来计算传入数据的波特率。如果 WAKE 位在 ABAUD 位置 1 之前置 1,自动波特率检测将在间隔字符之后的字节处发生。模块会接收间隔字符的启动位、数据和无效停止位(这会将 FERR 置 1),但接收器会在接收下一个启动位之前先等待有效的停止位。在接收到停止位之前不能继续接收。WAKE 位在接收到停止位后自动清零。在检测到同步字符的第 5 个上升沿之后,传入数据的波特率被装入 BRG 计数器, ABAUD 位自动清零。

如果在未将 WAKE 位置 1 的情况下使能了自动波特率功能,将把定界符作为同步字节的第 1 位,而非启动位。这会导致波特率的计算出错。这是因为接收器希望在接收开始时收到同步字节。但LIN 协议以间隔字符后跟随同步字节启动发送。因此, 1 到 4 位的定界符就被当作接收线上的第一个低电平到高电平跳变。这样,定界符就成了同步字节的第1位,而非启动字符(见图17-26)。

UxRX bit 0 bit 1启动位 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 停止位定界符

间隔字符 同步字节

标识符、数据和校验和

注: 在接收数据之前,用户应用程序应将约等于传入数据比特率的值装入 UART 模块的BRG 计数器。

DS70188C_CN 第 17-36 页 © 2009 Microchip Technology Inc.

Page 37: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

图 17-26: 使用 LIN 协议接收数据

间隔字符

BRG 计数器

UxRX bit 0 bit 1启动位

XXXXh 0000h

边沿 1bit 2 bit 3边沿 2

bit 4 bit 5边沿 3

bit 6 bit 7边沿 4

停止位

边沿 5

001Ch

标识符、数据和校验和

定界符

同步字节

1 6

1. 用户应用程序先将 WAKE 位置 1,再将 ABAUD 位置 1。2. 由于器件在接收到间隔字符时唤醒,会产生一个接收中断。

3. FERR 位置 1。4. WAKE 位清零。

5. 自动波特率功能会检测同步字节的第一个上升沿。 6. 检测到同步字节的第 5 个上升沿。 ABAUD 位清零,将接收数据的波特率装入 BRG 计数器。

自动清零WAKE 位

ABAUD 位

UxRXIF

52 3 4

自动清零

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-37 页

Page 38: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F

系列

参考

手册

DS

70188C_C

N 第

17-38页

© 2009 M

icrochip Technology Inc.

4 Bit 3 Bit 2 Bit 1 Bit 0 所有复位

时的状态

V BRGH PDSEL<1:0> STSEL 0000

E PERR FERR OERR URXDA 0110

存器 xxxx

存器 0000

0000

— — — — 0000

— — — — 0000

— U2EIF U1EIF — 0000

— — — — 0000

— — — — 0000

— U2EIE U1EKE — 0000

— — — — 4444

— U1TXIP<2:0> 4444

— — — — 4444

— — — — 4444

17.15 寄存器映射

表 17-3 中提供了与 dsPIC33F 系列的 UARTx 相关的寄存器汇总。

表 17-3: 与 UARTx 相关的寄存器

SFR 名称 Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit

UxMODE UARTEN — USIDL IREN RTSMD — UEN<1:0> WAKE LPBACK ABAUD URXIN

UxSTA UTXISEL1 UTXINV UTXISEL0 — UTXBRK UTXEN UTXBF TRMT URXISEL<1:0> ADDEN RIDL

UxTXREG — — — — — — — UTX8 发送寄

UxRXREG — — — — — — — URX8 接收寄

UxBRG 波特率发生器预分频器

IFS0 — — — U1TXIF U1RXIF — — — — — — —

IFS1 U2TXIF U2RXIF — — — — — — — — — —

IFS4 — — — — — — — — — — — —

IEC0 — — — U1TXIE U1RXIE — — — — — — —

IEC1 U2TXIE U2RXIE — — — — — — — — — —

IEC4 — — — — — — — — — — — —

IPC2 — U1RXIP<2:0> — — — — — — — —

IPC3 — — — — — — — — — — — —

IPC7 — U2TXIP<2:0> — U2RXIP<2:0> — — — —

IPC16 — — — — — U2EIP<2:0> — U1EIP<2:0>

注: 与 UARTx 相关的寄存器如上表所示供用户参考。与其他 UART 模块相关的寄存器,请参见器件数据手册。

Page 39: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.16 设计技巧

问 1: 我用 UART发送的数据不能正确接收。这是什么原因?

答 1: 接收错误的 常见的原因是为 UART 波特率发生器计算了一个错误的值。确保写入 UxBRG 寄存器的值是正确的。

问 2: 尽管 UART接收引脚上的信号看上去是正确的,但我还是得到了帧错误。可能是什么原因?

答 2: 确保以下控制位已正确设置:

• UxBRG:UART 波特率寄存器

• PDSEL<1:0>:奇偶校验和数据长度选择位

• STSEL:停止位选择

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-39 页

Page 40: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

17.17 相关应用笔记

本节列出了与手册本章内容相关的应用笔记。这些应用笔记可能并不是专为 dsPIC33F 器件系列而编写的,但其概念是相近的,通过适当修改并受到一定限制即可使用。当前与 UART 模块相关的应用笔记包括:

标题 应用笔记编号

目前没有相关的应用笔记。

注: 如需获取更多 dsPIC33F 系列器件的应用笔记和代码示例,请访问 Microchip 网站(www.microchip.com)。

DS70188C_CN 第 17-40 页 © 2009 Microchip Technology Inc.

Page 41: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

第 17 章 UARTU

AR

T

17

17.18 版本历史

版本 A (2007 年 2 月)

这是本文档的初始版本。

版本 B (2007 年 2 月)

对整篇文档进行了少量编辑。

版本 C (2008 年 6 月)

该版本包括以下修正和更新:

• 对整篇文档的排版和格式进行了少量修正

• 更新了第 17.1 节 “简介”中的 LIN 参考信息

• 在第 17.2 节 “控制寄存器”中增加了每个寄存器的功能说明

• 更改了“UxSTA:UARTx 状态和控制寄存器”中 bit 14 的位值说明(见寄存器 17-2)• 修改了第 17.3.1 节 “BCLKx 输出”中 BCLKx 输出的状态信息

• 更换了第 17.5 节 “UART 发送器”中的 后一段并增加了图 17-4,以说明在使能 UART模块和将数据装入 UARTx 发送寄存器之间的软件延时的重要性

• 增加了第 17.6 节 “数据位检测”

• 删除了第 17.7.2 节 “接收器错误处理”的 后一段的第二句

• 删除了第 17.8 节 “接收间隔字符”。这将包含在第 17.14 节 “LIN 支持”中

• 删除了第 17.9.2 节 “自动波特率支持”的第一段的第四句和第二段的第三句

• 删除了第 17.9.2.1 节 “间隔检测序列”。这将包含在第 17.14 节 “LIN 支持”中

• 更新了第 17.11 节 “CPU 休眠和空闲模式下的 UART 操作”

• 在第 17.13 节“红外支持”中增加了一条 “注”

• 删除了对 IrDA 第 17.13.2.2 节 “发送极性”的引用

• 增加了第 17.14 节“LIN 支持”

© 2009 Microchip Technology Inc. DS70188C_CN 第 17-41 页

Page 42: 第17 章 UART - Microchip Technologyww1.microchip.com/downloads/cn/DeviceDoc/70188c_cn.pdf注: 每个不同的dsPIC33F 系列器件型号可能具有一个或多个UART 模块。在引脚、控

dsPIC33F 系列参考手册

注:

DS70188C_CN 第 17-42 页 © 2009 Microchip Technology Inc.