资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,I,2,C,总线器件的扩展,一、,扩展电路,1,基于,IIC,总线的,E,2,PROM,AT24C02,2,特性,与,400KHz IIC,总线兼容,1.8,到,6.0,伏工作电压范围,低功耗,CMOS,技术,写保护功能 当,WP,为高电平时进入写保护状态,页写缓冲器,自定时擦写周期,1,000,000,编程,/,擦除周期,可保存数据,100,年,8,脚,DIP SOIC,或,TSSOP,封装,温度范围 商业级 工业级和汽车级,3,串行,E2PROM,典型产品,AT24C01,:,128,字节(,1288,位);,AT24C02,:,256,字节(,2568,位);,AT24C04,:,512,字节(,5128,位),AT24C08,:,1K,字节(,1K8,位);,AT24C16,:,2K,字节(,2K8,位);,ATMEL,公司的,AT24C,系列:,4,AT24C02,引脚分布,WP,写保护,如果,WP,管脚连接到,Vcc,所有的内容都被写保护,,只能读。当,WP,管脚连接到,Vss,或悬空,允许器件进行正常的读,/,写操作。,5,AT24C02,读写时间周期,6,AT24WC01/02/04/08/16,支持,I,2,C,总线数据传送协议和,I,2,C,总线协议规定。,任何将数据传送到总线的器件作为发送器,任何从总线接收数据的器件为接收器。,数据传送是由产生串行时钟和所有起始停止信号的主器件控制的,主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据,(,发送或接收,),的模式,通过器件地址输入端,A0,、,A1,和,A2,可以实现将最多,8,个,24WC01,和,24WC02,器件,,4,个,24WC04,器件,(,仅使用A1A2 地址管脚,),2,个,24WC08,器件,(,仅使用地址管脚 A2 A0,),和,1,个,24WC16,器件连接到总线上,(,所有地址管脚 A0 A1 A2 都未用,),。,AT24C02,功能描述,7,I2C,总线协议,1,、只有在总线空闲时才允许启动数据传送;,2,、在数据传送过程中,,当,SCL=1,时,,数据线,SDA,必须保持稳定状态,,不允许有跳变,;,SCL=1,时,,数据线,SDA,的任何电平变化将被看作总线的起始或停止信号,;,起始信号,时钟线,SCL,保持高电平期间,数据线,SDA,电平从高到低的跳变作为,I,2,C,总线的起始信号。,停止信号,时钟线,SCL,保持高电平期间,数据线,SDA,电平从低到高的跳变作为,I,2,C,总线的停止信号,8,器件寻址,1,0,1,0,A2,A1,A0,主器件通过发送一个起始信号启动发送过程,然后发送它所要寻址的从器件的地址:,8,位从器件地址的高,4,位固定为,1010,,接下来的,3,位,A2A1A0,为器件的地址位,用来定义哪个器件以及器件的哪个部分被主器件访问。,最低位作为读写控制位:,1,表示对从器件进行读操作,0,表示对从器件进行写操作,在主器件发送起始信号和从器件地址字节后,24C02,监视总线并当其地址与发送的从地址,相符时,响应一个应答信号,(,通过,SDA,线,),,,24C02,根据读写控制位,(R/W),的状态进行读或写操作,9,应答信号,I,2,C,总线数据传送时,每成功地传送一个字节数据后,接收器都必须产生一个应答信号,,应答的器件在第,9,个时钟周期时,将,SDA,线拉低,,表示其已收到一个,8,位数据。,24C02,在接收到起始信号和从器件地址之后响应一个应答信号,如果器件已选择了写操作,则在每接收一个,8,位字节之后响应一个应答信号;,当,24C02,工作于读模式时,在发送一个,8,位数据后释放,SDA,线并监视一个应答信号,一旦接收到应答信号,,24C02,继续发送数据,如主器件没有发送应答信号器件停止传送数据且等待一个停止信号。,10,应答时序,主机时钟,发送器输出的数据,接收器输出的数据,11,(,2,)写入过程,AT24C,系列,E2PROM,芯片地址的固定部分为,1010,,,A2,、,A1,、,A0,引脚接高、低电平后得到确定的,3,位编码。形成的,7,位编码即为该器件的地址码。,单片机进行写操作时,首先发送该器件的,7,位地址码和写方向位“,0”,(共,8,位,即一个字节),发送完后释放,SDA,线并在,SCL,线上产生第,9,个时钟信号,;,被选中的存储器器件在确认是自己的地址后,在,SDA,线上产生一个应答信号作为相应,单片机收到应答后就可以传送数据了。,12,传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。,AT24C,系列器件片内地址在接收到每一个数据字节地址后自动加,1,,在芯片的“一次装载字节数”(不同芯片字节数不同)限度内,只需输入首地址。装载字节数超过芯片的“一次装载字节数”时,数据地址将“上卷”,前面的数据将被覆盖。,当要写入的数据传送完后,单片机应发出终止信号以结束写入操作。写入,n,个字节的数据格式,:,S,1010 xxx0,A,字节首地址,A,Data1,A,Data2,A,A,Data n,A,P,13,写入时序,S,器件地址,+0,A,字节首地址,A,Data1,A,Data2,A,A,Data n,A,P,14,页写,页写操作的启动和字节写一样,不同在于传送了一字节数据后并不产生停止信号,主器件被允许再发送,P=15,个额外的字节;,每发送一个字节数据后,24C02,产生一个应答位并将字节地址低位加,1,高位保持不变,如果在发送停止信号之前主器件发送超过,P+1,个字节 地址计数器将自动翻转,先前写入的数据被覆盖。,24C02,可以一次写入,16,个字节的数据,接收到,P+1,字节数据和主器件发送的停止信号后,24C02,启动内部写周期将数据写到数据区,所有接收的数据在一个写周期内写入,24C02,。,15,页写时序,S,1010XXX0,A,字节首地址,A,Data1,A,Data2,A,A,Data n,A,P,16,写保护操作特性可使用户避免由于不当操作而造成对存储区域内部数据的改写。,当,WP,管脚接高时,整个寄存器区全部被保护起来而变为只可读取;,24C02,可以接收从器件地址和字节地址,但是装置在接收到第一个数据字节后不发送应答信号从而避免寄存器区域被编程改写。,写保护,17,读操作,24C02,读操作的初始化方式和写操作时一样,仅把 位置为,1,,有三种不同的读操作方式:,立即地址读,、,选择读,和,连续读,。,1,0,1,0,A2,A1,A0,18,立即地址读,AT24C02,的地址计数器内容为最后操作字节的地址加,1,。也就是说,如果上次读,/,写的操作地址为,N,,则立即读的地址从地址,N+1,开始。如果,N=E(,这里对,24WC01,E=127,;对,24WC02,,,E=255,;对,24WC04,,,E=511,;对,24WC08,,,E=1023,;对,24WC16,,,E=2047),则计数器将翻转到,0,且继续输出数据。,AT24C02,接收到从器件地址信号后,R/W,位置,1,,它首先发送一个应答信号,然后发送一个,8,位字节数据,主器件不需发送一个应答信号,但要产生一个停止信号。,19,立即地址读时序,20,选择性读,选择性读操作允许主器件对寄存器的任意字节进行读操作,主器件首先通过发送,起始信号,、,从器件地址,和,它想读取的字节数据的地址,执行一个伪写操作。,在,24C02,应答之后,主器件重新发送起始信号和从器件地址,此时,R/W,位置,1,,,24C02,响应并发送应答信号,然后输出所要求的一个,8,位字节数据,主器件不发送应答信号但产生一个停止信号。,21,选择性读时序,22,连续读,连续读操作可通过立即读或选择性读操作启动,在,24C02,发送完一个,8,位字节数据后,主器件产生一个应答信号来响应,告知,24C02,主器件要求更多的数据,对应每个主机产生的应答信号,,24C02,将发送一个,8,位数据字节,当主器件不发送应答信号而发送停止位时结束此操作。,从,24C02,输出的数据按顺序由,N,到,N+1,输出,读操作时,地址计数器在,24C02,整个地址内增加,这样整个寄存器区域在可在一个读操作内全部读出。当读取的字节超过,E(,这里对,24WC01,E=127,;对,24WC02,,,E=255,;对,24WC04,,,E=511,;对,24WC08,,,E=1023,;对,24WC16,,,E=2047),,计数器将翻转到零并继续输出数据字节。,23,连续读时序,24,小结读出过程,单片机先发送该器件的,7,位地址码和写方向位“,0”,(“伪写”),,发送完后释放,SDA,线并在,SCL,线上产生第,9,个时钟信号。,被选中的存储器器件在确认是自己的地址后,在,SDA,线上产生一个应答信号作为回应。,然后,再发一个字节的要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“,1”,),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以“非应答”(高电平),并发出终止信号以结束读出操作。,S,1010XXX0,A,字节首地址,A,S,1010XXX1,A,Data1,A,A,Data n,A,P,25,大赛,24C02,部分电路图,26,sbit SCL=P20;,sbit SDA=P21;,/,用单片机的两个,I/O,口模拟,I2C,接口,void iic_start(void),SDA=1;,/,释放,SDA,总线,somenop;,SCL=1;,somenop;,SDA=0;,somenop;,#define somenop _nop_();_nop_();_nop_();_nop_();_nop_();,起始信号,/,开始信号,SCL,在高电平期间,,SDA,一个下降沿则表示启动信号,27,void iic_stop(void),SDA=0;,somenop;,SCL=1;,somenop;,SDA=1;,somenop;,终止信号,/,停止,SCL,在高电平期间,,SDA,一个上升沿则表示停止信号,sbit SCL=P20;,sbit SDA=P21;,#define somenop _nop_();_nop_();_nop_();_nop_();_nop_();,28,void iic_ack(bit ackbit),if(ackbit),SDA=0;,/,第,9,个周期拉低,表示应答,else,SDA=1;,/,第,9,个周期拉高,表示非应答,somenop;,SCL=1;,somenop;,SCL=0;,SDA=1;,/,释放数据总线,单片机向,24C02,的应答信号,单片机,24C02,I2C,总线数据传送时,每成功地传送一个字节数据后,接收器都必须产生一个应答信号,,应答的器件在第,9,个时钟周期时,将,SDA,线拉低,,表示其已收到一个,8,位数据。,/,形参,ackbit=1,表示应答,,0,表示非应答,29,bit iic_waitack(void),SDA=1;,/,释放总线,somenop;,SCL=1;,somenop;,if(SDA),SCL=0;,iic_stop();,return 0;,/,无应答,else,SCL=0;,return 1;,/,有应答,单片机等待来自,24C02,的应答信号,单片机,24C02,SCL,在高电平期间,,SDA,被从设备拉为低电平表示应答,30,void iic_sendbyte(unsigned char byt),unsigned char i;,for(i=0;i8;i+),if(byt&0 x80),/,先发高位,SDA=1;,else,SDA=0;,somenop;,SCL=1;,byt=1;,somenop;,SCL=0;,单片机向从机发送一个字节,每次程序的开始都默认,SCL=0,,因此程序最后要将,SCL=0,SCL,低电平期间才可以写数据,31,unsigned char iic_recbyte(void),unsigned char da;,unsigned char i;,for(i=0;i8;i+),SCL=1;,somenop;,da=1;,if(SDA),da|=0 x01;,SCL=0;,somenop;,return da;,单片机从从机读取一个字节,每次程序的开始都默认,SCL=0,,因此程序最后要将,SCL=0,SCL,高电平期间才可以读数据,32,void wrbyte_24c02(unsigned char add,unsigned char dat),/Device Address 1010 000 R/W,iic_start();,/,启动,iic_sendbyte(0 xa0);,/,发送从设备地址,iic_waitack();,/,等待从设备的响应,iic_sendbyte(add);,/,发出芯片内地址,iic_waitack();,/,等待从设备的响应,iic_sendbyte(dat);,/,发送数据,iic_waitack();,/,等待从设备的响应,iic_stop();,/,停止,S,1010XXX0,A,字节首地址,A,Data1,A,Data2,A,A,Data n,A,P,单片机向从机的,add,地址上,写入,char,型的数,dat,33,unsigned char rdbyte_24c02(unsigned char add),/Device Address 1100 000 R/W,unsigned char da;,iic_start();,/,启动,iic_sendbyte(0 xa0);,/,发送发送从设备地址写操作,iic_waitack();,/,等待从设备的响应,iic_sendbyte(add);,/,发送芯片内地址,iic_waitack();,/,等待从设备的响应,iic_start();,/,启动,iic_sendbyte(0 xa1);,/,发送发送从设备地址读操作,iic_waitack();,/,等待从设备的响应,da=iic_recbyte();,/,获取数据,iic_ack(0);,/,可省去,iic_stop();,/,停止,return da;,S,1010XXX0,A,字节首地址,A,S,1010XXX1,A,Data1,A,A,Data n,A,P,单片机从,24C02,的,add,地址上读取一个数,34,temp=rdbyte_24c02(0 x00);,/,从,24C02,的,0 x00,地址上读取一个字节到,temp,中,主程序调用,wrbyte_24c02(0 x00,a0);,/,向,24C02,的,0 x00,地址写入,a0,的内容,35,void wrbyte_24c02(uchar add,uchar dat0,uchar dat1,),/Device Address 1010 000 R/W,iic_start();,iic_sendbyte(0 xa0);,iic_waitack();,iic_sendbyte(add);,iic_waitack();,iic_sendbyte(dat0);,iic_waitack();,iic_sendbyte(dat1);,iic_waitack();,iic_stop();,delay(10);,S,1010XXX0,A,字节首地址,A,Data1,A,Data2,A,A,Data n,A,P,单片机向,24C02,的,add,开始的地址上,依次写入多个,char,型的数,依此方法,还可以一次性写很多个,36,unsigned char da=0,0,0,;,iic_start();,iic_sendbyte(0 xa0);,iic_waitack();,iic_sendbyte(add);,iic_waitack();,iic_start();,iic_sendbyte(0 xa1);,iic_waitack();,da0=iic_recbyte();,iic_ack(1);,da1=iic_recbyte();,iic_ack(1);,dan=iic_recbyte();,iic_ack(0);,iic_stop();,return da;,S,1010XXX0,A,字节首地址,A,S,1010XXX1,A,Data1,A,A,Data n,A,P,单片机从,24C02,的,add,开始的地址上读取多个数,37,设计密码锁,设计之前要先设计一个程序,向,24C02,的地址,0 x000 x07,上,写,8,个字节的密码;,设计密码锁要求:,1.,输入密码,按确认键,#,确认,正确,继电器发出动作;错误,Error,,蜂鸣器报警,1s,;,2,修改密码过程:,按一下修改密码*键,1s,后,蜂鸣器响,0.25s,,进入修改密码状态。,应先输入原密码,按确认键,#,确认;密码错都发报警声,响,1s,;,输入新密码,按确认键,#,确认;,再输入一次新密码,按确认键,#,确认;与第一次输入的新密码不符合,报警响,1s,;相符合,新密码写入,24C02,地址,0 x000 x07,上,覆盖原密码,输出三声短鸣叫,密码修改成功,显示,good,。,1,2,3,4,5,6,7,8,9,*,0,#,38,
展开阅读全文