新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AT24C01/02/04/08/16/32系列EEPROM讀寫程序

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

        作者: 時間:2012-09-29 來源:網絡 收藏

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

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

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

        #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--);
        }
        /*----------------------------------------------------------------------------
        調用方式: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)(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_();
        }
        /*------------------------------------------------------------------------------
        調用方式: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( (address1) 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=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,地址為一字節;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( (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;
        }
        /*----------------------------------------------------------------------------------------------------
        調用方式: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=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,地址為二字節,先送高位,后送低位
        {
        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;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);
        }

        晶振相關文章:晶振原理


        關鍵詞: 24C01 EEPROM C51

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 柳林县| 龙山县| 商洛市| 图们市| 新闻| 康平县| 丹棱县| 镇沅| 菏泽市| 儋州市| 静海县| 太和县| 同仁县| 祁连县| 澎湖县| 五峰| 台湾省| 望谟县| 油尖旺区| 大厂| 雷州市| 神农架林区| 钦州市| 舞钢市| 新巴尔虎右旗| 凤山县| 瓦房店市| 霸州市| 会泽县| 慈溪市| 巴塘县| 调兵山市| 手游| 仙游县| 黄陵县| 南皮县| 辽阳县| 霞浦县| 宜黄县| 宜州市| 巴马|