<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AT24C01/02/04/08/16/32系列EEPROM讀寫程序

          AT24C01/02/04/08/16/32系列EEPROM讀寫程序

          作者: 時(shí)間:2012-09-29 來源:網(wǎng)絡(luò) 收藏

          /*------------------------------------------------------------------------------
          〖說明〗24Cxx I2C 字節(jié)讀寫驅(qū)動(dòng)程序,芯片A0-A1-A2要接GND(24C65接VCC,具體看DataSheet)。
          現(xiàn)缺頁寫、頁讀,和CRC校驗(yàn)程序。以下程序經(jīng)過50臺驗(yàn)證,批量的效果有待考察。
          為了安全起見,程序中很多NOP是冗余的,希望讀者能進(jìn)一步精簡,但必須經(jīng)過驗(yàn)證。
          Atmel 比較特殊,為簡約型,為其單獨(dú)編程.
          51晶振為11.0592MHz
          〖文件〗RW24CXX.c 2001/09/18
          --------------------------------------------------------------------------------*/
          /*---------------------------------------------------------------------------------------------------------------
          調(diào)用方式:void WriteIIC_24CXX(enum TYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18
          函數(shù)說明:對于IIC芯片24CXX,在指定地址address寫入一個(gè)字節(jié)ddata

          調(diào)用方式:unsigned char ReadIIC_24CXX(enum TYPE eepromtype,unsigned int address) ﹫2001/09/18

          函數(shù)說明:讀取IIC芯片24CXX,指定地址address的數(shù)據(jù)。
          -----------------------------------------------------------------------------------------------------------------*/

          #include "reg51.h"
          #include "intrins.h"

          sbit SCL= P2^7;
          sbit SDA= P2^6;

          enum EEPROMTYPE {IIC,IICA,IIC24C02,IIC24C04,IIC24C08,IIC24C16,IIC24C32,IIC24C64,IIC24C128,IIC24C256};
          enum EEPROMTYPE eepromtype;
          delay()
          {
          unsigned int i=1200;
          while(i--);
          }
          /*----------------------------------------------------------------------------
          調(diào)用方式:write_8bit(unsigned char ch) ﹫2001/03/23
          函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。
          -------------------------------------------------------------------------------*/
          void write_8bit(unsigned char ch)
          {
          unsigned char i=8;
          SCL=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();
          while (i--)
          {
          SDA=(bit)(ch0x80);
          _nop_();_nop_();_nop_();_nop_();_nop_();
          ch=1;
          SCL=1;
          _nop_();_nop_();_nop_();_nop_();_nop_();
          SCL=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();
          }
          _nop_();_nop_();_nop_();_nop_();_nop_();
          _nop_();_nop_();_nop_();_nop_();_nop_();
          }
          /*------------------------------------------------------------------------------
          調(diào)用方式:void ACK(void) ﹫2001/03/23
          函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。
          -------------------------------------------------------------------------------*/
          void ACK(void)
          {
          unsigned char time_1;
          SDA=1;
          SCL=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();
          SCL=1;
          time_1=5;
          while(SDA) {if (!time_1) break;} //ACK
          SCL=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();
          }
          void WriteIIC_24C01(unsigned char address,unsigned char ddata)
          {SCL=1;
          _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA
          SDA=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
          SCL=0; //START
          write_8bit( (address1) 0xfe); //寫頁地址和操作方式,對于24C32-24C256,page不起作用
          ACK();
          write_8bit(ddata); //發(fā)送數(shù)據(jù)
          ACK();
          SDA=0;
          _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
          SDA=1; //STOP
          delay();
          }
          /*---------------------------------------------------------------------------------------------------------------
          調(diào)用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18
          函數(shù)說明:對于IIC芯片24CXX,在指定地址address寫入一個(gè)字節(jié)ddata
          -----------------------------------------------------------------------------------------------------------------*/
          void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata)
          { unsigned char page,address_in_page;

          if(eepromtype==IIC24C01) //如果是24c01
          {
          WriteIIC_24C01(address,ddata);
          return;
          }
          page=(unsigned char)(address>>8) 0x07;
          page=page1;
          address_in_page=(unsigned char)(address);
          SCL=1;
          _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA
          SDA=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
          SCL=0; //START
          write_8bit(0xa0 | page); //寫頁地址和操作方式,對于24C32-24C256,page不起作用
          ACK();
          if(eepromtype>IIC24C16) //如果是24C01-24C16,地址為一字節(jié);24C32-24C256,地址為二字節(jié)
          {
          write_8bit(address>>8);
          ACK();
          }
          write_8bit(address_in_page);
          ACK();
          write_8bit(ddata);
          ACK();
          SDA=0;
          _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
          SDA=1; //STOP
          delay();
          }
          unsigned char ReadIIC_24C01(unsigned char address)
          {
          unsigned char ddata=0;
          unsigned char i=8;
          SCL=1;
          _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA
          SDA=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
          SCL=0; //START
          write_8bit( (address1) | 0x01); //寫頁地址和操作方式
          ACK();
          while (i--)
          {
          SDA=1;
          ddata=1;
          SCL=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();
          SCL=1;
          if (SDA) ddata|=0x01;
          }
          SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
          SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
          SDA=1; //STOP
          delay();
          return ddata;
          }
          /*----------------------------------------------------------------------------------------------------
          調(diào)用方式:unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address) ﹫2001/09/18
          函數(shù)說明:讀取IIC芯片24CXX,指定地址address的數(shù)據(jù)。
          ------------------------------------------------------------------------------------------------------*/
          unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address)
          { unsigned char page,address_in_page;
          unsigned char ddata=0;
          unsigned char i=8;
          if(eepromtype==IIC24C01)
          {
          return( ReadIIC_24C01(address) );
          }
          page=(unsigned char)(address>>8) 0x07;
          page=page1;
          address_in_page=(unsigned char)(address);
          SDA=0;_nop_();SCL=0; //START
          write_8bit(0xa0 | page); //寫頁地址和操作方式,對于24C32-24C256,page不起作用
          ACK();
          if(eepromtype>IIC24C16) //如果是24C32-24C256,地址為二字節(jié),先送高位,后送低位
          {
          write_8bit(address>>8);
          ACK();
          }
          //如果是24C01-24C16,地址為一字節(jié);
          write_8bit(address_in_page);
          ACK();//以上是一個(gè)“啞”寫操作,相當(dāng)于設(shè)置當(dāng)前地址
          SCL=1;
          _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
          SDA=0;
          _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
          SCL=0; //START
          write_8bit(0xa1); //寫從地址,置為讀模式
          ACK();
          while (i--)
          {
          SDA=1;
          ddata=1;
          SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
          if (SDA) ddata|=0x01;
          }
          SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
          SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
          SDA=1; //STOP
          delay();
          return ddata;
          }
          /*分析:
          該芯片采用傳統(tǒng)的IIC口的規(guī)約形式,是一個(gè)標(biāo)準(zhǔn)的經(jīng)典IIC封裝。
          注:使用該程序時(shí)注意改變芯片各個(gè)接口的修改。注意屏蔽主函數(shù)。
          */
          main()
          {
          unsigned int i;
          unsigned char kk,j[32];
          delay();
          kk=ReadIIC_24C01( 12 );
          WriteIIC_24C01(12,0x67);
          kk=ReadIIC_24C01(12);
          for(i=0;i32;i++) j[i]=ReadIIC_24CXX(IIC24C01,i);
          for(i=0;i32;i++) j[i]=i*2;

          for(i=0;i32;i++) WriteIIC_24CXX(IIC24C01,i,0x55);
          for(i=0;i32;i++) j[i]=0;
          for(i=0;i32;i++) j[i]=ReadIIC_24CXX(IIC24C02,i);
          }

          晶振相關(guān)文章:晶振原理


          關(guān)鍵詞: 24C01 EEPROM C51

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();