570 likes | 721 Views
在单片机应用系统的设计中 , 往往出现 RAM, ROM 或者 I/O 口不够的情况,怎么办?. ROM 的扩展. RAM 的扩展. I/O 口的扩展. 问题的提出. 第 8 章 单片机小系统及片外扩展. 系统扩展. 1 、扩展系统是以单片机为核心进行的; 2 、扩展内容包括 ROM 、 RAM 、和 I/O 接口电路等; 3 、扩展是通过 系统总线 进行的,通过总线把各扩展部件连接起来,并进行数据、地址和信号的传送,要实现扩展首先要构造系统总线。 ( 尽可能采用串行扩展方案 ). 本章内容.
E N D
在单片机应用系统的设计中,往往出现RAM, ROM或者I/O口不够的情况,怎么办? ROM的扩展 RAM的扩展 I/O口的扩展 问题的提出
系统扩展 1、扩展系统是以单片机为核心进行的; 2、扩展内容包括ROM、RAM、和I/O接口电路等; 3、扩展是通过系统总线进行的,通过总线把各扩展部件连接起来,并进行数据、地址和信号的传送,要实现扩展首先要构造系统总线。 (尽可能采用串行扩展方案)
本章内容 • 8.1 串行扩展总线接口技术 • 8.2 并行扩展三总线的产生 • 8.3 程序存储器的扩展 • 8.4 数据存储器的扩展 • 8.5 I/O口接口扩展电路设计
8.1 串行扩展总线接口技术 • SPI串行外设接口总线:同步串行3线方式 • I2C总线:同步串行2线 • 单总线:采用单根信号线,既可作为数据输入,又可以作为输出,而且数据传输是双向的,适用于单主机系统 • CAN总线:多主竞争式的串行数据通信协议,实时,特别适合工业过程监控设备的互连,最有前途的现场总线之一 。需CAN控制器
SPI串行外设接口总线 • 同步串行方式 • 需3~4条线:串行时钟线(SCK)、 主机输入/从机输出数据线MISO、 主机输出/从机输入MOSI、 从机片选线CS • 许多外设都具有SPI接口,如FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器等
89C51单片机串行扩展SPI外设接口的方法 • 用一般I/O口线模拟SPI操作 • 利用串行口实现SPI操作
用一般I/O口线模拟SPI操作 • 根据SPI串行总线的操作时序特点 ,进行软件模拟 X25F008(E2PROM)
X25F008具有SPI接口,且在SCK的上升沿接收数据,在下降沿发送数据。则MCU在下降沿时接收数据。X25F008具有SPI接口,且在SCK的上升沿接收数据,在下降沿发送数据。则MCU在下降沿时接收数据。 MCU串行输入子程序SPIIN SPIIN:SETB P1.1 ;使P1.1(时钟)输出为1 CLR P1.2 ;选择从机 MOV R1,#08H ;置循环次数 SPIIN1:CLR P1.1 ;使P1.1(时钟)输出为0 NOP ;延时 NOP MOV C,P1.3 ;从机输出SPISO送进位C RLC A ;左移至累加器ACC SETB P1.1 ;使P1.1(时钟)输出为1 DJNZ R1,SPIIN1 ;判断是否循环8次(8位数据) MOV R0,A ;8位数据送R0 RET
MCU串行输出子程序SPIOUT 将MCS-51单片机中R0寄存器的内容传送到X25F008的SPISI线上的程序如下: SPIOUT:SETBP1.1;使P1.1(时钟)输出为1 CLRP1.2;选择从机 MOVR1,#08H;置循环次数 MOVA,R0;8位数据送累加器ACC SPIOUT1:CLRP1.1;使P1.1(时钟)输出为0 NOP;延时 NOP RLCA;左移至累加器ACC最高位至C MOVP1.0,C;进位C送从机输入SPISI线上 SETBP1.1;使P1.1(时钟)输出为1 DJNZR1,SPIOUT1;判是否循环8次(8位数据) RET
MCU串行输入/输出子程序SPIIO 将MCS-51单片机R0寄存器的内容传送到X25F008的SPI SI中,同时从X25F008的SPI SO接收8位数据的程序如下: SPIIO:SETBP1.1;使P1.1(时钟)输出为1 CLRP1.2;选择从机 MOVR1,#08H;置循环次数 MOVA,R0;8位数据送累加器ACC SPIIO1:CLRP1.1;使P1.1(时钟)输出为0 NOP;延时 NOP MOVC,P1.3;从机输出SPISO送进位C RLCA;左移至累加器ACC最高位至C MOVP1.0,C;进位C送从机输入 SETBP1.1;使P1.1(时钟)输出为1 DJNZR1,SPIIO1;判断是否循环8次(8位数据) RET
X1 89C51 TXD SCLK I/O RST 32kHz RXD X2 P1.0 利用串行口实现SPI操作 串行时钟芯片HT1380与89C51接口电路
利用51单片机串口扩展SPI口的特点 • 需要通过单片机的开关量I/O口线进行芯片选择; • 当芯片未选中时,数据端口均处于高阻状态; • 与单片机交换信息时均要求单片机串行口以方式0进行; • 传输数据时的桢格式局要求先传送命令/地址,再传送数据。 因为In/Out共享一个RXD线,需先识别读/写
I2C总线 • 同步串行 • 需两根信号线:数据线SDA和时钟线SCL。 • 纯软件的寻址方法(故无需片选线) • 支持多主控(multimastering) 由PHILIPS公司开发的两线式串行总线。
常用I2C外围器件 • SRAM • EPROM • ADC/DAC • RTC • I/O等 支持热插拔
单片机A 专用集成电路 液晶显示驱动器 I2C总线 A/D、D/A转换器 静态RAM或EEPROM SDA SCL 单片机B 图8-9 I2C总线典型系统示意图
总线上每一个节点都有一个固定的节点地址 • 主机发送的第一个字节为寻址字节 • 数据传输需遵循规定的传输格式
I2C总线寻址字节 • 在起始信号之后,必须是器件的寻址字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作
I2C总线基本操作 • I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。
I2C总线在传送数据过程中典型信号 • 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 • 结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。 • 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
Vcc 具有I2C总线 接口的外设 SCL SDA 51单片机 P1.6 P1.7 51单片机与I2C总线的接口 对不带I2C接口的51单片机,若去控制总线,只需两个I/O口线,用软件模拟数据传送典型信号时序。如起始位、终止位、应答位、非应答位、发送字节、接收字节等。 数据传送模拟程序,包括: 应答位检查子程序,发送一字节子程序,接收一字节子程序,发送N字节子程序,接收N字节子程序。
P210 启动 I2C总线子程序STA void I2C_Start(void) { /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/ SDA=1; SCL=1; DELAY(DELAY_TIME); SDA=0; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); }
P210 停止 I2C总线子程序STOP void I2C_Stop(void) { /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/ SDA=0; SCL=1; DELAY(DELAY_TIME); SDA=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); }
发送应答位ACK void SEND_0(void) /* SEND ACK */ { /*发送0,在SCL为高电平时使SDA信号为低*/ SDA=0; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); }
发送非应答位MNACK void SEND_1(void) { /*发送1,在SCL为高电平时使SDA信号为高*/ SDA=1; SCL=1; DELAY(DELAY_TIME); SCL=0; DELAY(DELAY_TIME); }
应答位检查子程序CACK • bit Check_Acknowledge(void) { /*发送完一个字节后检验设备的应答信号*/ SDA=1; 置SDA为输入方式SCL=1; 使SDA上数据有效 DELAY(DELAY_TIME/2); F0=SDA; DELAY(DELAY_TIME/2); SCL=0; DELAY(DELAY_TIME); if(F0==1) return FALSE; return TRUE; }
从I2C总线读一个字节RDBYT char ReadI2CByte(void) { /*从I2C总线读一个字节*/ char b=0,i; for(i=0;i<8;i++) { SDA=1; /*释放总线*/ SCL=1; /*接受数据*/ DELAY(10); F0=SDA; DELAY(10); SCL=0; if(F0==1) { b=b<<1; b=b|0x01; } else b=b<<1; } return b; }
向I2C总线写一个字节 void WriteI2CByte(char b) { /*向I2C总线写一个字节*/ char i; for(i=0;i<8;i++) if((b<<i)&0x80) SEND_1(); else SEND_0(); }
向24c02 (I2C EEPROM)发送一字节的模拟子程序 • void Write_One_Byte(char addr,char thedata) { bit acktemp=1; /*write a byte to mem*/ I2C_Start(); WriteI2CByte(0xa0); acktemp=Check_Acknowledge(); WriteI2CByte(addr);/*address*/ acktemp=Check_Acknowledge(); WriteI2CByte(thedata);/*thedata*/ acktemp=Check_Acknowledge(); I2C_Stop(); }
读取一字节的模拟子程序 char Read_One_Byte(char addr){ bit acktemp=1; char mydata; /*read a byte from mem*/ I2C_Start(); WriteI2CByte(0xa0);启动总线 acktemp=Check_Acknowledge(); WriteI2CByte(addr);/*address*/ acktemp=Check_Acknowledge(); I2C_Start(); WriteI2CByte(0xa1); 重新启动总线 acktemp=Check_Acknowledge(); mydata=ReadI2CByte(); acktemp=Check_Acknowledge(); return mydata; I2C_Stop();}
8.2 并行扩展三总线的产生 地址总线AB——P2,P0(373锁存器) 数据总线DB——P0 控制总线CB——ALE, , , 程序存储器 RAM,I/O
8051有片内ROM的容量:4K • 片外最大可扩展64K ROM。 • 有关的管脚:EA 可用来扩展的存储器芯片: EPROM:2716(2K*8),2732,2764,27256等 EEPROM:2816 (2K*8) ,2864,28128等 • 还要用到锁存器芯片:例74LS373。 8.3 程序存储器的扩展 片内资源
访问程序存储器的控制信号 • ALE :指示74LS373锁存低8位地址 • :用于选通片外程序存储器,接片外ROM的 引脚 • :CPU读取片内/片外程序存储器的控制信号。高电平访问片内存储器,低电平访问片外存储器。
A11 A8 A7 A0 2732 O7 O0 OE CE ``` ``` P2.3 P2.0 P0.7 89C51P0.0 ALE PSEN 12根地址线 ``` ``` 8根数据线 . . . 控制线 EPROM扩展实例----在89C51单片机上扩展4KB EPROM D7 Q7 373 D0 Q0 G
ALE PSEN 读外部程序存储器时序 一个机器周期 送地址 取出指令 注意:上述时序是在取指令过程中自动产生
地址范围的确定 • 取决于CE(片选)和地址线的接法,本例中CE接地。请确定地址范围 • 要求根据电路图,确定其中EPROM的地址范围。 • 注意:当同时扩展多片ROM时,可采用译码法或线选法来分别选中芯片,每个芯片分配的地址范围不同。
74LS373是带三态输出的地址锁存器。三态控制端 接地,以保持输出常通,cp(G)端接8031的ALE引脚,每当ALE端的电平产生复跳变时, 74LS373锁存低8位地址线,并输出供2764使用。 • 2764是8K*8bit的EPROM,有13根地址线(A12~A0),2764的片选信号 由P2.5送出,低电平有效, 端与8031的 引脚信号相连接,当 信号有高电平变成低电平时,允许2764输出。
0000 0000 0000 0000-0001 1111 1111 11110100 0000 0000 0000-0101 1111 1111 11111000 0000 0000 0000-1001 1111 1111 11111100 0000 0000 0000-1101 1111 1111 1111 地址范围 P2.5
利用译码器选通存储器 接地,常有效 地址:4000H ~ 7FFFH 存储器地址线14条,容量16K 全译码,地址不重叠
当A15=0时,选通139,A14A13=00,1#01,2#10,3# 0010 0000 0000 0000-0011 1111 1111 1111 4000-5FFF 2000-3FFF 0000-1FFF
8.4 数据存储器的扩展 • 静态RAM:6116,6264,62256,62128 地址线、数据线、控制线 由CPU地址线或经译码器选通,并获得地址; 由CPU (P3.7)选通; 由CPU (P3.6)选通。 当CPU执行输入/输出指令MOVX时, 、 有效 • E2PROM:2816,2817,2864A。
ALE PSEN 访问ROM,取出MOVX指令 送地址 访问RAM读/写数据 读/写外部数据存储器时序 一个机器周期 一个机器周期 RD/WR 注意:上述红色线时序是在执行MOVX 指令情况下
扩展注意的问题: • 读写控制 • 片选控制 • 地址的分配: 地址是一个范围空间
A10 A8 A7 A0 6116 O7 O0 RD WR CE P2.2 P2.0 P0.7 8051 P0.0 ALE RD WR P2.7 . . RAM扩展实例----在8051单片机上扩展2K RAM D7 Q7 373 D0 G Q0
扩展存储器举例(PM,DM) 32K,A15(P 2.7)选通,地址:0000H-7FFFH
扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 扩展I/O口与外部RAM统一编址 使用同样的指令MOVX访问——控制总线RD/WR 8.5 I/O口接口扩展电路设计 • 51单片机有4组并口P0-P3,为什么还要扩展I/O口? 常用的扩展方法有: • 简单的I/O口扩展 • 可编程I/O口芯片 • 利用串行口扩展并行口 串口工作在什么方式?
简单I/O口扩展 • 用并行口扩展I/O口 选择TTL电路或MOS电路即能组成简单的扩展I/O口。 如:用8位三态缓冲器74LS244可扩展输入口; 用8D锁存器74LS273、74LS373、74LS377 等可组成输出口。