1. gzyueqian
      18529173453
      首頁 > 新聞中心 > > 正文

      AT24C01/02/04/08/16/32系列EEPROM驅動程序 

      更新時間: 2007-04-24 17:43:02來源: 粵嵌教育瀏覽量:558


      〖說明〗24Cxx I2C EEPROM字節讀寫驅動程序,芯片A0-A1-A2要接GND(24C65接VCC,具體看DataSheet)。

        現缺頁寫、頁讀,和CRC校驗程序。以下程序經過50臺驗證,批量的效果有待考察。

        為了安全起見,程序中很多NOP是冗余的,希望讀者能進一步精簡,但必須經過驗證。

        Atmel 24C01 比較特殊,為簡約型,為其單獨編程.

        51晶振為11.0592MHz

      〖文件〗RW24CXX.c 2001/09/18
      --------------------------------------------------------------------------------*/
      /*---------------------------------------------------------------------------------------------------------------

      調用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18

      函數說明:對于IIC芯片24CXX,在指定地址address寫入一個字節ddata

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


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

      #i nclude "reg51.h"
      #i nclude "intrins.h"

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

      enum EEPROMTYPE {IIC24C01,IIC24C01A,IIC24C02,IIC24C04,IIC24C08,IIC24C16,IIC24C32,IIC24C64,IIC24C128,IIC24C256};
      enum EEPROMTYPE eepromtype;


      delay()
      {
      unsigned int i=1200;
      while(i--);
      }
      /*----------------------------------------------------------------------------
      調用方式:write_8bit(unsigned char ch) ﹫2001/03/23
      函數說明:內函數,私有,用戶不直接調用。
      -------------------------------------------------------------------------------*/
      void write_8bit(unsigned char ch)
      {
      unsigned char i=8;
      SCL=0;
      _nop_();_nop_();_nop_();_nop_();_nop_();
      while (i--)
      {
      SDA=(bit)(ch&0x80);
      _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_();
      }
      /*------------------------------------------------------------------------------
      調用方式:void ACK(void) ﹫2001/03/23
      函數說明:內函數,私有,用戶不直接調用。
      -------------------------------------------------------------------------------*/
      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( (address<<1) & 0xfe); //寫頁地址和操作方式,對于24C32-24C256,page不起作用
      ACK();
      write_8bit(ddata); //發送數據
      ACK();
      SDA=0;
      _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
      SDA=1; //STOP
      delay();
      }
      /*---------------------------------------------------------------------------------------------------------------
      調用方式:void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address,unsigned char ddata) ﹫2001/09/18
      函數說明:對于IIC芯片24CXX,在指定地址address寫入一個字節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=page<<1;
      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,地址為一字節;24C32-24C256,地址為二字節
      {
      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( (address<<1) | 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;
      }
      /*----------------------------------------------------------------------------------------------------
      調用方式:unsigned char ReadIIC_24CXX(enum EEPROMTYPE eepromtype,unsigned int address) ﹫2001/09/18
      函數說明:讀取IIC芯片24CXX,指定地址address的數據。
      ------------------------------------------------------------------------------------------------------*/
      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=page<<1;
      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,地址為二字節,先送高位,后送低位
      {
      write_8bit(address>>8);
      ACK();
      }
      //如果是24C01-24C16,地址為一字節;
      write_8bit(address_in_page);
      ACK();//以上是一個“啞”寫操作,相當于設置當前地址
      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;
      }
      /*分析:
      該芯片采用傳統的IIC口的規約形式,是一個標準的經典IIC封裝。
      注:使用該程序時注意改變芯片各個接口的修改。注意屏蔽主函數。
      */
      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;i<32;i++) j[i]=ReadIIC_24CXX(IIC24C01,i);
      for(i=0;i<32;i++) j[i]=i*2;

      for(i=0;i<32;i++) WriteIIC_24CXX(IIC24C01,i,0x55);


      for(i=0;i<32;i++) j[i]=0;
      for(i=0;i<32;i++) j[i]=ReadIIC_24CXX(IIC24C02,i);
      }

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 中文字幕一区二区三区乱码 | 日韩精品午夜一区二区三区免费在线 | 免费人成国产网页在线观看 | 日本亚洲精品色婷婷在线影院 | 亚洲国产综合精品一区 | 自拍一区综合图区 |