首页 PIC24系列单片机原理与开发_第7章_串行通信接口及编程

PIC24系列单片机原理与开发_第7章_串行通信接口及编程

举报
开通vip

PIC24系列单片机原理与开发_第7章_串行通信接口及编程 PIC24系列单片机原理与开发 by Zeng 2012-6-13 第 7章 异步串行通信接口及编程 7.1 概述 串行通信是指数据一位一位地按顺序传送的通信方式,其突出的优点是传输线少、接口 简单、抗干扰能力强和成本低等。串行通信是 MCU与外部设备(如计算机、各种测控模块 /装置等)进行信息交换的一种常用方式。根据数据在线路上的传送方式,将只能接收或只 能发送的传送方式称为单工通信;既可接收又可发送的,但不能同时进行的称为半双工通信; 能同时接收和发送的称为全双工通信。串行通...

PIC24系列单片机原理与开发_第7章_串行通信接口及编程
PIC24系列单片机原理与开发 by Zeng 2012-6-13 第 7章 异步串行通信接口及编程 7.1 概述 串行通信是指数据一位一位地按顺序传送的通信方式,其突出的优点是传输线少、接口 简单、抗干扰能力强和成本低等。串行通信是 MCU与外部设备(如计算机、各种测控模块 /装置等)进行信息交换的一种常用方式。根据数据在线路上的传送方式,将只能接收或只 能发送的传送方式称为单工通信;既可接收又可发送的,但不能同时进行的称为半双工通信; 能同时接收和发送的称为全双工通信。串行通信的传输速率用波特率 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示,即每秒能传输的 位数。若传输一个位的时间为 t,则波特率为 1/t。 所谓异步传送方式是通信的双方没有统一的时钟和同步字符,数据是一个字符一个字符 地传输,并且传输一个字符(也称一帧数据)时,总是以“起始位”开始,以“停止位”结 束,字符之间没有固定的时间间隔要求。通常采用所谓的不归零(Non-Return-to-Zero, NRZ) 数据格式,如图 7-1 所示。每一个字符的前面都有一位起始位(低电平),数据可以为 8 位(带校验位或无校验位)或扩展成 9 位, 最后是一个或二个停止位,停止位后面是不定 长的空闲位(图 7-1 中无空闲位)。停止位和空闲位都规定为高电平。由此可见,在异步串 行通信时,通信双方需相同的波特率和字符格式(字符数据位数、是否有校验位和停止位的 个数)。 异步通信是通过通用异步收发器(Universal Asynchronous Receiver Transmitter, UART)实现的。UART 也称异步串行通信接口 SCI(Serial Communication Interface)。根 据型号的不同,PIC24 系列的大多数芯片集成有两个 UART模块,有几款型号集成了四个UART 模块,只有少数几种 14pin 封装的是一个 UART 模块。例如 PIC24FJ64GA006 芯片的 UART 模 块为 2 个:UART1 和 UART2;PIC24FJ128GA106 芯片有 4 个 UART 模块:UART1~UART4。 在 下面的描述中用“x” (x=1,2,3,4)表示不同 UART 模块号、引脚、控制/状态位和寄存器名。 UART 模块还可通过 UxCTS 和 UxRTS 引脚支持硬件流控制。归纳起来,PIC24 系列芯片的 UART 模块主要技术特性如下:  支持8 位或 9 位全双工数据传输。  可选择奇/偶校验或无校验位模式(对于8 位数据)。  一个或两个停止位。  具有独立的波特率发生器,波特率范围为 15 bps 到1 Mbps(指令时钟为16 M 时)。  通过 UxCTS 和 UxRTS 引脚支持硬件流控制。  4 级深度的先进先出(First-In-First-Out, FIFO)发送数据缓冲器。  4 级深度的 FIFO 接收数据缓冲器。  支持奇偶校验错误、帧错误和缓冲器溢出错误检测。  支持带地址检测的 9 位模式(第 9 位 = 1)  具有独立的发送和接收中断。 0/1 1 0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1 0 1/0 1/0 1/0 8位数据 起 始 位 停 止 位 第 n个字符 (一帧数据) 起 始 位 停 止 位 第 n+1个字符 LSB MSB 图 7-1 异步通信字符(不归零数据)格式 PIC24系列单片机原理与开发 by Zeng 2012-6-13  具有用于诊断的环回(Loopback)模式。 图 7-2 所示为 UART 的简化框图。 由图可见,UART 模块主要由波特率发生器、异 步发送器和异步接收器等部件组成(大多数嵌入式应用很少使用硬件流控制(握手信号)和 IrDA (Infrared Data Association)红外数据部件)。对于大多数嵌入式应用,UART模块通常只 使用接收数据(UxRX)和发送数据(UxTx)这2根引脚线。 7.2 UART 模块的寄存器 和其它外设模块一样,要使 UART 正常工作,需按功能要求正确地配置和操作模块的各 寄存器。UART 模块有 5 个寄存器,它们是模式寄存器 UxMODE、状态与控制寄存器 UxSTA、 波特率寄存器 UxBRG、接收寄存器 UxRXREG 和发送寄存器 UxTXREG。下面详细介绍各寄存 器的功能。 7.2.1 模式寄存器 UxMODE 表 7-1 所列为模式寄存器 UxMODE 的各位域结构和定义。该寄存器主要负责启用或 关闭模块、定义模块的通信格式等关键参数。 表7-1:模式寄存器UxMODE 各位功能定义 其中: R=可读, W=可写,-n =上电复位值 R/W-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 UARTEN 未用 USIDL IREN RTSMD ALTIO(1) 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-0 WAKE LPBACK ABAUD RXINV BRGH PDSEL<1:0> STSEL bit 7 bit 0 bit 15 UARTEN UARTEN使能位: 1 =使能UARTx,由UEN<1:0> 和UTXEN 位定义UARTx模块 的引脚 0=禁止UARTx,与UARTx复用的引脚由相应的 PORT、LAT 和TRIS 位控制 bit 14 未用 读为“0” bit 13 USIDL 空闲模式停止位:1 = 芯片进入空闲模式后模块停止工作 0 = 在空闲模式下模块继续工作 波特率发生器 IrDA® 硬件流控制 UARTx 接收器 UARTx 发送器 UxTX UxRX UxCTS UxRTS BCLKx 图 7-2 UART模块简化框图 PIC24系列单片机原理与开发 by Zeng 2012-6-13 bit 12 IREN IrDA 编码器和解码器使能位:1 = 使能 IrDA 编解码器 0 = 禁止 IrDA 编解码器 bit 11 RTSMD UxRTS 引脚模式选择位:1 = UxRTS 引脚工作在单工模式 0 = UxRTS 引脚工作在流控制模式 bit 10 ALTIO UARTx 备用 I/O 选择位:1 = 通信引脚为 UxATX 和 UxARX 0 =通信引脚为 UxTX 和 UxRX 注意:并非所有器件都有UART备用引脚, 具体见相应芯片的数据手册 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 环回模式选择位:1 = 使能环回模式0 = 禁止环回模式 bit 5 ABAUD 自动波特率使能位:1 =使能波特率检测(需要收到 “同步”字段 (55h)); 完成后由该位由硬件清零 0 = 禁止波特率检测或检测已完成 bit 4 RXINV 接收极性反转位:1 = UxRX 空闲状态为0 0 = UxRX 空闲状态为1 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 个停止位 例如下面的初始化UART2为:使能UART2模块、禁止 IrDA,禁止休眠唤醒,只用U2RX,U2TX 引脚,禁止环回,禁波特率检测,高波特率位=1,8位数据无校验位,1个停止位。 U2MODE =0x8008; 或者: U2MODEbits.UARTEN=1; U2MODEbits.BRGH =1; 其余位为上电复位的默认值“0”。 说明1:PIC24FJ128GA 系列芯片无ALTIO位(UxMODE<10>)。 说明2:PDSEL<1:0>=10或01时,发送/接收为8位数据加上1位奇校验或偶校验,也是9 个位,发送时奇/偶校验位由硬件自动产生,使发送的9个位为“1”的个数为奇数(奇校验) /偶数(偶校验)。 7.2.2 状态与控制寄存器 UxSTA 表 7-2是 UARTx的状态与控制寄存器 UxSTA 的各位域结构和定义。 表7-2: 状态与控制寄存器 UxSTA 各位功能定义 PIC24系列单片机原理与开发 by Zeng 2012-6-13 其中: R=可读, W=可写,C = 可位清零, -n =上电复位值 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R/W-0 R-0 R -1 UTXISEL1 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-0 URXISEL<1:0> ADDEN RIDLE PERR FERR OERR URXDA bit 7 bit 0 bit 15,13 UTXISEL<1:0> 发送中断模式选择位: 11 = 保留 10 = 当一个字符被传输到发送移位寄存器并且发送缓冲器变为空时,产 生中断 01= 当最后一次发送完成(最后一个字符移出发送移位寄存器)且所有的发 送操作均完成时,产生中断 00= 当任意字符被传输到发送移位寄存器时产生中断(这意味着在发送缓冲 器中至少有一个单元为空) bit 14 UTXINV 发送极性反转位: IREN = 0: 1 = UxTX 空闲状态为 0 0 = UxTX 空闲状态为 1 IREN = 1: 1 = IrDA 编码 UxTX 空闲状态为 1 0 = IrDA 编码 UxTX 空闲状态为 0 bit 12 未用 bit 11 UTXBRK 发送间隔位: 1 = 无论发送状态如何,都将 UxTX 引脚置为低电平(同步间隔发送:启 始位后跟随 12 个 0,之后为 1 个停止位) 0 = 同步间隔发送被禁止或已完成 bit 10 UTXEN 发送使能位: 1 = UARTx 发送器使能, UARTx 控制 UxTX 引脚 (如果 UARTEN = 1) 0 = UARTx 发送器禁止,中止所有等待的发送,缓冲器复位。 PORT 控 制 UxTX 引脚 bit 9 UTXBF 发送缓冲器满状态位(只读): 1 = 发送缓冲器已满 0 = 发送缓冲器未满,可以写入至少一个或多个数据字 bit 8 TRMT 发送移位寄存器空位 (只读) 1 = 发送移位寄存器为空,同时发送缓冲器为空 (上一个发送已经完成) 0 = 发送移位寄存器非空,发送在进行中或在发送缓冲器中排队 Bit 7-6 URXISEL<1:0> 接收中断模式选择位: 11 = 接收缓冲器满时 (即有 4 个数据字符),中断标志位置 1 10 = 接收缓冲器 3/4 满时 (即有 3 个数据字符),中断标志位置 1 0x = 当接收到一个字符时,中断标志位置 1 bit 5 ADDEN 地址字符检测位(接收数据的第 8 位 = 1): 1 = 地址检测模式使能。如果没有选择 9 位模式,该控制位无效。 0 = 地址检测模式禁止 bit 4 RIDLE 接收器空闲位(只读): 1 = 接收器空闲 0 = 正在接收数据 bit 3 PERR 奇偶校验错误状态位(只读): 1 = 检测到当前字符的奇偶校验错误 0 = 未检测到奇偶校验错误 bit 2 FERR 帧错误状态位(只读): 1 = 检测到当前字符的帧错误 0 = 未检测到帧错误 PIC24系列单片机原理与开发 by Zeng 2012-6-13 bit 1 OERR 接收缓冲器溢出错误状态位(清零/只读): 1 = 接收缓冲器溢出 0 = 接收缓冲器未溢出(若OERR=1,将其清零(“1”→“0”)会将接收缓冲 器和 RSR(接收移位寄存器)复位为空状态) bit 0 URXDA 接收缓冲器非空状态位(只读): 1 = 接收缓冲器中有数据,有至少一个或多个字符可读 0 = 接收缓冲器为空 7.2.3 波特率发生器 UxBRG 表7-3:波特率寄存器 UxBRG 其中: R=可读, W=可写,-n =上电复位值 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 BRG<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-0 BRG<7:0> bit 7 bit 0 bit 15-0 BRG<15:0> 波特率除数位 寄存器 UxBRG 是专用于 UARTx 模块的 16 位波特率发生器。 UARTx 的通信波特率取决 于 UxBRG 的设置值和位 BRGH(UxMODE<3>)的取值,并且由下式确定。 BRGH * * 4 ( Fcy波特率= ( 7 - 1 ) 16 UxRBG + 1) 式中,Fcy 是指令周期的频率,BRGH 是模式寄存器 UxMODE 中的高波特率选择位,其值为 0 或 1。 如果已知波特率,则可由上式求得寄存器 UxBRG 的设置值: BRGH4Fcy*UxRBG = -1 ( 7 - 2 ) 16* 所 需波特率 例如,设系统时钟 Fosc=32MHz,指令周期的频率 Fcy=32MHz/2=16MHz。使用 UART1 模块,所需波特率为 9600,高波特率选择位 BRGH=0,由式(7-2)可算得寄存器 U1RBG 的设置值 N为 : N=(16M/(16*9600))-1=103.17, 可取 N=103。 实际波特率=16M/(16*103+1)=9615.4 相对误差=(9615.4-9600)/9600=0.16% 给寄存器进行初始化的 C30语句为:U1RBG=103; U1MODEbits.BRGH=0; 若取 BRGH位=1,则 U1RBG 的设置值 N为: N=(16M*4/(16*9600))-1=416.67., 取 N=417。 实际波特率=16M*4/(16*417+1)=9590.9 相对误差=(9590.9-9600)/9600=-0.095% 给寄存器进行初始化的 C30语句为:U1RBG=417; U1MODEbits.BRGH=1; 从式(7-1)知,可实现的最大波特率(位 BRGH = 1)为 Fcy/4,,最小波特率(位 BRGH = 0)为 Fcy/(4 * 65536)。 PIC24系列单片机原理与开发 by Zeng 2012-6-13 向 UxBRG 寄存器写入新值会使 BRG 定时器复位,这样可使 UARTx 立即更新成新 的波特率。 表7-4列出了在指令时钟频率为16MHz、12MHz和8MHz时的常用波特率与RBG取值的 对应关系,可供用户设计时查阅。 表 7-4 常用波特率和 UxRBG 装载值的对应关系 Fcy=16MHz Fcy=12MHz Fcy=8MHz 实际 误差 BRG值 波特率 % (十进制) 实际 误差 BRG 值 波特率 % (十进制) 实际 误差 BRG 值 波特率 % (十进制) 波特率 bps 高波特率选择位 BRGH=0 1200 2400 9600 19.2K 38.4K 56K 1200.5 0.04 832 2398.1 -0.08 416 9615.4 0.16 103 19.2308k 0.16 51 38.4615k 0.16 25 55.5556k -0.79 17 1200.0 0.00 624 2403.8 0.16 311 96153 0.16 77 19.2307k 0.15 38 37.5000k -2.34 19 57.6923k -3.02 12 1199.0 0.00 416 2403.8 0.16 207 9615.4 0.16 51 19.2308k 0.16 25 38.4615k 0.16 12 55.5556k -0.79 8 高波特率选择位 BRGH=1 1200 2400 9600 19.2K 38.4K 56K 1200.1 0.01 3332 2399.5 -0.01 1666 9592.3 -0.07 416 19.2307k 0.16 207 38.4615k 0.16 103 56.3380k 0.60 70 1200.0 0.00 2499 2403.8 0.00 1249 9584.6 -0.15 312 19.2307k 0.15 155 38.4615k 0.16 77 55.5555k -0.79 53 1199.7 -0.01 1666 2400.9 0.04 832 9615.4 0.16 207 19.2308k 0.16 103 38.4615k 0.16 51 55.5556k -0.79 35 从表中可见,取高波特率选择位 BRGH 置“1”时的 RBG 值,可获得较小的波特率误 差。 7.2.4 UARTx的接收寄存器 UxRXREG 和发送寄存器 UxTXREG 表7-4:接收寄存器 UxRXREG 其中: R=可读, W=可写,-n =上电复位值 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-0 URX<7:0> bit 7 bit 0 bit 15-9 未用 读为“0” bit 8 URX8 在9 位模式下,接收到的 D8 位数据 Bit 7-0 URX<7:0> 接收到的D7 ~D0 位数据 表7-5:发送寄存器 UxTXREG PIC24系列单片机原理与开发 by Zeng 2012-6-13 U A R T 其中: R=可读, W=可写, x=未知,-n =上电复位值 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-x UTX<7:0> bit 7 bit 0 bit 15-9 未用 读为“0” bit 8 UTX8 在9 位模式下,发送的 D8 位数据 Bit 7-0 UTX<7:0> 发送的的D7 ~D0 位数据 表 7-4和表 7-5列出了 UARTx的接收寄存器 UxRXREG和发送寄存器 UxTXREG。 一般来说,接收寄存器 UxRXREG 只用于读,发送寄存器 UxTXREG 只用于写。在正常通 信时,当 UARTx 模块收到一数据祯时,自动将接收的 8/9 位数据(一般称为字符)送 UxRXREG,供用户读取;若用户向发送寄存器 UxTXREG 写入数据后,则启动模块发送。 串行通信的具体编程见 7.4节。 7.3 UART 的异步通信 UARTx 的数据帧传送使用图 7-1 所示的标准不归零格式 :1 个启动位、8 或 9 个数 据位和 1 或 2 个停止位。硬件提供奇偶校验,用户可以配置为偶校验、奇校验或无奇偶校 验。常用的数据格式是 8 位、无奇偶校验位、1 个停止位(用 8、N 、1 表示),这也是默 认的上电复位设置。为节省单片机引脚的开销,对大多数嵌入式应用,一般不使用握手信号, 只使用接收数据(UxRX)和发送数据(UxTx)这 2根引脚线。在使用 UARxT模块进行通信之前, 需对模块的模式寄存器 UxMODE、状态与控制寄存器 UxSTA 的有关位和波特率发生器 UxBRG 初始化。 7.3.1 UART 发送器 1.发送器结构 图 7-3 所示为 UARTx 发送器的原理结构框图。发送器的核心是发送移位寄存器 (UxTSR)。UxTSR 寄存器受 UART 模块的控制逻辑操作,在波特率时钟的作用下,将来自于 发送寄存器 UxTXREG 中数据按用户定义的格式(如:8、N 、1),构成一个完整的发送数据 帧,一位一位地传送到引脚 UxTX。UxTSR 寄存器对用户来说是不可见的(没有映射到数据 存储器中),用户不能访问它。 从图 7-3可知,发送寄存器 UxTXREG 是一个宽度 9位、深度 4 级的先进先出(FIFO) 结构,或称发送缓冲区。UxTXREG 中的数据由用户程序写入,用户最多可向发送缓冲区写入 4个字。无论何时,只要发送缓冲器为满,状态位 UTXBF(UxSTA<9>)就会置 “1”。此时, 用户试图向已经满的缓冲器执行写操作将无效。一旦 UxTXREG 的数据被传送到 UxTSR 寄存 器,当前缓冲单元就可以写入新的数据,前一个缓冲单元将成为 UxTSR 寄存器的数据源。 对于用户编程,只要查询到状态位 UTXBF(UxSTA<9>)为“0”,就可以对发送寄存器 UxTXREG 写入数据,不会产生数据覆盖问题。 用户需将允许发送位 UTXEN(UxSTA<10>)置为“1”,方可启用 UARTx 的发送功能。复 位后,发送缓冲区 UxTXREG 和移位寄存器 UxTSR 均为空,用户首次写 UxTXREG 寄存器使得 该数据立即传送到 UxTSR 发送。一旦发送数据帧的停止位发送完毕,如果发送缓冲区非空, 则其数据立即装入移位寄存器 UxTSR,形成新的发送数据帧并发送。发送过程中清零 UTXEN 位将使发送中止并复位发送器,UxTX 将恢复为通用数字 I/O 引脚(若其口方向寄存器的相 应位为“1”,则其呈高阻抗状态)。 PIC24系列单片机原理与开发 by Zeng 2012-6-13 若要传送 9 位数据,需将模式寄存器 UxMODE 中的位域 PDSEL<1:0> (UxMODE<2:1>)置为“11”,并可用字(对 C30而言,为 int 或 unsigned int 类型)的写 操作将发送的 9 位数据送 UxTXREG 寄存器。位 UTX8 (UxTXREG<8>)即为所送的第 9 位数据。 注:在 9 位数据发送的情况下,没有奇偶校验功能。 UARTx 的状态寄存器 UxSTA 中的发送中断模式选择位 UTXISEL<1:0>(UxSTA<15,13>) 决定何时产生一个发送中断(发送中断标志UxTXIF置“1”): (1)UTXISEL<1:0> = 00。当一个字符从发送缓冲器传输到发送移位寄存器(UxTSR) 时,UxTXIF 被置“1”。这表明发送缓冲器中至少有一个单元为空。这是常用的模 式,至少笔者比较喜欢使用这种模式。 (2)UTXISEL<1:0> = 01。当发送缓冲区为空且移位寄存器(UxTSR)发送完最后一位 时,UxTXIF 被置“1”。这表明所有发送操作都已完成。此时,因发送缓冲区和移 位寄存器均为空,所以用户每次可向发送缓冲器送4个数据。这种模式可视为“块 发送”方式,可减少中断次数。 (3)UTXISEL<1:0> = 10。当一个字符传输到移位寄存器(UxTSR)且发送缓冲器为空 时, UxTXIF 被置“1”。这种模式也为“块发送”方式,用户每次可向发送缓冲 器送4个数据。 注:GA系列芯片的UART1 发送中断标志位 U1TXIF(IFS0 <12>)属于中断寄存器IFS0,UART2的发送 中断标志位 U2TXIF(IFS1<15>)属于中断寄存器IFS1,见第3章的表3-7。 注意,无论哪种发送中断模式,当URATx模块第一次使能时(允许发送位UTXEN置 “1”), 其中断标志位UxTXIF也会随之置“1”,这意味着将产生中断申请。因为发送缓冲区为空,可 以向 UxTXREG 寄存器送发送数据。如果用户的发送数据还未准备好,可在发送中断允许未 开放前清零 UxTXIF 位。根据笔者实测(PIC24FJ64GA006芯片),若紧接着使能发送 (UxSTAbits.UTXEN=1)后清UxTXIF位,则UxTXIF位的清“0”无效,至少要间隔2个指令周期, 内部数据总线 UxMODE UxSTA 发送控制逻辑  UxTSR控制  缓冲器控制  产生标志位  产生中断标志 中断标志 UxTXIF 波特率 发生器 UTX8 UxTXREG 低字节 D15 …… D9 D8 D7 … … D0 发送移位寄存器(UxTSR) 奇偶校验位发生器 控制信号 字/字节写控制 装载 UxTSR 起始“0” 停止“1” UTXBRK UxTX引脚 发送 FIFO 图 7-3 UART 发送器框图 注: x 表 示 UART 的编号 PIC24系列单片机原理与开发 by Zeng 2012-6-13 U A R T 方可将UxTXIF位清“0”。当然也可在中断服务程序(ISR) 中清零 UxTXIF 位。 中断标志位 UxTXIF 显示了 UxTXREG 寄存器的状态。移位寄存器UxTSR的状态由位 TRMT(UxSTA<8>)指示。当 UxTSR 寄存器为空时该位为“1”,否则为“0”。没有中断逻辑 与此位相关联,如果用户要判断 UxTSR 是否为空,只能查询此位的状态。对于实际编程而 言,一般无需判UxTSR 是否为空,故 TRMT 位可以不管。 2.UART发送功能的初始化和发送数据的步骤 下面是不使用握手信号的 UART发送功能的初始化和发送数据的基本步骤: (1) 根据所需波特率,查表 7-4 获得或用式(7-1)/(7-2)计算出波特率寄存器 的设置值,送 UxBRG寄存器。 (2) 设置通信格式:数据位数、停止位数和奇偶校验选择。通过写 PDSEL<1:0> (UxMODE<2:1>)和 STSEL(UxMODE<0>)位来设置。 (3) 设置发送中断模式选择位(UTXISEL<1:0>(UxSTA<15,13>))。 (4) 使能 UART 模块:将位 UARTEN(UxMODE<15>)置“1”。 (5) 使能发送功能:将允许发送位 UTXEN(UxSTA<10>)置 “1”。这时,中断标志位 UxTXIF 会变成“1”。在 UARTx 发送中断服务程序中,应先清零UxTXIF 位,然 后将发送数据送发送寄存器UxTXREG. (6) 如果用中断方式发送,需设置好发送中断的优先级(中断优先级寄存器(IPC)的 位域UxTXIP<2:0>),将相应的中断允许控制寄存器(IEC)中的中断允许位 UxTXIE 置“1”。 (6) 开始发送:将数据送 UxTXREG 寄存器。若设置的格式为 9 位数据,使用字传送, 其余可用字节传送。数据可以连续装入缓冲器,直到状态位UTXBF(UxSTA<9>)为 “1”为止。 注意:位 UTXEN 的置“1”应在位 UARTEN 的置“1”之后,否则可能导致UART 发送使 能失败。 状态与控制寄存器UxSTA中有一个发送间隔位 UTXBRK,该位用于发送一个所谓的“间隔 字符”。“间隔字符”为 1 个启始位,然后 12 个“0”和 1 个停止位。其通常用于LIN(Local Interconnect Network)总线中作为同步间隔或称中止符。发送“间隔字符”具体部骤为:  等待发送移位器为空(位 TRMT(UxSTA<8>)为“1”).  将位 UTXBRK(UxSTA<11>)置“1”。  将任一数据写入发送寄存器 UxTXREG。此写操作是启动“间隔字符”的发送,写入 UxTXREG 的数据值会被忽略。  当发送器发完“间隔字符”的停止位时,硬件会自动将 UTXBRK 位清“0”。 注意,发送“间隔字符”不会产生发送中断。 例7-1 初始化UART2为:禁IrDA、环回、波特率检测,只用 U2RX,U2TX 引脚,高速位 =1,8位数据,无校验位,1个停止位,波特率 9600。设指令时钟为16MHz。用中断方式发 送字符串常数cTrans[]。 const char cTrans[]= "UART2 transmitting test"; //定义字符串常数 char Cnt=0; //作发送字符计数器 int main ( void ) { U2MODEbits.BRGH =1; U2BRG=417; //波特率 9600 U2STAbits.UTXISEL0=0; U2STAbits.UTXISEL1=0; //每发送1个字符产生中断 U2MODEbits.UARTEN=1; SRbits.IPL = 3; // CPU 优先级为3 IPC7bits.U2TXIP =4; // 发送中断的优先级为4 PIC24系列单片机原理与开发 by Zeng 2012-6-13 IEC1bits.U2TXIE =1; //允许发送中断 U2STAbits.UTXEN=1; //使能发送,同时产生发送中断(U2TXIF位置“1”) while (1) { ; } // 循环 } //======== 串口2发送中断 =========== void __attribute__((__interrupt__,no_auto_psv)) _U2TXInter rupt(void) { IFS1bits.U2TXIF = 0; //清发送中断标志 if(Cnt < sizeof(cTrans)) U2TXREG=cTrans[Cnt]; //送发送寄存器 else U1STAbits.UTXEN=0; //禁止发送 Cnt++; } 注:未作初始化的U2MODE 和U2STA 寄存器的其余位为上电复位默认值“0”。 7.3.2 UART接收器 1.接收器结构 图 7-4 所示为接收器的原理结构框图。接收数据从 UxRX 引脚输入。数据检测器以16 倍波特率的速率采样 UxRX 引脚的数据。当 UxRX 引脚为空闲或收到停止位后,数据检测器 进入起始位检测。当检测到输入变为低时,延时半个传输位的时间后再采样 3 次。如这三 次中至少两次为低,则认为检测到一个正确的起始位,否则重新开始检测起始位。在检测到 正确的起始位后,每一个数据位和停止位都在其位中间对 UxRX 引脚上的数据采样三次,由 “三取二”表决电路确定是高电平还是低电平。 接收器的核心是接收移位寄存器(UxRSR),该寄存器对用户来说是不可见的(没有映 射到数据存储器中),用户不能访问它。在波特率时钟的作用下,来自于数据检测器的信号 逐位移入 UxRSR 寄存器。当采集到 UxRX 引脚上的停止位后,UxRSR 中的数据传送到先进 先出(FIFO)的接收缓冲器中(如果未满)。 UARTx 接收器有一个宽度9位、深度4 级的FIFO接收缓冲器。UxRXREG 是一个存储器映 射的特殊功能寄存器,编程者可通过读 UxRXREG 寄存器来访问 FIFO 接收缓冲器中的数据。 在FIFO 未“满”时, UxRSR 每接收到一个数据(一般都称为字符)就自动传送到 FIFO, 并根据用户在 UxSTA 寄存器中定义的接收中断模式,产生接收中断标志 UxRXIF。 当 UxRSR 寄存器收到一个数据帧并欲将字符传送到 FIFO 时,若此时 FIFO 中已存有 4个字符,则溢出错误位 OERR(UxSTA<1>)置“1”,并禁止 UxRSR 寄存器向 FIFO 传送数 据,同时 UxRSR 寄存器也不再接收数据(UxRSR 中的字符保留)。用户必须用软件清零 OERR 位,以允许继续接收数据。 值的注意的是,只要清零 OERR 位(“1”→“0”),FIFO 接收缓冲器和接收移位寄 存器 UxRSR均复位 。用户如果需要保存溢出前所接收到的数据(FIFO中 的4个数据和 UxRSR 寄存器中的数据),应该先将这 5 个字符读出(读 UxRXREG 寄存器),然后清零 OERR 位。 否则会丢失FIFO 和 UxRSR 中的数据。 接收移位寄存器对收到的每一个数据帧的停止位进行检测。如果收到的停止位为逻辑 “0”,则发出帧格式出错信息,将帧错误位 FERR(UxSTA<2>)置“1”。 若传输格式有奇偶校验位,当检测到当前接收的数据有奇偶校验错误,则奇偶校验错误 位 PERR(UxSTA<3>)置“1”。例如,如果奇偶校验设置为偶校验,但收到字符的8个数据 位中为“1”的个数是奇数时,就会产生奇偶校验错误。9 位模式时 PERR 位不起作用。FERR 和 PERR 位与接收到的字符一起存入FIFO 缓冲区,用户编程时应该在读取数据之前读出。 如果发生了这些错误(OERR、 FERR 和 PERR)中的任意一个,则会产生中断标志 UxERIF (中断标志寄存器 IFS4 中)。用户若要利用其中断来处理这些接收错误,必须将相应的中断 PIC24系列单片机原理与开发 by Zeng 2012-6-13 允许位 UxERIE(中断允许寄存器IEC4中)置“1”,并设置好相应中断的优先级(中断优先 级寄存器(IPC)的位域UxERIP<2:0>),才能转到相应的中断向量单元_UxErrInterrupt。 2. 接收中断 UARTx 接收中断标志(UxRXIF)位于相应的中断标志寄存器中(U1RXIF:IFS0<11>, U2RXIF:IFS1<14>)。根据用户对状态寄存器 UxSTA 中的接收中断模式选择位URXISEL<1:0> (UxSTA<7:6>)设置, UARTx 接收器在下面三种情况置中断标志位 UxRXIF 为“1”,产生 接收中断: (1) URXISEL<1:0> = 00 或 01。每当一个字符从接收移位寄存器(UxRSR)传送到接 收缓冲器时就会产生中断。此时,接收缓冲器中至少有1个字符。 (2) URXISEL<1:0> = 10。当一个字符从接收移位寄存器 (UxRSR)传送到接收缓冲 器时就会产生中断,此时,接收缓冲器中至少有3个字符。 (3) URXISEL<1:0> = 11。当一个字符从接收移位寄存器(UxRSR)传送到接收缓冲器 时就会产生中断,此时,接收缓冲器中有4个字符(即,缓冲器满)。 运行时用户可以在三种中断模式间切换。 只读位 URXDA(UxSTA<0>)指示接收缓冲器是否为“空”。若接收缓冲器为非空,则该 位为“1”。只有接收缓冲器中的数据都被“读”走,该位才为“0”。 只读位 RIDLE(UxSTA<4>)指示 UxRSR 寄存器的状态。在接收器空闲时(即 UxRSR 寄存器为空)时被置“1”。没有中断逻辑与此位相关联,如果用户要判断 UxRSR 是否为 空,只能查询此位的状态。对于实际编程而言,一般无需判UxRSR 是否为空,故 RIDLE (UxSTA<4>)位可以不管。 3.UART接收功能的初始化和读取接收数据的步骤 下面是 UART(不使用握手信号)接收功能的初始化和接收数据的基本步骤: 内部数据总线 UxMODE UxSTA 接收控制逻辑  移位数据字符  产生标志位  产生中断标志 中断标志 UxRXIF URX8 UxRXREG 低字节 D15 …… D9 D8 D7 … … D0 接收移位寄存器(UxRSR)  起始位检测  奇偶位检测  停止位检测  移位时钟产生  唤醒逻辑 控制信号 字/字节读控制 装载接收缓冲器 来自 UxTX 16倍波特率时钟 LPBACK UxRX引脚 接收 FIFO 图 7-4 UART 接收器框图 注: x 表 示 UART 的编号 16分频 数据检测器 PIC24系列单片机原理与开发 by Zeng 2012-6-13 (1) 根据所需波特率,查表 7-4获得或用式(7-1)/(7-2)计算出波特率寄存器 的设置值,送 UxBRG寄存器。 (2) 设置通信格式:数据位数、停止位数和奇偶校验选择。通过写 PDSEL<1:0> (UxMODE<2:1>)和 STSEL(UxMODE<0>)位来设置。 (3) 设置接收中断模式选择位 URXISEL<1:0>(UxSTA<7:6>)。 (4) 使能 UART 模块:将位 UARTEN(UxMODE<15>)置“1”。 (5) 如果用中断方式接收,需设置好接收中断的优先级(设置中断优先级控制寄存器 (IPC)中的位域 UxRXIP<2:0>),将相应的中断允许控制寄存器(IEC)中的中 断允许位 UxRXIE 置“1”。 (6)中断方式接收数据:在入口为“_UxRXInterrupt”接收中断服务程序中,根据所 设置的接收中断模式值(URXISEL<1:0>),读取接收缓冲器中的数据(通过读接收 寄存器 UxRXREG),如果是9 位数据格式,则用“字”读,否则可用“字节”读:  URXISEL<1:0> = 00 或 01:每次读取1个字符。  URXISEL<1:0> = 10:每次可读取3个字符。  URXISEL<1:0> = 11:每次可读取4个字符。 中断返回前应将标志位 UxRXIF清零。 当然,也可以用检查缓冲器状态位 URXDA(UxSTA<0>)是否为“1”来读取数据。 因为只要缓冲器中有数据可读,状态位 URXDA 就为“1”。 (7) 查询方式接收数据:若查询到中断标志 UxRXIF为“1”,则读取接收缓冲器中的 数据(通过读接收寄存器 UxRXREG),每次读取的字符数与上面的中断方式相同, 然后将标志位 UxRXIF清零。 以上(1)、(2)和(4)点与发送的初始化相同,可和发送初始化一起进行,不必重复。 例7-2 初始化UART2为:禁IrDA、环回、波特率检测,只用 U2RX,U21TX 引脚,高速位 =1,8位数据,无校验位,1个停止位,波特率 9600。设指令时钟为16MHz。中断方式接收 数据,存于RiBuf数组中。设数据的起始符为“:”。 char RiBuf[64],Index=0; int main ( void ) { U2MODEbits.BRGH =1; U2BRG=417; //波特率 9600 U2STAbits.URXISEL=0; //每接收1个字符产生中断 U2MODEbits.UARTEN=1; SRbits.IPL = 3; // CPU 优先级为3 IPC7bits.U2RXIP =4; // 发送中断的优先级为4 IEC1bits.U2RXIE =1; //允许接收中断 while (1) { ; } // 循环 } //======== 串口2接收中断 =========== void __attribute__((__interrupt__,no_auto_psv)) _U2 RXInterrupt(void) { char n; IFS1bits.U2RXIF = 0; n= U2RXREG; //读接收缓冲器 if(n==':') Index=0; //若为起始符“:”,复位Index。 if(Index>=sizeof(RiBuf)) Index=0; RiBuf[Index]=n; Index++; } PIC24系列单片机原理与开发 by Zeng 2012-6-13 U A R T 7.3.3 关于使能和禁止 UART 启用 UARTx 模块进行异步串行通信必须将位UARTEN(UxMODE<15>) 置“1”使能UARTx。 一旦使能UARTx 模块,接收引脚 UxRX 就配置成串行通信的输入,且不受其口方向寄存器 (TRISy 寄存器)控制,也就是说该引脚不能作通用的输出口线,但对引脚 UxRX作通用的 输入口线仍有效。此时如果未使能发送功能(位UTXEN(UxSTA<10>)为“0“),发送引脚 UxTX 可作通用I/O口线。若使能了发送功能(位UTXEN为“1”),则引脚 UxTX为串行通信的输出, 不受其口方向寄存器(TRIS 寄存器)控制,与其端口寄存器 PORTy 和输出锁存寄存器 LATy 中的相应位状态无关。 禁止UARTx 模块只要清零 UARTEN(UxMODE<15>)位即可。这也是任何复位后的默认状 态。如果禁止了 UARTx,与 UARTx 相关的引脚恢复成通用I/O,接收和发送缓冲器复位成空 状态,所有与之相关的错误和状态标志复位: URXDA、 OERR、 FERR、 PERR、 UTXEN、 UTXBRK 和 UTXBF 位清零, RIDLE 和 TRMT置 1。其他控制位,包括 ADDEN、 URXISEL<1:0> 和 UTXISEL<1:0>位,以及 UxMODE 和 UxBRG 寄存器保持原值。 从编程角度看,禁止UARTx 模块后若需再使能UARTx,最好是重新初始化UARTx模块。 7.3.4 UART 的其它特性 1. 环回模式(Loopback Mode ) 如果将位 LPBACK(UxMODE<6>)置“1”,则由UxTX引脚输出的发送信号在芯片内部 连接到UARTx接收器,作为通信的输入信号;UARTx 接收器忽略UxRX 引脚上的信号。这就 是所谓的环回模式,即自己发送给自己接收。此模式可用于通信收、发程序的调试。 要启用环回模式时,应先按非环回模式初始化UARTx,然后将位LPBACK(UxMODE<6>) 置“1”,之后再使能发送。 表7-6 是环回模式下,不同的模式寄存器UxMODE中的位域UEN<1:0>设置所对应的引 脚分配情况。 若用户的应用板已装有RS-232接口,那么串行通信调试还是用串口小软件(如串口调 试精灵、串口调试助手等)与计算机联调比较灵活、方便,远比用环回模式好。 表 7-6 环回模式引脚功能 UEN<1:0> 引脚功能( LPBACK = 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 未使用 2.自动波特率检测 UART 模块支持波特率自动检测与设置。自动波特率功能需要接收一个字符“U”的 ASCII 码(0x55),发送方的格式为 8位数据,无校验位。只要将自动波特率检测位 ABAUD(UxMODE<5> 置“1”,则 UARTx 模块启用波特率自动检测:BRG 计数器清零,从接收到启始位后的第一 个上沿开始,BRG 计数器以 Fcy/8 的时钟计数,当检测到数据的第5个上沿时(此实际上是 停止位)计数结束, BRG 计数器值被传送到 UxBRG 寄存器;同时自动清零 ABAUD(UxMODE<5> 位,接收中断标志位UxRXIF 置“1”,但不更新接收器 FIFO。 在进行波特率自动设置时,需禁止环回模式,其选择位 LPBACK(UxMODE<6>)必须 PIC24系列单片机原理与开发 by Zeng 2012-6-13 U A R T 为’0”, 禁止自动唤醒(WAKE(UxMODE<7>)= 0),高波特率位BRGH(UxMODE<3>) 需为“0”, 否则将导致波特率设置不对。 当自动波特率检测位 ABAUD(UxMODE<5>置“1”后,UARTx 在完成波特率检测与设置时 会自动清零 ABAUD 位。如果用户在波特率检测序列完成之前清零 ABAUD 位,则可能导致不 可预料的结果。 3.多机通信 多机通信系统有几种结构,其中最常用的为主从结构系统。该系统有一台主机,它可以 是通用的微机系统,如 PC 机等,也可以是由 MCU 构成的专用微机系统。从机有多台,它 们一般为 MCU 构成。在通信中为了区分这些从机,每台从机均赋有独立的地址编号。主机 与从机通信时,发送信息包的起始信息一般为从机地址。各从机同时接收信息包中的地址, 如发现地址与自己的地址相同,则启动接收后面的数据,否则忽略后面的数据。 对于可传送 9位数据的 MCU, 一般可使用第 9 个数据位来识别所接收的字符是地址还 是数据信息。如果第 9 位为“1”,数据就作为地址或控制信息处理。若第9
本文档为【PIC24系列单片机原理与开发_第7章_串行通信接口及编程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_486227
暂无简介~
格式:pdf
大小:322KB
软件:PDF阅读器
页数:21
分类:互联网
上传时间:2013-05-13
浏览量:91