290 likes | 480 Views
第 20 章 I2C 接口器件 2401 及 C51 编程. 1 、 2401 的性能特点和引脚分布 2 、 AT24CXX 系列的内部结构 3 、 2401 的工作原理. AT24CXX 的性能特点和引脚分布. AT24CXX 系列内存是 Atmel 公司生产的高集成度串行 EEPROM ,可进行电擦除,提供的接口形式是 I2C ,其封装和引脚功能如下所示:. AT24CXX 内存的种类和特征. AT24CXX 内存的种类和特征如下表所示的字型代码表如下所示:. AT24CXX 系列 EEPROM 的内部结构.
E N D
第20章I2C接口器件2401及C51编程 1、2401的性能特点和引脚分布 2、AT24CXX系列的内部结构 3、2401的工作原理
AT24CXX的性能特点和引脚分布 • AT24CXX系列内存是Atmel公司生产的高集成度串行EEPROM,可进行电擦除,提供的接口形式是I2C,其封装和引脚功能如下所示:
AT24CXX内存的种类和特征 AT24CXX内存的种类和特征如下表所示的字型代码表如下所示:
AT24CXX系列EEPROM的内部结构 • AT24CXX系列EEPROM的内部结构如下图所示:
AT24CXX系列EEPROM芯片的寻址 • AT24CXX系列EEPROM芯片的寻址方式如下图所示:
AT24CXX系列芯片的工作方式 • 一、写操作方式 • 分为字节写、页写,字节写和页写的操作工作方式时序分别如下图所示:
AT24CXX系列芯片的工作方式 • 一、读操作方式 • 分为读当前地址内容、读随机地址内容和读顺序地址内容,其操作时序分别如下图所示:
AT24CXX系列芯片的应用举例 • 例1读写AT24C01,使用按键S1、S2取得一个0~255之间的数值(在数码管低3位上显示),按下S3键后,将该数据写入AT24C01的10号单元中,按下S4键则从AT24C01中读出该操作数并进行显示,源程序如下: • #include <REG51.H> • #include <intrins.H> • #define uchar unsigned char • #define uint unsigned int • uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
AT24CXX系列芯片的应用举例 • uchar ACT[4]={0xfe,0xfd,0xfb,0xf7}; • sbit SDA=P3^7; • sbit SCL=P3^6; • bdata char com_data; • sbit mos_bit=com_data^7; • sbit low_bit=com_data^0; • uchar cnt,x; • void delay_iic(int n); • uchar rd_24c01(char a); • void wr_24c01(char a,char b); • /***************************************/ • void init(void) • { • TMOD=0x01; • TH0=-(1000/256); • TL0=-(1000%256); • ET0=1; • TR0=1; • EA=1; • }
AT24CXX系列芯片的应用举例 • uchar scan_key(void) • { • uchar temp; • temp=P3; • return temp; • } • /********************************/ • void delay(uint k) • { • uint data i,j; • for(i=0;i<k;i++) • {for(j=0;j<121;j++) • {;}} • } • /******************************/ • void main(void) • {uchar key_val; • init(); • while(1) • { • key_val=scan_key(); • switch(key_val) • { • case 0xfb:if(x<255)x++;delay(300);break; • case 0xf7:if(x>0)x--;delay(300);break; • case 0xef:EA=0;wr_24c01(10,x);delay_iic(250);EA=1;break; • case 0xdf:EA=0;x=rd_24c01(10);delay_iic(250);EA=1;break; • default:break; • } • } • }
AT24CXX系列芯片的应用举例 • void time0(void) interrupt 1 • { • uchar dis_val; • TH0=-(1000/256); • TL0=-(1000%256); • dis_val=x; • if(++cnt>2)cnt=0; • switch (cnt) • { • case 0:P0=SEG7[dis_val%10];P2=ACT[cnt];break; • case 1:P0=SEG7[(dis_val%100)/10];P2=ACT[cnt];break; • case 2:P0=SEG7[dis_val/100];P2=ACT[cnt];break; • default:break; • } • }
AT24CXX系列芯片的应用举例 • void start() • { • SDA=1;_nop_();_nop_();_nop_();_nop_(); • SCL=1;_nop_();_nop_();_nop_();_nop_(); • SDA=0;_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_(); • } • //***************************************** • void stop() • { • SDA=0;_nop_();_nop_();_nop_();_nop_(); • SCL=1;_nop_();_nop_();_nop_();_nop_(); • SDA=1;_nop_();_nop_();_nop_();_nop_(); • } • //*********************** • void ack() • { • SCL=1;_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_(); • } • //***********************
AT24CXX系列芯片的应用举例 • void shift8(char a) • { • data uchar i; • com_data=a; • for(i=0;i<8;i++) • { • SDA=mos_bit; • SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • com_data=com_data*2; • } • } • uchar rd_24c01(char a) • { • data uchar i,command; • SDA=1;_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_(); • start();
AT24CXX系列芯片的应用举例 • command=160; • shift8(command); • ack(); • shift8(a); • ack(); • start(); • command=161; • shift8(command); • ack(); • SDA=1;_nop_();_nop_();_nop_();_nop_(); • for(i=0;i<8;i++) • { • com_data=com_data*2; • SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • low_bit=SDA; • SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • } • stop(); • return(com_data); • }
AT24CXX系列芯片的应用举例 • void wr_24c01(char a,char b) • { • data uchar command; • _nop_();_nop_();_nop_();_nop_();_nop_(); • SDA=1;_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_(); • start(); • command=160; • shift8(command); • ack(); • shift8(a); • ack(); • shift8(b); • ack(); • stop(); • _nop_();_nop_();_nop_();_nop_();_nop_(); • } • //*************** • void delay_iic(int n) • { • int i; • for(i=1;i<n;i++){;} • }
AT24CXX系列芯片的应用举例 • 例2具有记忆断电后定时时间的实时时钟,为了进行校时和定时,规定5种工作状态,状态0为正常走时,状态1为输入定时1的分;状态2为输入定时1的时;状态3为输入定时2的分;状态4为输入定时2的时;源程序如下: • #include<REG51.H> • #include <intrins.H> • #define uint unsigned int • #define uchar unsigned char • uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
AT24CXX系列芯片的应用举例 • uchar code ACT[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; • #define INC_KEY 0xfb • #define DEC_KEY 0xf7 • #define OK_KEY 0xef • #define STATUS_KEY 0xdf • #define ON 0 • #define OFF 1 • sbit SDA=P3^7; • sbit SCL=P3^6; • sbit OUTPUT=P1^0; • /************************************************/ • uchar status; • uchar deda,sec,min,hour; • uchar set1_dat[2],set2_dat[2]; • bit set1_flag,set2_flag; • /************************************************/ • uchar key(void); • void pout(void); • void delay(uint k); • bdata char com_data; • sbit mos_bit=com_data^7; • sbit low_bit=com_data^0; • void delay_iic(int n); • uchar rd_24c01(char a); • void wr_24c01(char a,char b);
AT24CXX系列芯片的应用举例 • void initial(void) • {uchar rd_val; • rd_val=rd_24c01(100);delay_iic(250); • if(rd_val==88) • {set1_dat[0]=rd_24c01(80);delay_iic(250); • set1_dat[1]=rd_24c01(81);delay_iic(250); • set2_dat[0]=rd_24c01(90);delay_iic(250); • set2_dat[1]=rd_24c01(91);delay_iic(250); • set1_flag=(bit)rd_24c01(70);delay_iic(250); • set2_flag=(bit)rd_24c01(71);delay_iic(250); • } • TMOD=0x11; • TH0=-(50000/256); • TL0=-(50000%256); • TH1=-(1000/256); • TL1=-(1000%256); • TR0=1;ET0=1;TR1=1;ET1=1; • EA=1; • }
AT24CXX系列芯片的应用举例 • void main(void) • {uchar key_val; • initial(); • for(;;) • { • key_val=key(); • pout(); • if(key_val==STATUS_KEY) • {status++; • if(status==5) • {status=0; • EA=0; • wr_24c01(100,88);delay_iic(250); • wr_24c01(80,set1_dat[0]);delay_iic(250); • wr_24c01(81,set1_dat[1]);delay_iic(250); • wr_24c01(90,set2_dat[0]);delay_iic(250); • wr_24c01(70,(uchar)set1_flag);delay_iic(250); • wr_24c01(71,(uchar)set2_flag);delay_iic(250); • EA=1; • } • delay(300); • } wr_24c01(91,set2_dat[1]);delay_iic(250);
AT24CXX系列芯片的应用举例 • if(key_val==INC_KEY) • { • switch(status) • { • case 1:if(set1_dat[0]<60)set1_dat[0]++;delay(300);break; • case 2:if(set1_dat[1]<23)set1_dat[1]++;delay(300);break; • case 3:if(set2_dat[0]<60)set2_dat[0]++;delay(300);break; • case 4:if(set2_dat[1]<23)set2_dat[1]++;delay(300);break; • default:break; • } • } • //====================================================================== • if(key_val==DEC_KEY) • { • switch(status) • { • case 1:if(set1_dat[0]>0)set1_dat[0]--; delay(300);break; • case 2:if(set1_dat[1]>0)set1_dat[1]--; delay(300);break; • case 3:if(set2_dat[0]>0)set2_dat[0]--; delay(300);break; • case 4:if(set2_dat[1]>0)set2_dat[1]--; delay(300);break; • default:break; • } • }
AT24CXX系列芯片的应用举例 • if(key_val==OK_KEY) • { • if((status==1)||(status==2)){set1_flag=!set1_flag;delay(300);} • if((status==3)||(status==4)){set2_flag=!set2_flag;delay(300);} • } • } • } • /************************************************/ • uchar key(void) • { • uchar temp; • P3=0xff; • temp=P3; • if(temp!=0xff) • { • delay(30); • P3=0xff; • temp=P3; • } • return (temp); • }
AT24CXX系列芯片的应用举例 • void pout(void) • { • if(set1_flag) • { • if((min==set1_dat[0])&&(hour==set1_dat[1]))OUTPUT=ON; • } • else OUTPUT=OFF; • //---------------------------------------- • if(set2_flag) • { • if((min==set2_dat[0])&&(hour==set2_dat[1]))OUTPUT=OFF; • } • else OUTPUT=OFF; • } • /*************************************************/ • void time0_serve(void) interrupt 1 • { • TH0=-(50000/256); • TL0=-(50000%256); • deda++; • if(deda>=20){deda=0;sec++;} • if(sec>59){sec=0;min++;} • if(min>59){min=0;hour++;} • if(hour>23){hour=0;} • }
AT24CXX系列芯片的应用举例 • void time1_serve(void) interrupt 3 • { • static uchar time_cnt; • static bit bit_flag; • TH1=-(1000/256); • TL1=-(1000%256); • time_cnt++; • bit_flag=~bit_flag; • //--------------------------------- • if(status==0){if(time_cnt>5)time_cnt=0;} • else {if(time_cnt>29)time_cnt=0;} • //--------------------------------- • if(status==0) • { • switch(time_cnt) • { • case 0:P0=SEG7[sec%10];P2=ACT[time_cnt];break; • case 1:P0=SEG7[sec/10];P2=ACT[time_cnt];break; • case 2:P0=SEG7[min%10];P2=ACT[time_cnt];break; • case 3:P0=SEG7[min/10];P2=ACT[time_cnt];break; • case 4:P0=SEG7[hour%10];P2=ACT[time_cnt];break; • case 5:P0=SEG7[hour/10];P2=ACT[time_cnt];break; • default:break; • } • }
AT24CXX系列芯片的应用举例 • if(status==1) • { • switch(time_cnt) • { • case 0:P0=SEG7[status];P2=ACT[time_cnt];break; • case 1:if(set1_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];break; • case 2:P0=SEG7[set1_dat[0]%10];P2=ACT[time_cnt];break; • case 3:P0=SEG7[set1_dat[0]/10];P2=ACT[time_cnt];break; • case 4:P0=SEG7[set1_dat[1]%10];P2=ACT[time_cnt];break; • case 5:P0=SEG7[set1_dat[1]/10];P2=ACT[time_cnt];break; • default:if(bit_flag){P0=SEG7[set1_dat[0]%10];P2=ACT[2];} • else {P0=SEG7[set1_dat[0]/10];P2=ACT[3];}break; • } • }
AT24CXX系列芯片的应用举例 • if(status==2) • { • switch(time_cnt) • { • case 0:P0=SEG7[status];P2=ACT[time_cnt];break; • case 1:if(set1_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];break; • case 2:P0=SEG7[set1_dat[0]%10];P2=ACT[time_cnt];break; • case 3:P0=SEG7[set1_dat[0]/10];P2=ACT[time_cnt];break; • case 4:P0=SEG7[set1_dat[1]%10];P2=ACT[time_cnt];break; • case 5:P0=SEG7[set1_dat[1]/10];P2=ACT[time_cnt];break; • default:if(bit_flag){P0=SEG7[set1_dat[1]%10];P2=ACT[4];} • else {P0=SEG7[set1_dat[1]/10];P2=ACT[5];}break; • } • } • //------------------------------------------ • if(status==3) • { • switch(time_cnt) • { • case 0:P0=SEG7[status];P2=ACT[time_cnt];break; • case 1:if(set2_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];break; • case 2:P0=SEG7[set2_dat[0]%10];P2=ACT[time_cnt];break; • case 3:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break; • case 4:P0=SEG7[set2_dat[1]%10];P2=ACT[time_cnt];break; • case 5:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break; • default:if(bit_flag){P0=SEG7[set2_dat[0]%10];P2=ACT[2];} • else {P0=SEG7[set2_dat[0]/10];P2=ACT[3];}break; • } • }
AT24CXX系列芯片的应用举例 • if(status==4) • { • switch(time_cnt) • { • case 0:P0=SEG7[status];P2=ACT[time_cnt];break; • case 1:if(set2_flag)P0=0x01;else P0=0x00;P2=ACT[time_cnt];break; • case 2:P0=SEG7[set2_dat[0]%10];P2=ACT[time_cnt];break; • case 3:P0=SEG7[set2_dat[0]/10];P2=ACT[time_cnt];break; • case 4:P0=SEG7[set2_dat[1]%10];P2=ACT[time_cnt];break; • case 5:P0=SEG7[set2_dat[1]/10];P2=ACT[time_cnt];break; • default:if(bit_flag){P0=SEG7[set2_dat[1]%10];P2=ACT[4];} • else {P0=SEG7[set2_dat[1]/10];P2=ACT[5];}break; • } • } • } • /******************************************************/ • void delay(uint k) • { • uint data i,j; • for(i=0;i<k;i++){ • for(j=0;j<121;j++) • {;}} • }
AT24CXX系列芯片的应用举例 • void start()//启动读写时序 • { • SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • } • void stop()//停止操作 • { • SDA=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • } • void ack()//应答 • { • SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • } • void shift8(char a) • { • data uchar i; • com_data=a; • for(i=0;i<8;i++) • { • SDA=mos_bit; • SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • com_data=com_data*2; • } • }
AT24CXX系列芯片的应用举例 • uchar rd_24c01(char a) • { • data uchar i,command; • SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • start(); • command=160; • shift8(command); • ack(); • shift8(a); • ack(); • start(); • command=161; • shift8(command); • ack(); • SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • for(i=0;i<8;i++) • { • com_data=com_data*2; • SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • low_bit=SDA; • SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • } • stop(); • return(com_data); • }
AT24CXX系列芯片的应用举例 • void wr_24c01(char a,char b) • { • data uchar command; • _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • start(); • command=160; • shift8(command); • ack(); • shift8(a); • ack(); • shift8(b); • ack(); • stop(); • _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); • } • //*************** • void delay_iic(int n) • { • int i; • for(i=1;i<n;i++){} • }