首页 第八章外部系统扩展

第八章外部系统扩展

举报
开通vip

第八章外部系统扩展nullnull第8 章 外部系统的扩展8.1 并行扩展总线 8.2 串行扩展总线 8.3 并行存储器和I/O扩展 8.4 串行扩展介绍系统扩展概述null 系统扩展是指单片机内部各功能部件不能满足应用系统要求时,在片外连接相应的外围芯片以满足应用系统要求。一、为何要进行系统扩展?1)单片机本身的资源有限2)单片机本身接口功能有限 单片机控制应用中的接口要求复杂,而单片机的接口只有数据锁存和缓冲功能,没有控制功能,难以满足复杂的I/O要求。 单片...

第八章外部系统扩展
nullnull第8 章 外部系统的扩展8.1 并行扩展总线 8.2 串行扩展总线 8.3 并行存储器和I/O扩展 8.4 串行扩展介绍系统扩展概述null 系统扩展是指单片机内部各功能部件不能满足应用系统要求时,在片外连接相应的外围芯片以满足应用系统要求。一、为何要进行系统扩展?1)单片机本身的资源有限2)单片机本身接口功能有限 单片机控制应用中的接口要求复杂,而单片机的接口只有数据锁存和缓冲功能,没有控制功能,难以满足复杂的I/O要求。 单片机系统中有两类数据传送操作: 单片机与存储器之间的数据读写操作; 单片机与其它设备之间的数据传送操作。null 单片机与控制对象或外设之间的数据传送通常较复杂, 表现在以下几方面: 1)速度差异大 2)设备种类繁多 低速与高速外设的速度相差很大,所以,单片机无法以一个固定的时序与它们按同步方式协调工作。 各种设备性能各异、对数据要求不同,因此,无法按统一格式进行数据传送。 3) 数据信号形式多样有电压、电流信号,有数字形式、模拟形式。 上述因素使单片机的I/O操作变得很复杂,靠单片机本身的I/O口无法实现,必须扩展接口电路。null 51 单片机的系统扩展主要有如下几种扩展 程序存储器(ROM)的扩展 数据存储器(RAM)的扩展 I/O口(普通I/O口、有特殊功能的接口)的扩展 中断系统扩展1、扩展技术中主要研究、解决的问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 : (1)提供合理的数据通道 (2)物理寻址方法 (3)数据读写的控制方法 (4)收发双方的同步传送及其对信号时序的要求 null二、单片机系统扩展方法 51有很强的外部扩展能力,通过总线来进行扩展,扩展电路及扩展方法较典型、 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 。 总线扩展方法是指:以单片机为核心,通过总线把扩展部件连接起来。常用的单片机系统扩展方法有两种:1) 并行扩展法 利用单片机本身具备的三组总线(AB、DB、CB)进行的系统扩展。null三、最小应用系统 单片机系统的扩展是以基本的最小系统为基础的。 内部有程序存储器的单片机 + 晶振电路 + 复位电路就是一个最简单的最小应用系统。 对于内部无程序存储器的芯片8031来说, 则要用外接程序存储器的方法才能构成一个最小应用系统。 2) 串行扩展法 利用串行总线进行的系统扩展。串行扩展总线有: 单总线(1-Wire总线) I2C双线总线 SPI三线总线三种结构null外接晶振复位电路8051、 8751本身即可构成一片最小系统, 只要将单片机接上时钟电路和复位电路即可, 同时 接高电平, ALE、 信号不用, 系统就可以工作(a) 8051/8751最小系统结构图;(b) 8031最小系统结构图片内无程序存储器的芯片构成最小应用系统时, 须在片外扩展程序存储器。由于EPROM芯片一般不能锁存地址, 故扩展时还应加1个锁存器, 构成一个3片最小系统,null 8.1 并行扩展方法(1)地址总线(AB) P0口(低8位地址A0~A7 ),P2口(高8位地址A8 ~A15)。(2)数据总线(DB) 由P0口提供D0~ D7(3)控制总线(CB) 包括片外系统扩展用控制线和单片机用于接收片外控制的信号线。P2口有输出锁存功能,能保留高8位地址信息。P0是双向、三态控制的8位口一、 外部总线的扩展 用51的P2口输出高8位地址、P0输出低8位地址和传送数据D0~D7,外加地址锁存器构成地址、数据总线,控制总线由51 的RD、WR、PSEN、ALE和EA8.1.1 单片机的并行总线nullALE:用于锁存P0口输出的低8位地址的控制线。ALE在P0口输出地址期间出现低电平,用其下降沿控制锁存器锁存地址数据。 PSEN:输出,用于读片外程序存储器(EPROM)中的数据。“读”取EPROM中数据(指令)时,不能用“ RD ”信号,而只用PSEN信号。 EA:输入,用于选择片内或片外程序存储器。当 EA =0时,只访问外部程序存储器。当 EA=1时,先访问内部程序存储器,内部程序存储器全部访问完之后,再访问外部程序存储器。 RD 、 WR :输出,用于片外数据存储器(RAM)的读、写控制。执行片外数据存储器操作指令MOVX时自动生 成 RD 、 WR 信号,并在数据线有效时输出。 控制总线null8.1.2 并行扩展应注意的问题一、地址锁存器的使用 通过并行扩展方法,可扩展程序存储器、数据存储器和并行I/O口,它们要由地址来区分访问。 由于地址低8位是由P0分时提供,故扩展时必须采用锁存器锁存地址(扩展连接的芯片本身有锁存功能除外)。null 51的读写时序中,锁存允许信号ALE是高电平有效,ALE高电平信号与P0口有效地址信号同时出现,ALE下降沿时锁存低8位地址,ALE低电平时P0口为数据。 因此,应选高电平触发或下降沿触发的锁存器,如:74LS373或8282。对上升沿触发的锁存器则应加一级非门后与锁存器的控制端相连。nullG(高电平锁存)、STB 从高电平转为低电平时锁存常用地址锁存器的引脚和接口73LS273在CLK上升沿锁存所以须将ALE反相接入null TTL芯片74LS373是一个8D三态同相锁存器,其引脚和逻辑如下: D0 D1 D2 D3 D4 D5 D6 D7 GQ0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 OE2 5 6 9 12 15 16 19 174LS373引脚图74LS373真值表3 4 7 8 13 14 17 18 11P0口ALE805174LS373D0 ~ D7Q0 ~ Q7GOEA0~A7A8~A15P2口低位地址分离电路G=1时,D端数据 = Q端数据, G=0时,Q端数据保持,不再受D端变化影响null二、地址范围的确定和片选信号的产生 为了访问扩展的存储单元和I/O口,必须为每个单元和I/O端口分配唯一的地址。 决定地址范围的因素有两个: 1)接口芯片的地址线与单片机的地址总线的连接 2)接口芯片的片选信号的产生方法 连接地址线时,通常都是将接口芯片的地址线与单片机地址总线的若干低位地址线相连,而用剩余的P2口高位地址线来产生片选信号。产生片选信号的方法与微机原理中介绍的相同。二、地址范围的确定和片选信号的产生null三、扩展的存储器与I/O口的编址 51扩展的I/O口与扩展的RAM采用统一编址方式,并用同样的指令MOVX进行访问。所以,当同时扩展有存储器和I/O口时,要注意地址的合理分配、连接,以保证没有地址冲突。 为了在扩展的片外RAM和I/O口中选择唯一的某单元或I/O端口进行操作,需要进行选址。null扩展的片外RAM和I/O口选址过程分2步: 2)片内译码 通过连到芯片地址引脚上的地址线在芯片内部进行译码。 1)片选 即通过高位地址线译码或线选方法产生的“片选” 信号,先找到单元或I/O端口所在的芯片。通过上两步,才能确定唯一的存储单元或I/O端口。null片选常用有“线选”和“地址译码”2种方法。地址译码又分为全译码法、部分地址译码法 1) 线选法:就是直接将单片机最高几位空余地址线中的一根 作为某一扩展芯片的片选。一根地址线对应一个片选。null例: 用“线选”法扩展3片存储器 A10 . . . A0CEA10 . . . A0CEA10 . . . A0CEA10~A0A10~A0A10~A0A13 A12 A11IIIIIInull 片选译码方法分:部分译码 全译码法 线选法的特点:电路简单,但占地址资源多,地址重叠区多,各芯片的地址空间不连续,不能充分利用CPU的最大地址空间。 2)译码法:用剩余的高位地址线进行译码,译码输出作为“片选” 控制线。 采用线选法时要注意: 访问外部数据存储器、I/O接口芯片时,所发出的地址码其做线选的地址线中只能有一个为低电平,以保证同一时刻只选中一片芯片,否则,将引起错误。部分译码法的特点:既能利用CPU的较大的地址空间,又可简化译码电路,但存在地址重叠.null常用的译码器有3/8译码器74LS138、双2/4译码器74LS139、4/16译码器74LS154等。 A15 A14 A13 A12 A11 A10……A0 十六进制地址 芯片 I 1 0 0 0 0 0 …… 0 8000H~ ~ 1 0 0 0 0 1 …… 1 87FFH 芯片 II1 1 0 0 0 1 0 …… 0 8800H~ ~ 1 0 0 0 1 1 …… 1 8FFFH 芯片III 1 1 0 0 1 0 0 …… 0 9000H~ ~ 1 0 0 1 0 1 …… 1 97FFHnull四、控制信号的时序配合 当外扩芯片的操作控制信号的时序与51单片机提供的相应控制信号时序相合时,可以直接与单片机相应引脚相连。 时序上不能与单片机提供的控制信号相配时,可 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 简单组合逻辑电路,对单片机相关的引脚信号进行处理,得到相配的时序信号后连接。全译码法的特点:能充分利用CPU的最大地址空间,芯片的地址空间可连续,无地址重叠,但译码电路较复杂,增加硬件开销.一般在外部扩展大容量的存储器时使用。null8.1.3  总线驱动 扩展使得总线上常挂接很多负载, 但总线接口的负载能力有限, 因此,常需通过总线驱动器进行总线驱动。 总线驱动器对于单片机的I/O口只相当于增加了一个TTL负载, 它除了对后级电路驱动外,还能对负载的波动变化起隔离作用。 null 在对TTL 负载驱动时, 只需考虑驱动电流的大小; 在对MOS负载驱动时, MOS负载的输入电流很小, 更多地要考虑对分布电容的电流驱动。 1. 常用的总线驱动器 地址总线和控制总线是单向的, 因此可选用单向驱动器,如74LS244,它带有三态控制, 能实现总线缓冲和隔离。 null数据总线是双向的,其驱动器要选用双向的,如74LS245, 它是三态的, 有一个方向控制端DIR, DIR=1时输出(An→Bn), DIR=0时输入(An←Bn)。 单向驱动器双向驱动器nullP0 口的驱动 P2 口的驱动2. 51单片机与总线驱动器的接口 单向双向当PSEN、RD任一个有效,LS245传输方向B→A输入 ,当进行RAM写时两者均无效时,传输方向A → Bnull8.3.1.  外部程序存储器的扩展 51 单片机程序存储器的扩展+5Vnull用译码方法扩展4片27128的EPROM电路原理图null8.3.2 外部数据存储器的扩展 1. 外部数据存储器的扩展方法 在要定义大量的数据变量、标志位或需要大量的数据缓冲区的应用系统中,会需要扩展数据存储器。 数据存储器在和单片机的接口上有独立的控制信号线,RD、WR和读写指令,扩展时将RAM芯的OE、WE分别与单片机的RD、WR引脚相连接,数据线和地址线的连接方法与程序存储器扩展的连接相同。数据存储器扩展应注意的问题 必须保证扩展的数据存储器与扩展的I/O芯片的地址没有冲突。null51单片机扩展数据存储器的示意图 null例:扩展2片6264,采线选法寻址。用口线P2.7来寻址 当P2. 7=0时 访问片(0) ,地址范围为6000H ~7FFFH 当P2.7=l时 访问片(1),地址范围为E000H ~FFFFH16K片外数据存储器扩展电路存储器扩展举例null采用地址译码器扩展存储器的连接图 null 51单片机同时扩展程序存储器和数据存储器80C51 +5V也可用地址译码信号使它们具有指定的地址.null扩展既可读又可写的程序存储器 在扩展的ROM中,只能运行但不能修改程序,若把程序放在扩展RAM中,虽可修改却又不能运行程序,因为,对外部ROM和RAM是用不同指令产生不同的读选通信号来访问的。解决的方法:将两者的读访问信号相与后作为扩展RAM的读选通控制信号,从而使之成为可读可写的“程序存储器”。地址线 A10~A0数据线 D7~D0WR WE OERDPSEN片外存储器 读信号 = PSEN · RDnullEEPROM 既能作为程序存储器又能作数据存储器,故可将程序存储器与数据存储器空间合二为一,连接方法如下:PSEN、RD任一个有效时OE有效,只有两者 均无效时OE才无效.null 8.3.3 并行I/O口的扩展(1) 51没有专门的I/O指令,扩展的I/O口与片外RAM统一编址,占用片外RAM地址空间,所有扩展的I/O口或通过扩展I/O口连接的外围设备均采取与片外RAM相同的寻址方法,用MOVX指令访问。1.51单片机I/O口扩展性能 (2) 利用串行口方式0,也可扩展I/O口,所扩展的I/O口不占用片外RAM地址。 null 单片机应用系统中,I/O口的扩展是为外部通道及设备提供输入、输出通道。因此,I/O口的扩展总是为了实现某一测控及管理功能而进行的。如:连接键盘、显示器、驱动开关控制、开关量监测等。 因此,在I/O口扩展时,必须考虑与之相连的外部硬件电路特性,如驱动功率、电平、干扰抑制及隔离等。null2.扩展I/O口使用的芯片 51单片机应用系统中,扩展I/O口所采用的芯片主要有两大类:通用I/O口芯片 如8255和I/O扩展复合芯片8155等。 TTL、CMOS电路芯片 单片机应用系统中常采用这些芯片用来扩展普通8位输入或输出口,它们体积小、成本低、配置灵活, 使用十分方便。null 通过P0口扩展的主要有各类锁存器、三态缓冲器等,如:74LS373、 74LS273 、74LS573、74LS574 、 74LS367 、 74LS374、 74LS377、74LS244等。3.并行I/O口的扩展方法 根据扩展并行I/O口时数据线的连接方式,I/O口扩展可分为总线扩展方法、串行口扩展方法。常用I/O扩展TTL、CMOS芯片 用TTL芯片进行I/O口的扩展, 只要按照“输入三态, 输出锁存”与总线相连的原则, 即能组成简单的I/O 扩展接口。null (2) 串行口扩展方法 利用51的串行口在方式0工作下所提供的I/O口扩展功能。这种扩展只占用串行口. 接上串入并出移位寄存器可扩展并行输出口, 接上并入串出移位寄存器可扩展并行输入口。 通过移位寄存器级联,可扩展多数量、多位的并行I/O口。缺点:传输速度较慢 (1) 总线扩展方法 扩展的I/O芯片的数据线取自P0口。这种扩展方法只分时占用P0口,并不影响P0口与其它扩展芯片的连接操作,不会造成硬件的额外开销。因此,在单片机应用系统的I/O扩展中被广泛采用。null 单片机系统中输入接口的扩展一般选用具有缓冲功能的芯片实现,例如:74LS244 、74LS245等。4、I/O口扩展举例 单片机系统中输出接口的扩展经常选用具备锁存功能的芯片实现,一般有:74LS273,74LS373,74LS573、74LS574等。null 1)简单并行输出接口的扩展CK为时钟输入端G为锁存允许做数据总线时的P0口并没有锁存功能,为了有稳定的输出, 所以,用TTL或CMOS锁存器芯片把数据锁存输出。锁存器、三态门芯片都只有数据线和锁存允许及输出允许控制线,而无地址线和片选信号线,但对扩展I/O口是用MOVX指令以确定的地址来进行访问,所以,要用地址线控制锁存允许、输出允许。null将1个字节数据从用74LS377扩展的I/O输出,用下面程序段: MOV DPTR,#7FFFH ;地址指针指向74LS377 MOV A, #DATA ;将输出数据送A MOVX @DPTR, A ; 输出数据 对于常态数据的输入,只需采用8位三态门控制电路芯片即可。 对于输入,由于是通过数据总线进行,输入时一定要用三态芯片,以免平时对数据总线有影响。注意!: 不是用 MOV P0, #DATA并行扩展I/O口的使用null用74LS244通过P0口扩展8位并行输入口,三态门由P2.6和RD相或控制,故其端口地址为BFFFH。 MOV DPTR,#0BFFFH ;指向74LS244口地址,使A14=0 MOVX A, @DPTR ;读入数据74LS244是双4位三态输入缓冲器D RD P21G、2G为 输出控制端2)简单并行输入接口的扩展null 3)用专用I/O芯片8255扩展并行I/O口复位电路8031与8255的接口方法8.3.4 C51访问扩展的存储器和I/O端口的方法8.3.4 C51访问扩展的存储器和I/O端口的方法 51对外扩的I/O或外扩RAM统一编址,将扩展的I/O口看作片外RAM单元来访问。在C51中如何访问它们? #include //absacc.H包含了能进行绝对地 址访问的宏定义 #define 变量名 XBYTE[地址常数] //指定变量与XDATA 区中的某绝对(字节)地址对应 (外RAM或扩展I/O口的地址) 访问方法一、 采用绝对地址访问的方法,用预定义宏指定变量在xdata空间并使绝对地址与要访问的扩展RAM单元、I/O口相对应。例:对片外的1000H端口进行数据的读操作,设计方法如下例:对片外的1000H端口进行数据的读操作,设计方法如下#include #include #define port XBYTE (0x1000);//将外部1000H端口命名为port 长度为8位。此后, 程序中就用 port对 外部1000H地址的端口进行访问 void main(void) { int temp; While(1) { temp = port; } }访问方法二:访问方法二: 用指针变量访问外RAM或扩展I/O口。设置指针为指向xdata区类型,并在程序中为指针变量设置与访问的外RAM单元或扩展的I/O口相对应的地址。针对上述举例,程序设计如下:#include unsigned char xdata *PORT;//定义一个指向外扩RAM区的无符 号字符类型数据的指针 void main (void) { unsigned int temp; PORT=0x1000; //在程序内,对指针设定地址值,指向要 访问的地址为1000H的外RAM单元或I/O口 While(1) { temp = *PORT;} } ,简单I/O扩展设计应用举例简单I/O扩展设计应用举例例1:应用74273扩展单片机的输出端口,设定74273的端口访问地址为7FFFH,控制数码管显示0-9。设计要求,端口的访问地址为7FFFH,即在地址线上输出时,只有高位P2.7为低电平,其他均为高电平使用/WR与P2.7共同作为74273数据选通的控制信号,与74273的CLK引脚相连。null#include #include #define port XBYTE [0x7FFF] unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f,0x6f}; //设置数码显示数据表 void delay(void) { unsigned int i; for(i=0;i<40000;i++); } void main(void) { unsigned int i; while(1) { for(i=0;i<10;i++) { port=table[i]; //从数码显示字表读取数据,通过74273输出显示 delay(); } } }编程序应注意:在程序中涉及到访问外部寄存器单元地址时,头文件#include 不可缺少② 用define定义端口的格式为: #define 端口名称 XBYTE (端口地址);图8.2.4 简单并行I/O接口扩展电路图8.2.4 简单并行I/O接口扩展电路 例2:用74273、74244芯片实现简单的并行接口扩展电路,实现的功能:按键的状态通过74244缓冲读入,通过74273锁存输出,在八个LED发光二极管上显示。+5VP2.0273、244的片选均通过P2.0实现,因此,访问地址均为FEFF,为了区别两芯片访问,加入/RD、/WR来分别控制对不同芯片的控制端。null#include unsigned char xdata *PORT; //定义访问的外部端口变量 void main() { unsigned int tmp; PORT=0xFEFF; //根据原理图,定义外部端口的地址 While(1) { tmp = *PORT; //从74244端口读取开关状态数据 *PORT =tmp;//将读取的数据通过74273锁存输出 //经硬件电路在发光二极管上显示 } }null例3:用8255扩展输入、输出口实现外接LED由拨动开关相应位的状态进行控制的功能。由图知A口输出:7FFC B口输入:7FFD C口:7FFE D口:7FFFP2.7P2.7null#include #include #define COM8255 XBYTE[0x7FFF] //设置命令控制寄存器地址 #define PA8255 XBYTE[0x7FFC] //设置A口的访问地址 #define PB8255 XBYTE[0x7FFD] //设置B口的访问地址 unsigned char temp; void main(void) { COM8255=0x83; //初始化8255,据题目要求A、B口方式0 //B口输入,A口输出。 while(1) { temp = PB8255; //读入B口数据 PA8255 = temp; //从A口输出 } }null8.2 串行总线扩展串行传输信号的特点:1 0 0 1 1 1 0 1 串行方式传送数据时,数据的所有各位不是同时发送和接收,而是按一定顺序,一位一位地分时传送和接收。这种方式传送成本低,传输距离长,速度慢。 null 与并行扩展一样,串行扩展也要解决下列问题: 数据传送对象(单元/I/O口)地址的选择 数据读写的控制 数据的传输。1.为实现地址、控制、数据信号分时传输,收发双方需要制定严格的协议。 2.如何解决双方同步收发问题? 解决上述问题有多种不同方法,因而产生了多种不同串行总线及其不同的传输协议。 然而,串行总线扩展,通常只有1-2根传输线,因此,地址信号、控制信号和传送的数据只有采用分时传送的办法,用这1条线来传送,那么如何解决上述问题呢?null 目前单片机外部串行扩展常用的串行总线有SPI(Serial Peripheral Interface)接口 I2C(Inter-Integrated Circuit)接口 1-Wire(1-Wire Chips)技术等。 1-WIRE总线具有结构最简单、成本低廉、节省 I/O资源、便于总线扩展和维护等优点。 在SPI总线 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 中,使用3根公共的同步时钟SCK 、数据线MISO、MOSI和独立的从器件选择线SS来完成器件的寻址、读写控制和数据传送的。通信过程由产生SCK时钟信号的主器件(MPU)控制。null SPI总线接口读写速度比I2C总线接口快,通信协议也较简单,因此,SPI总线在单片机控制系统中被广泛使用在与E2PROM、ADC、FRAM和显示驱动器之类的慢速外设器件通信中。 I2C总线标准中,使用串行时钟信号SCL和串行数据/地址线SDA进行信息传输,并允许若干兼容器件共享双线总线,通信过程由产生SCL时钟信号的主器件(MPU)控制。null SPI总线是Motorala公司提出的一种基于四线制的同步串行总线,它是一种在芯片之间通过串行数据线(MISO、MOSI)和串行时钟线(SCK)实现同步串行数据传输的技术。 8.2.1 SPI总线 SPI提供访问一个4线、全双工串行总线的能力,支持在同一总线上将多个从器件连接到一个主器件上,由主器件控制数据向一个或多个从器件传送。 SPI设备可以工作在主方式或从方式中。null⒈ SPI总线结构 一个完整的SPI系统有如下的特性: .全双工、三线同步传送; .主、从机工作方式; .可程控的主机位传送频率、时钟极性和相位 .发送完成中断标志; .写冲突保护标志。 数据传送格式:先传送数据最高位MSBnull一般SPI系统使用四个I/O引脚: ①串行数据线(MISO、MOSI)用于串行数据的发送和接收。 MISO——主机方式输入/从机方式输出数据线 MOSI——主机方式输出/从机方式输入数据线 在SPI设置为主机方式时,MISO线是主机数据输入线,MOSI是主机数据输出线; 在SPI设置为从机方式时,MISO线是从机数据输出线,MOSI是从机数据输入线。null 在SPI器件设置为主机方式时,主机启动一次传送后会自动在SCK脚产生8个时钟周期。主机和从机SPI器件在SCK信号的一个跳变时进行数据移位,数据稳定后的另一个跳变时进行采样。②串行时钟线(SCK) SCK用于同步从MISO、MOSI引脚输入、输出的数据传送。在SPI器件设置为主机方式时SCK为输出;在SPI器件设置为从机方式时SCK为输入。 null 对于一个完整的SPI系统,串行数据和串行时钟之间有四种极性和相位关系,以适应不同的外围器件特性。主机和从机器件之间的传送定时关系必须相同。起始电平为低电平起始电平为高电平采样时间在上升沿采样时间在下降沿null ③从机选择( ) 在从机方式时, 脚是输入端,用于使能SPI从机进行数据传送;在主机方式时, 用来保护在主方式下SPI同步操作所引起的冲突,逻辑0禁止SPI,清除MSTR位。一般由外部置为高电平, 。 通过SPI可以扩展各种I/O功能,包括:A/D、D/A、实时时钟、RAM、EEPROM及并行输入/输出接口等。null SPI总线接口的典型电路如下图所示。采用1个主器件和n个从器件构成。主器件产生时钟信号,控制着数据向1个或n个从器件传送,从器件在主机发命令时才能接收或发送数据。 2.SPI串行总线的接口电路null 对于没有SPI接口的 51单片机,可以用两种方法来实现与SPI外设的接口。 ② 串行时钟极性和相位之间的关系、传送速率都是固定的,不可编程改变。3. 51单片机串行扩展SPI外设的接口 1)用串口方式0提供简化的SPI同步串行通信功能①只有两个引脚:RXD(MOSI/MISO)和TXD(SCLK)其特点是:null 2)通用I/O口来模拟SPI串行接口,用软件来模拟仿真SPI操作。③由于串行数据输入、输出是同一根线,要由软件设置数据传送方向。 ④串行数据线上传送数据位的顺序为先LSB后MSBnull 8.2.3 I2C总线 I2C总线(Intel IC BUS)是Philips公司推出的一种基于两线制的同步串行数据传输总线。被广泛用于消费类电子产品、通信产品、仪器通信及工业总线中。SDA:串行数据线,双向传输数据。 SCL:串行时钟线,传输时钟信号,在传输过程中用来同步数据线上的数据传送1、 I2C总线系统结构null 挂在I2C总线上的器件必须有I2C总线接口,它们的SDA和SCL引脚都是开漏结构,都需通过电阻与电源连接。所有器件的同名端相连接。作为主控件的单片机可以没有I2C总线接口。 在I2C 总线上的器件根据其功能可分为两种:主控器件和从控器件。 主控器件:控制总线存取,产生串行时钟信号SCL,并产生启动传送及结束传送的信号,总线必须由一个主控器件控制。 从器件:在总线上被主控器件寻址的器件,它们根据主控器件的命令来接收和发送数据。null 1) I2C总线采用两线制,由双向数据线SDA和时钟SCL构成,为同步传输总线,数据线上信号完全与时钟同步,可进行全双工数据传送。2、I2C总线特点 3)总线采用了器件地址硬件设置,无须用外围器件片选信号方式的寻址方法。可以并行扩展多个外围器件。2)总线平时通过上拉电阻接到电源,在空闲情况下,2根线都处于高电平。4)系统中的器件有四种可能的工作方式:主发送方式、主接收方式、从发送方式和从接收方式。null 6)是一个真正的多机总线,如果两个或更多主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据被破坏。 5)I2C总线指定了严格的规范,包括:接口的电气特性、信号时序、信号传输的定义等。 7)由于I2C增加了用于同步的时钟线SCL,可以大大提高数据的传输速度。标准模式下可达100kbit/s快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。null3、 I2C总线工作原理 1) 数据传送采用主从方式,由主控器件来寻址从器件、启动总线、产生时钟、传送数据及结束数据的传送。 2) I2C总线上所有器件都有规范的器件地址,它由器件的固有地址及其地址引脚电平决定,对器件的寻址采用软件方法。 I2C总线器件地址由七位组成,它与1位方向位共同构成了I2C总线器件的寻址字节SLA。null寻址字节SLA器件地址引脚地址方向位DA3-DA0是I2C器件固有地址编码,出厂时已给定。如: E2PROM AT24C02的地址为1010,4位LED驱动器SAA1064的地址为0111。同类器件具有同样的地址编码A2、A1、A0是由I2C器件引脚连接状态形成的地址码。这些引脚可接电源或地,这部分可变地址可区分线上同类器件,也决定了总线上可连接的同类器件的数量。null3)、I2C总线信号类型和时序1) I2C总线在传送数据过程中共有4种类型信号。开始信号(S):SCL为高电平时,SDA由高电平向低 电平跳变,开始传送数据。结束信号(P):SCL为高电平时,SDA由低电平向高 电平跳变,结束传送数据。 方向位R/ W 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 了总线上的主器件与从器件的数据传送方向。R/ W=1表示接收(读),R/ W=0表示发送(写)。null应答信号(A):接收数据的器件在接收到8位数据后, 向发送器件发出特定的低电平脉冲,表示 已收到数据。发送器接收到应答信号后,根 据实际情况做出是否继续传递信号的判断。 若未收到应答信号,则判断为接收器件出现 故障。非应答信号(A):接收数据的器件在接收到8位数据 后,向发送器件发出高电平为非应答信号。 主器件接收从器件数据时,接收到最后一个字节数据后,必须给从器件发送1个非应答信号,使从器件释放数据总线,以便主器件发送停止信号,从而终止数据传送。null 4) I2C总线的四种状态和数据传输时序I2C数据传送时序SCL高电平期间,SDA状态的改变,被用来表示起始和停止条件null ①在I2C总线上进行数据传输时要严格遵守其时序、协议,保证做到: ★ 数据有效转换开始后的数据传输过程中,当时钟线SCL为高电平时,数据线SDA必须保持稳定(否则会被认为是发出启动、停止信号)。传输的数据的变化即改变数据线SDA时,必须在时钟线SCL为低电平时方可进行。说明:②主器件在传输数据结束后,即产生停止信号,推出主器件角色,经过一定时间后,总线处于空闲状态。null ③ 任一器件在总线空闲时,一旦产生起始信号,即开始控制总线而成为主器件,此时,总线处于忙状态,其他器件不能再产生起始信号,否则,该主器件控制的数据传输无法正确完成。 ④ 在一个通信过程中,应该有一个起始信号和一个停止信号,如果两者之间有起始信号产生,该信号被称为重复起始信号。null5) 数据传输格式 由于数据和地址信号都用一根数据线SDA来传输,何时传输地址?什么时候是主器件读?什么时候是主器件写?如何保证传输的正确?必须有一个共同接受的规定(协议): ①.主控器件写操作 主器件向被控器件发送n个数据的数据格式如下:null②主控器件读操作 主器件向被控器件读n个数据的数据格式如下: ③主控器读写操作 主控器读写操作是指主控期间在一次数据过程中需要改变数据传送方向的操作。此过程中的读、写操作分别与上述方法一样,只是在数据传送方向改变后,必须由主控器件发出从新启动信号,并发一个寻址字节,因为,数据字节的传送方向决定于寻址字节的方向位。SLAR/W A DATA1 A其中:Sr为重复起始信号null作业: 1.用8031单片机,并采用一片2716(2KB)和一片8255组成一个既有程序存储器又有扩展I/O口的扩展系统,请: (1)画出逻辑电路图 (2)说明其存储空间 2.请利用74HC138设计一个译码电路,分别选中4片2764,且列出各芯片所占的地址范围: Y0芯片地址范围0000H-1FFFH, Y1芯片地址范围2000H-3FFFH, Y2芯片地址范围4000H-5FFFH, Y3芯片地址范围6000H-7FFFH. null#define uchar unsigned char sbit SDA =P1^0 ; //串行数据线 sbit SCL =P1^1 ; //串行数据线 uchar idata SLAdd; //存从器件地址变量 uchar idata sbuf[8]; //数据发送缓冲区 uchar idata rbuf[8]; //数据接收缓冲区 bit bdata NACK ; //器件坏或错误标志数据位 bit bdata nackFlag ; //非应答标志位利用51单片机模拟I2C总线接口的单片机程序P1.0 P1.18051VCCR=4.7K0.01µfSDA SCLnullvoid start(void) { SDA = 1; // 启动I2C总线 SCL = 1; delay5us(); //起始条件建立时间>4.7µS SDA = 0; delay5us(); //起始条件锁定时间>4.7µS SCL = 0; //钳住SCL总线,准备发送数据 }/*产生起始信号子函数:要求在时钟为高电平期间数据线由高变低。 */SDASCLvoid delay5us() /* 延时约5微秒,对于12M时钟 */ { uint i; for (i=0;i<5;i++) _nop_(); }null/* 产生停止信号子函数:要求在时钟为高电平期间数据线由低变高。 */ SDASCLvoid stop(void) { //停止I2C总线数据传送 SDA = 0; SCL = 1; //发送停止条件的时钟信号 delay5us(); SDA = 1; //停止总线 delay5us(); SCL = 0; }null/* 发送应答位”0”子函数:要求主控器件向被控器件发送”0”应答信号,并立即在SCL上发出与应答位对应的第9个时钟*/ SDASCLvoid ack(void) { SDA = 0; // 发送应答位“0” SCL = 1; //紧跟着发送对应应答位的第9个时钟 delay5us(); //保持数据时间要>4.7µS SCL = 0; SDA = 1; //释放数据线 }null/* 发送非应答位”1”子函数 : :要求主控器件向被控器件发送”1”非应答信号,并立即在SCL上发出与非应答位对应的第9个时钟*/ SDASCLvoid n_ack(void) { SDA = 1; // 发送非应答位“1” SCL = 1; //紧跟着发送对应应答位的第9个时钟 delay5us(); //保持数据时间要>4.7µS SCL = 0; SDA = 0; }null/* 应答位检查子函数:用于检查一字节数据传送后,被控控器件在第9位时钟期间是否发回”0”的应答,若是,程序置nackFlag标志为0,否则置nackFlag标志为1。 */ void checkack(void) { SDA = 1; // 应答位检查是I/O输入,必将p1.0设置成 //输入,即先向端口写1) SCL = 1; nackFlag = 0; //非应答标志初设为“0”(无非应答) if(SDA == 1) // 若读数据线SDA=1表明检测到非应答 nackFlag = 1; //置位非应答标志nackFlag=1 SCL = 0; }null/* 发送一个字节数据子函数 */ void sendbyte(uchar idata *ch) //*ch为指向发送缓冲区的指针 { uchar idata n = 8; //1个字节数共发送8位 uchar idata temp; //待发数据暂存变量 temp = *ch; while(n--) //控制发送8位 { if((temp&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1 { SDA = 1; // 送位”1”至数据线 _nop_(); SCL = 1; // 产生 发送时钟 上升沿 delay5us(); SDA = 0; // 使SDA回到0状态(可以试去掉此步) SCL = 0; } null else { SDA = 0; // 否则送位”0”上数据线 _nop_(); SCL = 1; // 产生时钟 上升沿 delay5us(); SCL = 0; } temp = temp<<1; // 数据左移一位 } }null/* 接收一字节子程序 */ void recbyte(uchar idata *ch) //*ch为指向接收缓冲区的指针 { uchar idata n=8; // 从SDA线上读取一字节,共8位 uchar idata temp = 0; //待接收数据暂存变量初始化为0 while(n--) { SDA = 1; //将数据线对应口线置1,使得可正确输入 SCL = 1; // 产生时钟 上升沿使发方发送数据有效 temp = temp<<1; //接收数据变量左移一位准备接收1位数据位 if(SDA == 1) //若接收到的位为1, temp = temp|0x01; //则将接收数据变量的最后一位置1 else temp = temp&0xfe; // 否则接收数据变量的最后一位置0 SCL=0; } *ch = temp; //接收数据送接收缓冲区 }null/* 主控器件发送n个字节数据给从器件子程序 */ void sendnbyte(uchar idata *sla, uchar n) //*sla为指 //向从器件地址存放处的指针 { uchar idata *p; //定义指向发送数据所在单元的指针p start(); // 发送启动信号 sendbyte(sla); // 发送从器件地址字节 checkack(); // 检查应答位 if(nackFlag == 1) // 若为非应答,表明器件错误或已坏 { NACK = 1; //则置错误标志位NACK return; //返回 } p = sbuf; // 回送的是应答信号,将发送数据区地址赋给指针P nullwhile(n--) //控制发送n个字节的数据 { sendbyte(p); //调用发送1个字节的函数发送1个数据 checkack(); // 检查应答位 if (nackFlag == 1) // 若为非应答表明器件错误或已坏 { NACK=1; //置错误标志位NACK return; //返回 } p++; //回送的是应答信号,则从件正确接收到,修改指针P } stop(); // 全部发完,调用发送停止信号的函数结束传输 }作业/* 主控器件从从器件接收n个字节数据子程序 */
本文档为【第八章外部系统扩展】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_091337
暂无简介~
格式:ppt
大小:3MB
软件:PowerPoint
页数:0
分类:工学
上传时间:2011-06-19
浏览量:23