网站导航: 首页 > 设计参考 > 正文 文章搜索
AT24C01/02/04/08/16/32系列EEPROM读写程序
 
文章编号:
081207214703
文章分类: 单片机 51系列
点 击:
...
关 键 词: AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,EEPROM
文章来源:
网路
摘 要:

 
  1. /*------------------------------------------------------------------------------  
  2. 〖说明〗24Cxx I2C EEPROM字节读写驱动程序,芯片A0-A1-A2要接GND(24C65接VCC,具体看DataSheet)。  
  3. 现缺页写、页读,和CRC校验程序。以下程序经过50台验证,批量的效果有待考察。  
  4. 为了安全起见,程序中很多NOP是冗余的,希望读者能进一步精简,但必须经过验证。  
  5. Atmel 24C01 比较特殊,为简约型,为其单独编程.  
  6. 51晶振为11.0592MHz  
  7. 〖文件〗RW24CXX.c 2001/09/18  
  8. --------------------------------------------------------------------------------*/  
  9. /*---------------------------------------------------------------------------------------------------------------  
  10. 调用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18  
  11. 函数说明:对于IIC芯片24CXX,在指定地址address写入一个字节ddata  
  12.  
  13.     
  14.     调用方式:unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address) ﹫2001/09/18  
  15.       
  16.       函数说明:读取IIC芯片24CXX,指定地址address的数据。  
  17. -----------------------------------------------------------------------------------------------------------------*/  
  18.   
  19. #include "reg51.h"   
  20. #include "intrins.h"   
  21.   
  22. sbit SCL= P2^7;   
  23. sbit SDA= P2^6;   
  24.   
  25. enum EEPROMTYPE {IIC24C01,IIC24C01A,IIC24C02,IIC24C04,IIC24C08,IIC24C16,IIC24C32,IIC24C64,IIC24C128,IIC24C256};   
  26. enum EEPROMTYPE eepromtype;   
  27. delay()   
  28. {   
  29.     unsigned int i=1200;   
  30.     while(i--);   
  31. }   
  32. /*----------------------------------------------------------------------------  
  33. 调用方式:write_8bit(unsigned char ch) ﹫2001/03/23  
  34. 函数说明:内函数,私有,用户不直接调用。  
  35. -------------------------------------------------------------------------------*/  
  36. void write_8bit(unsigned char ch)   
  37. {   
  38.     unsigned char i=8;   
  39.     SCL=0;   
  40.     _nop_();_nop_();_nop_();_nop_();_nop_();   
  41.     while (i--)   
  42.     {   
  43.         SDA=(bit)(ch&0x80);   
  44.         _nop_();_nop_();_nop_();_nop_();_nop_();   
  45.         ch<<=1;   
  46.         SCL=1;   
  47.         _nop_();_nop_();_nop_();_nop_();_nop_();   
  48.         SCL=0;   
  49.         _nop_();_nop_();_nop_();_nop_();_nop_();   
  50.     }   
  51.     _nop_();_nop_();_nop_();_nop_();_nop_();   
  52.     _nop_();_nop_();_nop_();_nop_();_nop_();   
  53. }   
  54. /*------------------------------------------------------------------------------  
  55. 调用方式:void ACK(void) ﹫2001/03/23  
  56. 函数说明:内函数,私有,用户不直接调用。  
  57. -------------------------------------------------------------------------------*/  
  58. void ACK(void)   
  59. {   
  60.     unsigned char time_1;   
  61.     SDA=1;   
  62.     SCL=0;   
  63.     _nop_();_nop_();_nop_();_nop_();_nop_();   
  64.     SCL=1;   
  65.     time_1=5;   
  66.     while(SDA) {if (!time_1) break;} //ACK   
  67.     SCL=0;   
  68.     _nop_();_nop_();_nop_();_nop_();_nop_();   
  69. }   
  70. void WriteIIC_24C01(unsigned char address,unsigned char ddata)   
  71. {SCL=1;   
  72. _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA   
  73. SDA=0;   
  74. _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA   
  75. SCL=0; //START   
  76. write_8bit( (address<<1) & 0xfe); //写页地址和操作方式,对于24C32-24C256,page不起作用   
  77. ACK();   
  78. write_8bit(ddata); //发送数据   
  79. ACK();   
  80. SDA=0;   
  81. _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
  82. SDA=1; //STOP   
  83. delay();   
  84. }   
  85. /*---------------------------------------------------------------------------------------------------------------  
  86. 调用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18  
  87. 函数说明:对于IIC芯片24CXX,在指定地址address写入一个字节ddata  
  88. -----------------------------------------------------------------------------------------------------------------*/  
  89. void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata)   
  90. unsigned char page,address_in_page;   
  91.   
  92. if(eepromtype==IIC24C01) //如果是24c01   
  93. {   
  94.     WriteIIC_24C01(address,ddata);   
  95.     return;   
  96. }   
  97. page=(unsigned char)(address>>8) & 0x07;   
  98. page=page<<1;   
  99. address_in_page=(unsigned char)(address);   
  100. SCL=1;   
  101. _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA   
  102. SDA=0;   
  103. _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA   
  104. SCL=0; //START   
  105. write_8bit(0xa0 | page); //写页地址和操作方式,对于24C32-24C256,page不起作用   
  106. ACK();   
  107. if(eepromtype>IIC24C16) //如果是24C01-24C16,地址为一字节;24C32-24C256,地址为二字节   
  108. {   
  109.     write_8bit(address>>8);   
  110.     ACK();   
  111. }   
  112. write_8bit(address_in_page);   
  113. ACK();   
  114. write_8bit(ddata);   
  115. ACK();   
  116. SDA=0;   
  117. _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
  118. SDA=1; //STOP   
  119. delay();   
  120. }   
  121. unsigned char ReadIIC_24C01(unsigned char address)   
  122. {   
  123.     unsigned char ddata=0;   
  124.     unsigned char i=8;   
  125.     SCL=1;   
  126.     _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA   
  127.     SDA=0;   
  128.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA   
  129.     SCL=0; //START   
  130.     write_8bit( (address<<1) | 0x01); //写页地址和操作方式   
  131.     ACK();   
  132.     while (i--)   
  133.     {   
  134.         SDA=1;   
  135.         ddata<<=1;   
  136.         SCL=0;   
  137.         _nop_();_nop_();_nop_();_nop_();_nop_();   
  138.         SCL=1;   
  139.         if (SDA) ddata|=0x01;   
  140.     }   
  141.     SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
  142.     SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
  143.     SDA=1; //STOP   
  144.     delay();   
  145.     return ddata;   
  146. }   
  147. /*----------------------------------------------------------------------------------------------------  
  148. 调用方式:unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address) ﹫2001/09/18  
  149. 函数说明:读取IIC芯片24CXX,指定地址address的数据。  
  150. ------------------------------------------------------------------------------------------------------*/  
  151. unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address)   
  152. unsigned char page,address_in_page;   
  153. unsigned char ddata=0;   
  154. unsigned char i=8;   
  155. if(eepromtype==IIC24C01)   
  156. {   
  157.     return( ReadIIC_24C01(address) );   
  158. }   
  159. page=(unsigned char)(address>>8) & 0x07;   
  160. page=page<<1;   
  161. address_in_page=(unsigned char)(address);   
  162. SDA=0;_nop_();SCL=0; //START   
  163. write_8bit(0xa0 | page); //写页地址和操作方式,对于24C32-24C256,page不起作用   
  164. ACK();   
  165. if(eepromtype>IIC24C16) //如果是24C32-24C256,地址为二字节,先送高位,后送低位   
  166. {   
  167.     write_8bit(address>>8);   
  168.     ACK();   
  169. }   
  170. //如果是24C01-24C16,地址为一字节;   
  171. write_8bit(address_in_page);   
  172. ACK();//以上是一个“哑”写操作,相当于设置当前地址   
  173. SCL=1;   
  174. _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA   
  175. SDA=0;   
  176. _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA   
  177. SCL=0; //START   
  178. write_8bit(0xa1); //写从地址,置为读模式   
  179. ACK();   
  180. while (i--)   
  181. {   
  182.     SDA=1;   
  183.     ddata<<=1;   
  184.     SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;   
  185.     if (SDA) ddata|=0x01;   
  186. }   
  187. SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
  188. SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
  189. SDA=1; //STOP   
  190. delay();   
  191. return ddata;   
  192. }   
  193. /*分析:  
  194. 该芯片采用传统的IIC口的规约形式,是一个标准的经典IIC封装。  
  195. 注:使用该程序时注意改变芯片各个接口的修改。注意屏蔽主函数。  
  196. */  
  197. main()   
  198. {   
  199.     unsigned int i;   
  200.     unsigned char kk,j[32];   
  201.     delay();   
  202.     kk=ReadIIC_24C01( 12 );   
  203.     WriteIIC_24C01(12,0x67);   
  204.     kk=ReadIIC_24C01(12);   
  205.     for(i=0;i<32;i++) j[i]=ReadIIC_24CXX(IIC24C01,i);   
  206.     for(i=0;i<32;i++) j[i]=i*2;   
  207.        
  208.     for(i=0;i<32;i++) WriteIIC_24CXX(IIC24C01,i,0x55);   
  209.     for(i=0;i<32;i++) j[i]=0;   
  210.     for(i=0;i<32;i++) j[i]=ReadIIC_24CXX(IIC24C02,i);   
  211. }    
  212.   
  213.   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4