第9章串行总线接口技术课件.ppt
1,2022/12/1,单片机原理与应用电子课件,第 9 章,串行总线接口技术,2022/12/1,2,本章主要内容,9.1 SPI串行总线接口技术9.2 I2C总线接口技术9.3 单总线(1-wire)接口,2022/12/1,3,第9章 串行总线接口技术,由于数据的串行传输连线少,因而采用串行总线扩展技术可以使系统的硬件设计简化,系统的体积减小,同时,系统的更改和扩充更为容易。 目前,单片机应用系统中常用的串行扩展总线有:I2C(Inter IC BUS)总线、SPI(Serial Peripheral Interface)总线、Microwire总线及单总线(1-Wire BUS)。 串行扩展总线的应用是单片机目前发展的一种趋势。AT89系列单片机利用自身的通用并行线可以模拟多种串行总线时序信号,因此可以充分利用各种串行接口芯片资源。本章主要介绍I2C总线、SPI总线及单总线(1-Wire BUS)的基本知识、常用的串行总线接口器件及和单片机的接口应用。,2022/12/1,4,9.1 SPI串行总线接口技术,9.1.1 SPI串行总线简介 SPI接口的全称是“Serial Peripheral Interface”,意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般包括以下四种信号:MOSI 主器件数据输出,从器件数据输入 MISO 主器件数据输入,从器件数据输出 SCLK 时钟信号,由主器件产生 /ss 从器件使能信号,由主器件控制,2022/12/1,5,SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。 对于大多数不带SPI串行总线接口的AT89系列单片机来说,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。,2022/12/1,6,9.1.2 SPI串行接口A/D转换器TLC549及其软硬件设计 TLC549是美国德州仪器公司生产的8位串行A/D转换器芯片,通过SPI接口与单片机连接,从CLK输入的频率最高可达1.1MHz。 TLC549具有4MHz的片内系统时钟,片内具有采样保持电路,A/D转换时间最长17s,最高转换速率为40 000次/s。 TLC549的电源范围为+3V- +6V,功耗小于15Mw,总失调误差最大为0.5LSB,适用于电池供电的便携式仪表及低成本高性能的系统中。,2022/12/1,7,1.引脚功能TLC549有8个引脚,如图9-1所示。各引脚功能说明如下:REF+:正基准电压输入端,2.5VREF+VCC+0.1V。REF-:负基准电压输入端, -0.1VREF-2.5V,且要求REF+ REF-1V。在要求不高时,也可将REF-接地,REF+接VCC。 AIN:模拟信号输入端,0AINVCC,当AINREF+时,转换结果为全1(FFH),AINREF-时,转换结果为全“”(00H)。/CS:芯片选择输入端,低电平有效。 DO:数据串行输出端,输出时高位在前,低位在后。 CLK:外部时钟输入端,最高频率可达1.1MHz。,图9-1 TLC549引脚图,2022/12/1,8,2TLC549的时序 TLC549的时序如图9-2所示。/CS变为低电平时,TLC549芯片被选中,同时从DO端输出前次转换结果的最高有效位A7; 接着自CLK端输入个外部时钟信号,前个CLK信号输出上次转换结果的A6-A7位。 在第个CLK信号由高至低的跳变之后,片内采样/保持电路对输入模拟量采样开始,第个CLK信号的下降沿使片内采样/保持电路进入保持状态并启动本次A/D开始转换。,图9-2 TLC549的时序,2022/12/1,9,TLC549没有启动控制端,只要读走前一次数据后马上就进行新的转换,转换完成后就进入保持状态,转换时间为36个系统时钟周期,最大为17uS。没有转换完成标志信号,只要采用延时操作即可控制每次读取数据的操作。3TLC549与单片机的接口 TLC549与单片机的连接如图9-3所示。采用P1.0P1.2连接TLC549的串行接口。,图9-3 TLC549与单片机的硬件连接,2022/12/1,10,A/D转换的汇编语言程序:DO BIT P1.2CLK BIT P1.1CS BIT P1.0 TLC549_AD: CLR A ; TLC549 A/D转换子程序,转换结果在A中 CLR CLK MOV R5,#08H CLR CS ;选中TLC549 LOOP: SETB CLK ;产生时钟 NOP NOP NOP NOP MOV C,DO ;读取A/D转换的一位数据 RLC A ;左移进入A CLR CLK,2022/12/1,11,NOP NOP DJNZ R5,LOOP ;判8次数据是否读完 SETB CS SETB CLK RET,2022/12/1,12,A/D转换的C语言程序:sbit DO = P12sbit CLK = P11sbit CS = P10bdata Unsigned char addata;sbit adin0 = addata 0; unsigned char TLC549 _ad(void) /*A/D转换程序*/ unsigned char i; Clk=0; CS=0; /*令CS为低选中TLC549*/ _nop_();,2022/12/1,13,for(i=0;i8;i+) /*循环读取8位A/D转换结果*/ CLK =1; /*令CLK引脚为高,产生时钟*/ delay( ); /*延时*/ adin0 =DO; /*读取A/D转换后数据线的一位数据*/ addata = addata 1; /*左移一位,先读取为高位,后读为低位*/ CLK=0; /*令CLK恢复为0*/ _nop_( ); _nop_( ); return addata; /*返回A/D转换值*/void delay ( ) unsigned char i; for(i=0;i20;i+) ,2022/12/1,14,4简易数字电压表的设计举例 利用TLC549 A/D转换器设计一个简易数字电压表,用4位LED显示器将被测电压显示出来,测量范围为0.000V-5.000V。将TLC549的、CLK、DO接到单片机的三条I/O口线, REF+、REF-直接接到Vcc、GND,模拟输入AIN接电位器的中心抽头,调节电位器即可改变被测输入电压值,硬件连接如图9-4所示。,图9-4 简易数字电压表硬件连接图,2022/12/1,15,软件设计的基本思路: 程序首先通过调用TLC549_ad( ),读取A/D转换结果存入addata,然后按公式u = addata /2555000(mV)计算电压值,再将u转换为4位BCD码送显示缓冲区,并调用显示程序disp_ad( )将其转换为字型码显示出来,显示格式为x.xxxx,单位为v。程序请参照课本.,2022/12/1,16,9.1.3 SPI串行接口D/A转换器TLC5615及其软硬件设计 TLC5615 是SPI接口的10位电压输出的D/A转换器,通过3根串行总线就可以完成10 位数据的串行输入,易于和工业标准的微处理器或单片机接口,适用于电池供电的测量仪表、移动电话以及工业控制场合。其主要特点如下:5V单电源工作;3 线串行接口;DAC 输出的最大电压为2 倍基准输入电压; 上电时内部自动复位,确保可以重复启动;功耗低,最大功耗为1.75mW。,2022/12/1,17,1TLC5615的内部结构和引脚功能 TLC5615的内部结构如图9-5所示,内部包含: 一个电压跟随器为参考电压端REFIN提供高输入阻抗 ; 10位DAC2 电路提供最大值为2倍于REFIN 的输出; 一个16 位移位寄存器, 接受串行移入的二进制数,并且有一个级联的数据输出端DOUT; 并行输入输出的10位DAC寄存器, 为10位DAC电路提供待转换的二进制数据。,图9-5 TLC5615的内部结构,2022/12/1,18,TLC5615的引脚如图9-6所示,各引脚功能如下:DIN:串行二进制数输入端 SCLK:串行时钟输入端/CS:芯片选择,低有效 DOUT:菊花链的串行数据输出端(用于多芯片的级联) REFIN:基准电压输入端 OUT:DAC 模拟电压输出端,图9-6 TLC5615的引脚,2022/12/1,19,2、TLC5615的时序 TLC5615的时序如图9-7所示。/CS当为低电平时,在每一个SCLK时钟的上升沿从DIN 引脚移入一位数据,高位在前,低位在后。经16个时钟后,/CS的上升沿将16 位移位寄存器的10 位有效数据锁存到10位DAC寄存器, 供DAC电路进行转换。,图9-7 TLC5615的时序,2022/12/1,20,16位数据的高4位和低2位不会被转换,待转换数据输入的格式见表9-1:,设n为待转换的数字量,VREFIN为基准输入电压,则转换后的输出电压: VOUT=2VREFINn/1024,表9-1 D/A转换数据输入格式,2022/12/1,21,3TLC5615与单片机的接口 TLC5615与单片机的硬件如图9-7所示,将TLC5615的SCLK、DIN分别与单片机的P1.0、P1.1、P1.2相连,基准电压接+5V。,图9-8 TLC5615与单片机的硬件连接,2022/12/1,22,D/A转换汇编语言程序:设要转换的数据放在R7R6中,R7为高8位,R6低8位 DIN BIT P1.2 ;引脚定义 CS BIT P1.1 SCLK BIT P1.0 TLC5615_DA:CLR C;将R7R6中数据左移2位(16位数据的最低2位添00) RLC R6 RLC R7 CLR C RLC R6 RLC R7 SETB CS ;初始化片选信号为高 CLR SCLK ;初始化时钟为低 CLR DIN;D/A数据线置低 CLR CS;选中TLC5615,开始启动D/A MOV R5,#16 ;将16位数据从DIN端移进内部的16位移位寄存器,2022/12/1,23,LOOP: RLC R6;R7R6中数据左移一位,最高位进入CY RLC R7 MOV DIN,C;将数据送到DIN引脚 SETB SCLK ; 送时钟 NOPNOPNOPCLR SCLK;NOPNOPNOP DJNZ R5,LOOPSETB CS ;D/A片选拉高,10 位有效数据锁存到DAC寄存器,开始转换 RET,2022/12/1,24,D/A转换C语言程序:sbit DA_clk=P10; /*引脚定义*/sbit DA_ cs=P11; sbit DA_in=P12; void delay_s(unsigned char n) /*延时*/ unsigned char i; for(i=0;in;i+); void TLC5615_DA_conver(unsigned int DA_data) /* D/A转换程序*/ unsigned char i; DA_data = DA_data 2; /*将数据左移2位(最低2位添00) */ DA_cs=1; /*初始化片选信号为高*/ DA_clk=0; /*初始化时钟为低*/ DA_in=0; /*D/A数据线置低*/ DA_cs=0; /*选中TLC5615,开始启动D/A*/ for(i=0;i16;i+) /*将16位数据从DIN端移进内部的16位移位寄存器*/,2022/12/1,25, DA_data = DA_data 1; /*左移一位,最高位进入CY*/ DA_in=CY;/*将数据送到DIN引脚*/ DA_clk=1;delay_s(0 x02); /*送时钟*/ DA_clk=0;delay_s(0 x02); DA_cs=1; / *片选拉高,10 位数据锁存到DAC寄存器,开始转换*/ delay_s(0 x20); ,2022/12/1,26,4.用TLC5615设计简易信号发生器 图9-9是用TLC5615设计简易信号发生器的硬件接口电路。系统实现上电后产生矩形波,当S1按下时产生正弦波,当S2按下时产生三角波。,图9-9简易信号发生器的硬件接口电路,程序略,2022/12/1,27,9.2 I2C总线接口技术,I2C总线是PHLIPS公司推出的一种高性能芯片间简单、双向二线制同步串行总线,数据传输时只需两根信号线,一根是双向数据线SDA,另一根是时钟线SCL,所有连接到I2C总线上的串行器件,其数据线都连接到总线的SDA上,时钟线则连接到总线的SCL上。9.2.1 I2C总线简介1.I2C总线的主要特点有: 总线只有两根线,即串行时钟线(SCL)和串行数据线(SDA),这在设计中大大减少了硬件接口。,2022/12/1,28,每个连接到总线上的器件都有一个用于识别的器件地址,器件地址由芯片内部硬件电路和外部地址引脚同时决定,避免了片选线的连接方法,并建立简单的主从关系,每个器件既可以作为发送器,又可以作为接收器。 同步时钟允许器件以不同的波特率进行通信。 同步时钟可以作为停止或重新启动串行口发送的握手信号。 串行的数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。 连接到同一总线的集成电路数只受400pF的最大总线电容的限制。,2022/12/1,29,2.I2C总线系统结构 I2C总线的系统结构如图9-10所示。采用I2C总线标准的器件均并联在总线上,内部都有I2C接口电路,用于实现和I2C总线的连接。I2C总线上的每一个从器件均有一个唯一的地址,用于识别不同的器件。,图9-10 I2C总线的系统结构,2022/12/1,30,3 .I2C总线的工作时序 当I2C总线没有进行信息传送时,数据线(SDA)和时钟线(SCL)都为高电平时。当主控制器向某个器件传送信息时,首先应向总线送开始信号,然后才能传送信息,当信息传送结束时应送结束信号,如图9-11所示。,图9-11 I2C总线的工作时序,2022/12/1,31,开始信号和结束信号规定如下:开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 开始信号和结束信号之间传送的是信息,信息的字节数没有限制,但每个字节必须为8位,高位在前,低位在后。 数据线SDA上每一位信息状态的改变只能发生在时钟线SCL为低电平的期间,因为SCL高电平期间SDA状态的改变已经被用来表示开始信号和结束信号。 每个字节后面必须接收一个应答信号(ACK),ACK是从控制器在接收到8位数据后向主控制器发出的特定的低电平脉冲,用以表示已收到数据。 主控制器接收到应答信号(ACK)后,可根据实际情况作出是否继续传递信号的判断。若未收到ACK,则判断为从控制器出现故障。,2022/12/1,32,主控制器每次传送的信息的第一个字节必须是器件地址码,第二个字节为器件单元地址,用于实现选择所操作的器件的内部单元,从第三个字节开始为传送的数据。其中器件地址码格式如表9-2所示。,表9-2 I2C总线上器件地址码格式,2022/12/1,33,I2C总线上的每一个从器件均有一个唯一的地址,每次主器件发出起始信号后,必须接着发出一个字节的器件地址,以选取挂在总线上的某一从器件并控制总线的传输方向。器件类型码:表示器件的类型,出厂时根据PHILIPS公司的I2C规程确定,比如对于24C02芯片来说,器件标识地址为1010。片选地址:当总线上有多片同类器件时,只有器件引脚A2A0的电平与器件地址中A2A0同相的器件才能被选中 。R/W操作控制位,为1表示读操作,为0表示写操作。 说明: 器件地址只表明选择挂在总线的哪一个器件及数据传送方向,而器件内部的地址是由编程者在传送第一个数据时指定的,即第一个数据为器件内的子地址。,2022/12/1,34,4. I2C总线读、写操作 (1)当前地址读 该操作将从所选器件当前地址执行读操作,读的字节数不指定,格式见表9-3所示,表9-3 当前地址读操作格式,(2)指定单元读 该操作将从所选器件指定地址读,读的字节数不指定,格式见表9-4所示。,表9-4 指定地址读操作格式,2022/12/1,35,(3)指定单元写 该操作将从所选器件指定地址写,写的字节数不指定,格式见表9-5所示。,表9-5指定地址写操作格式,其中:S表示开始信号,A表示应答信号,P表示结束信号。,2022/12/1,36,9.2.2用I/O口模拟I2C总线操作子程序 目前不少的单片机内部集成了I2C总线接口,如MCS-51系列的8XC550、8XC552、8XC571等,低价位的单片机内部虽然没有集成I2C总线接口,但可以通过软件实现I2C总线操作。 假设采用89S51单片机,晶振频率为12MHz,即机器周期为1us,使用P1.0作为数据线SDA, P1.1作为时钟线SCL。SCL BIT P1.1;汇编语言定义端口SDA BIT P1.0sbit SDA=P10; /C语言定义端口sbit SCL=P11; bit ack; /应答标志位,有应答为1,无应答为0#define DELAY5US _nop_();_nop_();_nop_();_nop_();_nop_(); 根据I2C总线数据传送的典型信号时序要求,可用单片机I/O口线产生起始信号、停止信号、应答信号、非应答信号等。汇编语言和C语言程序如下:,2022/12/1,37,1.产生起始信号 S汇编语言程序: START:SETB SDA;发送起始条件数据信号SETBSCL;发送起始条件的时钟信号NOPNOPNOPNOPCLR SDA;发送起始信号(SCL为高,SDA发生由高到低)NOPNOPNOPNOPNOPCLRSCLRET,2022/12/1,38,C语言程序:void start( ) SDA=1; /*将SDA、SCL置为1 */ SCL=1; DELAY5US; /*延时5us*/ SDA=0; /*SCL为高时,SDA由高变低*/ DELAY5US; SCL=0; /*SCL变低,准备发送或接收数据 */,2022/12/1,39,2.产生停止信号 S 汇编语言程序:STOP: CLR SDA ;发送停止条件的数据信号SETB SCL ;发送停止条件的时钟信号NOPNOPNOPNOPNOP SETB SDA ;发送I2C总线停止信号(SCL为高,SDA发生由低到高) NOP NOP NOP NOPCLR SCLCLR SDARET,2022/12/1,40,C语言程序:void stop( ) SDA=0; /*将SDA清0, SCL置1 */ SCL=1; DELAY5US; SDA=1; /*当SCL为高电平时,SDA由低变高 */ DELAY5US; SCL=0; ,2022/12/1,41,3.发送应答信号 ACK汇编语言程序: MACK: CLR SDA ;发送应答信号MACKSETB SCLNOPNOPNOPNOPNOPCLR SCLSETB SDARET,2022/12/1,42,C语言程序:void ack(void) /*产生应答信号*/ SDA=0; /*SDA先清0,发应答信号 */ SCL=1; /*SCL由低变高,产生一个时钟*/ DELAY5US; /*延时5us */ SCL=0; /*SCL变低,以便继续接收*/ SDA=1;,2022/12/1,43,4.发送非应答信号NACK汇编语言程序: NACK: SETB SDA ;发送应答信号NACKSETB SCLNOPNOPNOP NOPNOPCLR SCLCLR SDARET,2022/12/1,44,C语言程序:void nack(void) SDA=1; /*DA先置1,发非应答信号 */ SCL=1; /*SCL由低变高,产生一个时钟*/ DELAY5US; SCL=0; /*时钟线SCL恢复到低电平*/ SDA=0; ,2022/12/1,45,5应答检测子程序CACK汇编语言程序(F0=1通信失败): CACK: SETB SDA ;发送应答信号CACKSETB SCLCLR F0MOV C,SDAJNC CENDSETB F0 CEND: CLR SCLRET,2022/12/1,46,C语言程序:void cack(void) SDA=1; /*SDA先置1,发非应答信号 */ SCL=1; /*SCL由低变高,产生一个时钟* DELAY5US; ack=0; if(SDA=1) ack=1; SCL=0; /*时钟线SCL恢复到低电平*/,2022/12/1,47,6.向I2C总线发送一个字节 汇编语言程序:;从A中取一个字节数据写向I2C总线WRITE_BYTE: MOV R7,#8;写8位WRITE_LOOP: RLC A ;发送A中数据 MOV SDA,C SETB SCL NOP NOP NOP NOP NOP CLR SCL DJNZ R7,WRITE_LOOP RET,2022/12/1,48,C语言程序:/*将指针P指向的一个字节数据发送*/void SendByte(uchar *p) uchar n ,temp; temp =*p; for(n=0;n8;n+) /*一字节为8位,循环8次*/ if(temp /*准备下一位要发送的数据*/ ,2022/12/1,49,7.从I2C总线接收一个字节 数据汇编语言程序:;从I2C总线接收一个字节 数据放在A中RDBYTE : MOV R7,#8;写8位RD_LOOP: SETB SDA SETB SCL NOP;延时5s NOP NOP NOP NOP NOP MOV C,SDA ;采样SDA线上的数据到cy MOV A,R2 ;R2为接收数据的缓冲寄存器RLC A ;将cy中的数据左移进A中MOV R2,A ;数据送回缓冲寄存器R2CLR SCLDJNZ R7,RD_LOOPRET,2022/12/1,50,C语言程序:/*接收一个字节数据放在P指向单元*/uchar RcvByte (uchar *P ) uchar n,temp; for(n=0;n8;n+) /*一字节为8位,循环8次*/ SDA=1; /*置数据线SDA为高,进入接收方式*/ SCL=1; /*SCL由低变高,产生一个时钟*/ DELAY5US; temp= temp1; if(SDA=1) temp= temp0X01 ELSE temp= temp,2022/12/1,51,8.向有子地址器件发送多个字节 以上介绍的都是I2C总线的基本操作,I2C总线完整的数据传输是由以上操作组合而成。设某从器件的写地址为sla,如果希望向该器件由子地址suba开始的单元连续写入n个字节的数据dat1、dat2、datn,相应的操作过程如图9-12所示。有阴影部分表示数据由主器件向从器件传送,无阴影部分表示数据由从器件向主器件传送。,图9-12向有子地址器件发送多个字节的操作过程,汇编语言程序:;多字节写操作子程序WNBYTE;入口参数:R7写入的字节数,R0写入数据的首地址,R2从器件地址,R3从器件内部地址,2022/12/1,52,WNBYTE:MOV A,R3; LCALL START LCALL WRITE_BYTE LCALL CACK JB F0,WRBYTE MOV A,R2LCALL WRITE_BYTE LCALL CACKJB F0,WRBYTEWRDA: MOV A,R0LCALL WRITE_BYTE LCALL CACKJB F0,WRBYTEINC R0DJNZ R7,WRDALCALL STOPRET,2022/12/1,53,C语言程序:/*多字节写操作子程序WNBYTE入口参数:n写入的字节数,S0写入数据的首地址,S3从器件地址,S2从器件地址内部地址*/void Sendnbyte(uchar *s3,uchar *s2,uchar *s0,uchar n) uchar i; loop:start( ); /*发起始信号,启动总线*/ SendByte(s3); /*发送从器件地址*/ cack( ); if(ack)goto loop SendByte(s2); /*发送器件子地址*/ cack( ); if(ack)goto loop for(i=0;in;i+) /*循环n次*/ SendByte(s0); /*发送一个字节数据*/ cack( ); if(ack)goto loop s0+; /*指向下一个字节*/ stop( ); /*发结束信号,结束本次数据传送 */ ,2022/12/1,54,9.向有子地址器件读取多个字节 主机首先发送起始信号、从器件地址sla和希望读取的字节数据所在从器件子地址suba,执行一次写操作,在从器件应答之后,主器件重新发送起始信号和从器件读地址sla+1,从器件响应并发送应答信号后,输出主机所要求的一个字节数据dat1,主器件随后发送应答信号ACK,以后从器件每输出一个字节数据,主机均回送ACK应答,当从器件输出最后一个字节数据datn后,主机回送非应答信号,接着发送停止信号结束总线传送,相应的操作过程如图9-13所示。,图9-13向有子地址器件读取多个字节的操作过程,2022/12/1,55,汇编语言程序:;多字节读操作子程序RNBYTE;入口参数:R7写入的字节数,R0写入数据的首地址, R2从器件地址内部地址,R3从器件写地址,R4从器件读地址RNBYTE:LCALL STARTMOV A,R3 ;取从器件写地址LCALL WRITE_BYTE;写从器件地址LCALL CACK ;检测应答信号JB F0,RNBYTE;无应答重新开始MOV A,R2 ;取从器件地址内部地址LCALL WRITE_BYTELCALL CACKJB F0,RNBYTELCALL START,2022/12/1,56,MOV A,R4 ;取从器件读地址LCALL WRITE_BYTELCALL CACKJB F0,RNBYTERDN:LCALL RDBYTE ;接收一个字节数据MOV R0,ADJNZ R7,ACKLCALL MNACK ;接收完发非应答信号LCALL STOPACK:LCALL MACK ;没接收完发应答信号INC R0SJMP RDN,2022/12/1,57,C语言程序:/*多字节读操作子程序RNBYTE/*入口参数:n写入的字节数,s0读数据存放的首地址,s2从器件地址内部地址,s3从器件写地址,s4从器件读地址*/viod Rcvnbyte(uchar *s3,uchar *s4, uchar *s2, uchar *s0, uchar n) loop:start( ); /*发起始信号,启动总线*/ SendByte(s3); /*发送从器件地址*/ Cack( ); /*应答检测*/ if(ack) /*如果没能应答,重新开始 */ goto loop SendByte(s2); /*发送器件子地址*/ Cack( ); /*应答检测*/ if(ack) /*如果没能应答,重新开始 */ goto loop,2022/12/1,58,start( ); /*再次发起始信号*/ SendByte(s4); /*sla+1表示进行读操作*/ cack( ); /*应答检测*/ if(ack) /*如果没能应答,重新开始 */ goto loop for(i=0;in-1;i+) /*对前n-1个字节发应答信号*/ RcvByte(s0); /*接收数据*/ ack( ); /*发送应答信号*/ s+; RcvByte(s0); /*接收最后一个字节*/ nack( ); /*发送非应答信号*/ stop( ); /*发结束信号,结束本次数据传送*/,2022/12/1,59,9.2.3 24CXX系列EEPROM芯片及其与单片机的接口 串行E2PROM是在各种串行器件应用中使用较频繁的器件,和并行E2PROM相比,串行E2PROM容量小、数据传送速度较低,但因其体积较小,引脚较少,功耗低,特别适合于需要存放非挥发数据,速度要求不高,引脚少的单片机应用系统。 24CXX系列的E2PROM有多种型号,其中典型的型号有:24C02/04/08/16/32/64/128/256共8中芯片,容量分别为1、2、4、8、16、32、64、128、256KB。 串行EEPROM一般具有两种写入方式,一种是字节写入方式,还有另一种页写入方式,允许在一个写周期内同时对1个字节到一页的若干字节的编程写入,一页的大小取决于芯片内页寄存器的大小。其中,24C01具有8字节数据的页面写能力,24C02040816具有16字节数据的页面写能力,24C3264具有32字节数据的页面写能力,24C128256具有64字节数据的页面写能力。,2022/12/1,60,1、引脚的功能 24CXX系列的E2PROM管脚排列图分别为如图9-14的(a)、(b)、(c)所示VCC: 电源+5V。VSS: 地线。SCL:串行时钟输入端,用于发送数据或接收数据时产生所需的时钟。SDA:串行数据I/O端,用于输入和输出串行数据。该引脚是漏极开路的端口,需接上拉电阻到VCC。WP:写保护端,该引脚提供了硬件数据保护,当WP接地时,允许对芯片执行写操作;当WP接VCC时,则对芯片实施写保护。,(a)24C01/02/04/08/16/32/64管脚 (b)24C128管脚 (c) 24C256管脚图9-14 24CXX 系列E2PROM 引脚图,2022/12/1,61,A0、A1、A2:器件地址输入端,用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0,对于24C02可级联8个器件,如果线路上只有一片24C02,这三个地址输入脚A0、A1、A2 可悬空或连接到GND。例:如果A2、A1、A0所接的电平为101,由于24C02的器件标识为1010,那么,该芯片的读地址为0 xab,写地址为0 xaa。,2022/12/1,62,224CXX的器件地址24CXX的器件地址见表9-6所示。,表9-6 24CXX的器件地址,2022/12/1,63,3AT89S51单片机与24C02的硬件连接 图9-15为单片机与24C02的连接,其中P1.0作为24C02的数据线SDA,P1.1作为24C02的时钟线SCL,24C02的器件标识地址为1010。 由于系统中只有一片24C02,所以直接将器件地址输入端A2、A1、A0接地,这样24C02在系统中的器件地址 SLAW=0 xA0,SLAR=0 xA1。两条线均接4.7K的上拉电阻,图9-15 单片机与24C02的连接电路,2022/12/1,64,489S51对24C02的读写程序 针对图9-15,编写对24C02的读写程序,将若干个字节数据写到24C02芯片地址为0 x10开始的单元中,随后从这些单元读出数据,判断是否与写入的数据一致,如果读/写正确,蜂鸣器鸣叫一声,否则鸣叫3声。 24C02的内部有连续的子地址空间,对这些空间进行n个字节的连续读/写时,具有地址自动加1功能,只要设定好希望读/写的器件子地址及字节数,就能完成整个操作。注意:对于24C02连续写的字节数不应超过页容量8,一次连续写所形成的总线传送结束后(主机发出停止信号后),24C02执行内部擦写过程,大约需要10ms左右,此时24C02不再应答主器件的任何请求。,2022/12/1,65,C语言参考程序见课本. 其中的函数Sendnbyte( )、Rcvnbyte( )在前面9.2.2节已作介绍,对24C02的读写完全适用。为了使用方便,可以将9.2.2节介绍的模拟I2C总线操作的子程序形成一个文件I2C.C,并形成如下的I2C.h 文件,主程序和I2C.C加入同一个项目中,并且主程序包含这个h文件,即可使用Rcvnbyte( )、Rcvnbyte ( )这两个函数。,2022/12/1,66,9.2.4数码管动态显示驱动、键盘扫描管理芯片ZLG7290B及与单片机接口 ZLG7290B 是广州周立功单片机发展有限公司自行设计的数码管显示驱动及键盘扫描管理芯片。能够直接驱动8位共阴式数码管(或64只独立的LED),同时还可以扫描管理多达64只按键。其中有8只按键还可以作为功能键使用,就像电脑键盘上的Ctrl、Shift、Alt 键一样。另外ZLG7290B 内部还设置有连击计数器,能够使某键按下后不松手而连续有效。采用I2C 总线方式,与微控制器的接口仅需两根信号线。该芯片为工业级芯片,抗干扰能力强,在工业测控中已有大量应用。1.主要特性直接驱动8位共阴式数码管或64只独立的LED;能够管理多达64只按键,自动消除抖动,其中有8只可以作为功能键使用;段电流可达 20mA,位电流可达100mA以上;利用功率电路可以方便地驱动1英寸以上的大型数码管;,2022/12/1,67,具有闪烁、段点亮、段熄灭、功能键、连击键计数等强大功能;提供有10种数字和21种字母的译码显示功能,或者直接向显示缓存写入显示数据;不接数码管而仅使用键盘管理功能时,工作电流可降至 1mA;与微控制器之间采用I2C串行总线接口,只需两根信号线,节省I/O资源;工作电压范围:3.35.5V;工作温度范围:4085;封装:DIP-24(窄体),SOP-24。2.引脚图及功能说明 引脚图见9-16所示,引脚功能见表9-7所示 。,图 9-16 ZLG7290B 引脚图(DIP-24,SOP-24),2022/12/1,68,表 9-7 ZLG7290B 引脚功能表,2022/12/1,69,2022/12/1,70,3ZLG7290B 典型应用电路原理图如图9-17所示。(1)电路简析 在图9-17中,U1就是ZLG7290B。J1 是ZLG7290B与微控制器的接口,按照I2C 总线协议的要求,信号线SCL和SDA上必须要分别加上上拉电阻,其典型值是10K。晶振Y1通常取值4MHz,调节电容C3和C4通常取值在10pF左右。复位信号是低电平有效,数码管必须是共阴式的,不能直接使用共阳式的。DPY1和DPY2是4位联体式数码管,共同组成完整的8位。R1R8 是限流电阻,典型值是270。64只按键中,前56个按键是普通按键K1K56,最后8个为功能键F0F7。数码管扫描线和键盘扫描线是共用的,所以二极管D1D8 是必须的,有了它们就可以防止按键干扰数码管显示的情况发生。在多数应用当中可能不需要太多的按键,这时可以按行或按列裁减键盘。,2022/12/1,71,图 9-17 ZLG7290B 典型应用电路原理图,2022/12/1,72,(2)功能概述 如图9-17所示,ZLG7290B可以扫描管理多达64个按键,K1K56 为普通按键,F0F7 为功能键。普通按键还有连击检测功能。ZLG7290B 内部有8 个显示缓冲寄存器DpRam0DpRam7,它们直接决定数码管显示的内容。ZLG7290B 提供有两种显示控制方式,一种是直接向显存写入字型数据,另一种是通过向命令缓冲寄存器写入控制指令实现自动译码显示。访问这些寄存器需要通过 I2C 总线接口来实现。ZLG7290B 的I2C 总线器件地址是70H(写操作)和71H(读操作)。访问内部寄存器要通过“子地址”来实现。,2022/12/1,73,4.寄存器详解(1 )系统寄存器SystemReg(地址:00H) 系统寄存器的第0位称作KeyAvi,标志着按键是否有效,