第六章 通用IO接口的基本结构与基本应用
- 格式:doc
- 大小:1.35 MB
- 文档页数:31
微机原理第六章接口2??I/O接口电路的典型结构??输入输出的控制方式??DMA控制器8237A及应用微机原理第六章接口3I/O接口概述为什么需要I/O接口电路??微机的外部设备多种多样其工作原理、驱动方式、信息格式、以及工作速度方面彼此差别很大它们不能与CPU直接相连必须经过中间电路再与系统相连??这部分电路被称为I/O接口电路微机原理第六章接口4I/O接口概述续1什么是I/O接口电路??I/O接口是位于系统与外设间、用来协助完成数据传送和控制任务的逻辑电路CPUCPU接口接口电路电路I/OI/O设备设备微机原理第六章接口5I/O接口的主要功能⑴对输入输出数据进行缓冲和锁存⑵对信号的形式和数据的格式进行变换微机直接处理数字量、开关量、脉冲量⑶对I/O端口进行寻址⑷与CPU和I/O设备进行联络微机原理第六章接口6I/O接口的典型结构控制总线CB地址总线ABI/O接口电路数据控制状态数据总线DBCPU外设控制寄存器状态寄存器数据寄存器微机原理第六章接口7接口电路的内部结构??CPU与外设主要有数据、状态和控制信息需要相互交换于是从应用角度看内部⑴数据寄存器??保存外设给CPU和CPU发往外设的数据⑵状态寄存器??保存外设或接口电路的状态⑶控制寄存器??保存CPU给外设或接口电路的命令微机原理第六章接口8接口电路的外部特性??主要体现在引脚上分成两侧信号面向CPU一侧的信号??用于与CPU连接??主要是数据、地址和控制信号面向外设一侧的信号??用于与外设连接??提供的信号五花八门??功能定义、时序及有效电平等差异较大微机原理第六章接口9接口电路芯片的分类??接口电路核心部分往往是一块或数块大规模集成电路芯片接口芯片??通用接口芯片??支持通用的数据输入输出和控制的接口芯片??面向外设的专用接口芯片??针对某种外设设计、与该种外设接口??面向微机系统的专用接口芯片??与CPU和系统配套使用以增强其总体功能微机原理第六章接口10接口电路的可编程性??许多接口电路具有多种功能和工作方式可以通过编程的方法选定其中一种??接口需要进行物理连接还需要编写接口软件??接口软件有两类??初始化程序段——设定芯片工作方式等??数据交换程序段——管理、控制、驱动外设负责外设和系统间信息交换微机原理第六章接口11I/O端口的编址接口电路占用的I/O端口有两类编排形式??I/O端口单独编址??I/O地址空间独立于存储地址空间??如8086/8088??I/O端口与存储器统一编址??它们共享一个地址空间??如M6800微机原理第六章接口12I/O端口单独编址??优点??I/O端口的地址空间独立??控制和地址译码电路相对简单??专门的I/O指令使程序清晰易读??缺点??I/O指令没有存储器指令丰富内存空间I/O空间FFFFF0FFFF微机原理第六章接口13I/O端口与存储器统一编址??优点??不需要专门的I/O指令??I/O数据存取与存储器数据存取一样灵活??缺点??I/O端口要占去部分存储器地址空间??程序不易阅读不易分清访存和访问外设内存部分I/O部分存储器空间00000FFFFF微机原理第六章接口148088/8086的输入输出指令??输入指令演示IN ALPORT字节输入直接寻址IN ALDX字节输入间接寻址IN AXPORT字输入直接寻址IN AXDX字输入间接寻址输出指令演示OUT PORTAL字节输出直接寻址OUT DXAL字节输出间接寻址OUT PORTAX字输出直接寻址OUT DXAX字输出间接寻址微机原理第六章接口158088/8086的I/O端口??8088只能通过输入输出指令与外设进行数据交换呈现给程序员的外设是端口Port即I/O地址??8086用于寻址外设端口的地址线为16条端口最多为2166553664K个端口号为0000H FFFFH??每个端口用于传送一个字节的外设数据微机原理第六章接口16I/O寻址方式??8088/8086的端口有64K个无需分段设计有两种寻址方式直接寻址只用于寻址00H FFH前256个端口操作数i8表示端口号间接寻址可用于寻址全部64K个端口DX寄存器的值就是端口号??对大于FFH的端口只能采用间接寻址方式微机原理第六章接口17数据交换方式??如果输入输出一个字节利用AL寄存器??如果输入输出一个字利用AX寄存器??输入一个字实际上是从连续两个端口输入两个字节分别送AL对应低地址端口和AH对应高地址端口??输出一个字实际上是将AL对应低地址端口和AH对应高地址端口两个字节的内容输出给连续两个端口微机原理第六章接口18IN指令从20H端口输入一个字字输入直接寻址in ax20h字输入间接寻址mov dx20hin axdx字节输入直接寻址in al21hmov ahalin al20h字节输入间接寻址mov dx21hin aldxmov ahaldec dxin aldx微机原理第六章接口19OUT指令向300H端口输出一个字节唯一的方法间接寻址字节量输出mov albvarbvar是字节变量movdx300hout dxal微机原理第六章接口20I/O地址的译码??I/O地址的译码方法与存储器地址的译码方法一样但有它的特点??常采用部分译码方式。
基于AVR 的单片嵌入式系统原理与实践应用第6 章通用I/O接口基本结构与输出应用从本章开始,将从AVR 单片机的基本功能单元入手,讲解其各个外围功能部件的基本组成和特性,以及它们的应用。
ATmega16 芯片有PORTA、PORTB、PORTC、PORTD(简称PA、PB、PC、PD)4 组8 位,共32 路通用I/O 接口,分别对应于芯片上32 根I/O 引脚。
所有这些I/O 口都是双(有的为3)功能复用的。
其中第一功能均作为数字通用I/O 接口使用,而复用功能则分别用于中断、时钟/计数器、USRAT、I2C 和SPI 串行通信、模拟比较、捕捉等应用。
这些I/O 口同外围电路的有机组合,构成各式各样的单片机嵌入式系统的前向、后向通道接口,人机交互接口和数据通信接口,形成和实现了千变万化的应用。
由于刚开始学习I/O 的应用,读者还没有掌握中断和定时计数器的使用,所以在本章的实例中,调用了CVAVR 提供的软件延时函数来实现时间延时等待的功能。
需要指出的是,使用软件延时的方式会造成MCU 效率的下降,而且也不能实现精确的延时,所以在一般情况下应尽量不使用软件延时的方式。
在后面的章节里,会逐步介绍如何使用T/C 和中断实现延时的正确方法。
6.1 通用I/O口的基本结构与特性6.1.1 I/O口的基本结构图6-1 为AVR 单片机通用I/O 口的基本结构示意图。
从图中可以看出,每组I/O 口配备三个8 位寄存器,它们分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。
I/O 口的工作方式和表现特征由这3 个I/O 口寄存器控制。
第 6 章通用I/O 接口基本结构与输出应用方向控制寄存器DDRx 用于控制I/O 口的输入输出方向,即控制I/O 口的工作方式为输出方式还是输入方式。
当DDRx=1 时,I/O 口处于输出工作方式。
此时数据寄存器PORTx 中的数据通过一个推挽电路输出到外部引脚(图6-2)。
AVR 的输出采用推挽电路提高了I/O 口的输出能力,当PORTx=1 时,I/O 引脚呈现高电平,同时可提供输出20mA 的电流;而当PORTx=0 时,I/O 引脚呈现低电平,同时可吸纳20mA 电流。
因此,AVR 的I/O 在输出方式下提供了比较大的驱动能力,可以直接驱动LED 等小功率外围器件。
当DDRx=0 时,I/O 处于输入工作方式。
此时引脚寄存器PINx 中的数据就是外部引脚的实际电平,通过读I/O 指令可将物理引脚的真实数据读入MCU。
此外,当I/O 口定义为输入时(DDRx=0),通过PORTx 的控制,可使用或不使用内部的上拉电阻(图6-3)。
图图6-3 通用I/O 口输入工作方式示意图(带内部上拉)表6.1 是AVR 通用I/O 端口的引脚配置情况。
基于 AVR 的单片嵌入式系统原理与实践应用表 6.1 I/O 口引脚配置表表中的 PUD 为寄存器 SFIOR 中的一位,它的作用相当 AVR 全部 I/O 口内部上拉电阻的总 开关。
当 PUD=1 时,AVR 所有 I/O 内部上拉电阻都不起作用(全局内部上拉无效);而 PUD=0时,各个 I/O 口内部上拉电阻取决于 DDRXn 的设置。
AVR 通用 I/O 端口的主要特点为: 双向可独立位控的 I/O 口ATmega16 的 PA 、PB 、PC 、PD 四个端口都是 8 位双向 I/O 口,每一位引脚都可以单独的 进行定义,相互不受影响。
如用户可以在定义 PA 口第 0、2、3、4、5、6 位用于输入的同时 定义第 1、7 位用于输出,互不影响。
Push-Pull 大电流驱动 (最大 40mA)每个 I/O 口输出方式均采用推挽式缓冲器输出,提供大电流的驱动,可以输出(吸入) 20mA 的电流,因而能直接驱动 LED 显示器。
可控制的引脚内部上拉电阻每一位引脚内部都有独立的,可通过编程设置的,设定为上拉有效或无效的内部上拉电 阻。
当 I/O 口被用于输入状态,且内部上拉电阻被激活(有效)时,如果外部引脚被拉低, 则构成电流源输出电流(uA 量级)。
DDRx 可控的方向寄存器。
AVR 的 I/O 端口结构同其它类型单片机的明显区别是,AVR 采用 3 个寄存器来控制 I/O 端口。
一般单片机的 I/O 仅有数据寄存器和控制寄存器,而 AVR 还多了一个方向控制器,用 于控制 I/O 的输入输出方向。
由于输入寄存器 PINx 实际不是一个寄存器,而是一个可选通 的三态缓冲器,外部引脚通过该三态缓冲器与 MCU 的内部总线连接,因此,读 PINx 时是读 取外部引脚上的真实和实际逻辑值,实现了外部信号的同步输入。
这种结构的 I/O 端口,具 备了真正的读-修改-写(Read-Modify-Write )特性。
图 6-4 通用 I/O 口逻辑功能示意图第 6 章通用 I/O 接口基本结构与输出应用图 6-4 为 AVR 一个(位)通用 I/O 口的逻辑功能图。
右上面的两个 D 触发器为方向控制 寄存器和数据寄存器。
1) 使用 AVR 的 I/O 口,首先要正确设置其工作方式,确定其工作在输出方式还是输入方式。
2) 当 I/O 工作在输入方式,要读取外部引脚上的电平时,应读取 PINxn 的值,而不是PORTxn 的值。
3) 当 I/O 工作在输入方式,要根据实际情况使用或不使用内部的上拉电阻。
4) 一旦将 I/O 口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚 PINxn 的值。
上面的第 4 点是由于在 PINxn 和 AVR 内部数据总线之间有一个同步锁存器(图 6-4 中的 SYNCHRONIZER )电路,使用该电路避免了当系统时钟变化的短时间内外部引脚电平也同时变 化而造成的信号不稳定的现象,但它有产生大约一个时钟周期(0.5~1.5)的时延。
6.1.2 I/O 端口寄存器ATmega16 的 4 个 8 位的端口都有各自对应的 3 个 I/O 端口寄存器,它们占用了 I/O 空 间的 12 个地址(见表 6.2)。
表 6.2 ATmega16 I/O 寄存器地址表PIND $10 0x0030D 口输入引脚寄存器下面是 PA 口寄存器—PORTA 、DDRA 、PINA 各个位的具体定义,以及其是否可以通过指 令读写操作和 RESET 复位后的初始值。
其它 3 个口的寄存器的情况与 PA 口相同,只是地址 PORTA复位值0 0基于AVR 的单片嵌入式系统原理与实践应复位值N/A N/A N/A N/A N/A N/A N/A N/A1)正确使用AVR 的I/O 口要注意:先正确设置DDRx 方向寄存器,再进行I/O 口的读写操作。
2)AVR 的I/O 口复位后的初始状态全部为输入工作方式,内部上拉电阻无效。
所以,外部引脚呈现三态高阻输入状态。
3)因此,用户程序需要首先对要使用的I/O 口进行初始化设置,根据实际需要设定使用I/O 口的工作方式(输出还是输入),当设定为输入方式时,还要考虑是否使用内部的上拉电阻。
4)在硬件电路设计时,如能利用AVR 内部I/O 口的上拉电阻,可以节省外部的上拉电阻。
6.1.3 通用数字I/O口的设置与编程在将AVR 的I/O 口作为通用数字口使用时,要先根据系统的硬件设计情况,设定各个I/O 口的工作方式:输入或输出工作方式,既先正确设置DDRx 方向寄存器,再进行I/O 口的读写操作。
如将I/O 口定义为数字输入口时,还应注意是否需要将该口内部的上拉电阻设置为有效,在设计电路时,如能利用AVR 内部I/O 口的上拉电阻,可以节省外部的上拉电阻。
AVR 汇编指令系统中,直接用于对I/O 寄存器的操作指令有以下3 类,全部为单周期指令:1)IN/OUTIN/OUT 指令实现了32 个通用寄存器与I/O 寄存器之间的数据交换,格式为:IN Rd,AOUT A,Rr 2)SBI/CBI ;从I/O 寄存器 A 读数剧到通用寄存器Rd ;通用寄存器Rr 数据送I/O 寄存器 ASBI/CBI 指令实现了对I/O 寄存器(地址空间为I/O 空间的0x00-0x31)中指定位的置1 或清0,格式为:SBI A,bCBI A,b 3)SBIC/SBIS ;将I/O 寄存器 A 的第b 位置1 ;将I/O 寄存器 A 的第b 位清0SBIC/SBIS 指令为转移类指令,它根据I/O 寄存器(地址空间为I/O 空间的0x00-0x31)的指定位的数值实现跳行转移(跳过后面紧接的一条指令,执行后序的第二条指令),格式为:SBIC A,b ;I/O 寄存器 A 的第 b 位为0 时,跳行执行第 6 章通用I/O 接口基本结构与输出应用ATmega16 的4 个8 位的端口共有12 个I/O 端口寄存器,它们在AVR 的I/O 空间的地址均在前32 个之中,因此上面 3 类对I/O 寄存器操作的指令都可以使用。
在第 5 章的例程Demo_5_1.asm 中,使用了OUT 指令设置PC 口的工作方式为输出,输出全1:.def temp1=r20 。
ser temp1out ddrc,temp1out portc,temp1 ;定义寄存器R20用临时变量名temp1代表;置temp1(R20)为0XFF;定义PC口为输出;PC口输出全―1‖,LED不亮在CVAVR 中,我们可以直接使用 C 的语句对I/O 口寄存器进行操作,如:// 定义PortC口的工作方式PORTC = 0x01; DDRC = 0x01; PORTC.0 = ~PORTC.0; // PC口的第0位输出―1‖,LED不亮// 定义PC口的第0位为输出方式// PC口第0位输出取反其中PORTC.0 = 0 (或PORTC.0 = 1)是CVAVR 中对C 的扩展语句,它实现了对寄存器的位操作。
这种语句在标准C 中是没有的,该扩展更加适合编写单片机的系统程序,因为在单片机的系统程序中,是经常需要直接对位进行操作的。
更加标准的 C 程序可以采用以下的写法:#define BIT0 0#define BIT1 1#define BIT2 2#define BIT3 3#define BIT4 4#define BIT5 5#define BIT6 6#define BIT7 7………PORTC = 1<<(BIT0) | 1<<(BIT3); // PC口的第0位和第3位输出―1‖,其它为―0‖这里,1<<(BIT0)表示逻辑1左移0位,结果为0b00000001;而1<<(BIT3) 表示逻辑1左移3位,结果为0b00001000。