/*以下为AT24C01/02驱动程序,时钟:22.1184MHz;通信速率:88.5Kb/S*/ /*使用时按照C语言的格式嵌入以下1--4代码*/ /* 作者:weiyi 时间: 2002.6.17*/ /*读写操作范例过程如下: 使用时根据具体型号保留将其他不用的删除便是*/ /*Write: /* unsigned char data i; /* …… /* StartIic; /* i=SlaWr; /* i|=A2A0; /*装入具体线路的A2-A0值*/ /* if(MemSize==16){ /*匹配地址AT24C16*/ /* i&=0xf1; /* i|=cAddresH&0x0e; /*根据型号将高地址转如SLA*/ /* } /* if(MemSize==08){ /*匹配地址AT24C08*/ /* i&=0xf9; /* i=cAddresH&0x06; /*根据型号将高地址转如SLA*/ /* } /* if(MemSize==04){ /*匹配地址AT24C04*/ /* i&=0xfd; /* i=cAddresH&0x02; /*根据型号将高地址转如SLA*/ /* } /* SendIic(i);/*1010 0010*/ /* if((MemSize==32)||(MemSize==64)) /*匹配地址AT24C32、64*/ /* SendIic(cAddresH); /*Send first addres*/ /* SendIic(cAddres); /*Send addres(L)如果不是以上所列型号就是 AT24C01、02*/ /* SendIic(cData0);/*写第一个字节数据*/ /* …… /* SendIic(cDataN);/*写最后一个字节数据,不能超过页缓冲*/ /* EndIic; /*Read: bScanErr=0; /* StartIic; /* i=SlaR; /* i|=A2A0; /*装入具体线路的A2-A0值*/ /* /* if(MemSize==16){ /*匹配地址AT24C16*/ /* i&=0xf1; /* i|=cAddresH&0x0e; /* } /* if(MemSize==08){ /*匹配地址AT24C08*/ /* i&=0xf9; /* i=cAddresH&0x06; /*根据型号将高地址转如SLA*/ /* } /* if(MemSize==04){ /*匹配地址AT24C04*/ /* i&=0xfd; /* i=cAddresH&0x02; /*根据型号将高地址转如SLA*/ /* } /* SendIic(i);/*1010 0010*/ /* if((MemSize==64)||(MemSize==32) /*匹配地址AT24C32、64*/ /* SendIic(cAddresH); /*Send first addres*/ /* SendIic(cAddres); /*Send addres(L)如果不是以上所列型号就是 AT24C01、02*/ /* if(bScanErr==0){ /* cDataBuf[0]=ScanIic();/*读入第一个字节*/ /* SendAck(); /* …… /* cDataBuf[n]=ScanIic();/*读入最后一个字节*/ /* SendNotAck(); /* } /* EndIic;*/ /*在程序相应位置嵌入以下1-4代码*/ /* 1。 嵌入宏定义:*/ #include /*#include */ #include #include #define Wait {_nop_();_nop_();_nop_();_nop_();} #define StartIic {bSda=bScl=1;Wait;bSda=0;Wait;bScl=0;} #define EndIic {bSda=0;bScl=1;Wait;bSda=1;} #define SlaWr 0xa0 /*1010 0 0 0 0*/ #define SlaR 0xa1 /*1010 0 0 0 1*/ #define A2A0 0x0 /*按照实际线路设置:0x00-0x14*/ #define MemSize 01 /*EEPROM型号:01-64*/ /* 2。 嵌入变量申明:*/ sbit bSda =Px^x; /*使用具体线路的bSda*/ sbit bScl =Px^x; /*使用具体线路的bScl*/ unsigned char bdata cFlag; sbit bScanErr =cFlag^0; /* 3。 嵌入涵数申明:*/ unsigned char ScanIic(); void SendIic(unsigned char cData); void SendAck(void); void SendNotAck(void); /* 4。 嵌入涵数代码段:*/ /**************************************************** Name:ScanIic Function:From IIC Read data Time:113us 88.5K ***************************************************/ unsigned char ScanIic(){ unsigned char data i,j;/*IIC data*/ bSda=1; j=0; for(i=0;i<8;i++){ bScl=1; Wait; /*可以不用,但太危险了*/ j<<=1;/*这个指令已经有15个周期,所以无须再延时*/ j|=bSda;/*Scan 0*/ /*Scan 1*/ bScl=0; Wait; } return j; } /***********************************************/ /**************************************************** Name:SendIic Function:Send data to Iic Time:116us(8位数据为:112us) 88.5k *****************************************************/ void SendIic(unsigned char cData){ unsigned char data i; for(i=0;i<8;i++){ bSda=(bit)(cData&0x80); bScl=1; cData<<=1; Wait;/*都可以不用,但太危险了*/ bScl=0; Wait;/*都可以不用,但太危险了*/ } bSda=bScl=1; /*检测ACK*/ for(i=0;(bSda==1)&&(bScanErr==0);i++){ if(i==17) bScanErr=1;/*如果101us没有响应就错误*/ } bScl=0; } /*************************************************/ /********************************************** Name:SendAck Function:Send IIC Ack ********************************************/ void SendAck(void){ bSda=0; bScl=1; Wait; bScl=0; bSda=1; } /******************************************/ /****************************************** Name:SendNotAck Function:Send IIC not Ack ******************************************/ void SendNotAck(void){ bScl=bSda=1; Wait; bScl=0; } /**********************************************/