新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機模擬I2C讀寫E2PROM

        單片機模擬I2C讀寫E2PROM

        作者: 時間:2016-11-22 來源:網絡 收藏
        單片機模擬I2C讀寫E2PROM

        //Name: I2C standard program

        //Author: Ares
        //Date:2005.11.4

        本文引用地址:http://www.104case.com/article/201611/319601.htm

        #i nclude
        #i nclude

        sbit SDA=P2^5;
        sbit SCL=P1^0;

        #define uchar unsigned char
        #define uint unsigned int
        #define byte unsigned char

        void delay()
        {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        }


        void delayms (uint x)
        {
        byte j;
        while(x--){
        for(j=0;j<125;j++){;}
        }
        }

        void I2C_Start()//I2C START
        {
        SDA=1;
        _nop_();
        SCL=1;
        delay();
        SDA=0;
        delay();
        SCL=0;
        _nop_();
        }

        void I2C_Stop()//I2C STOP
        {
        SDA=0;
        _nop_();
        SCL=1;
        delay();
        SDA=1;
        delay();
        }

        bit I2C_ReceiveAck()
        {
        bit ck;
        SDA=1;//THE HOST RELEASE THE BUS
        _nop_();
        _nop_();
        SCL=1;
        _nop_();
        _nop_();
        ck=SDA;
        _nop_();
        _nop_();
        SCL=0;
        _nop_();
        return(ck);
        }


        void I2C_SendAck()

        {
        SDA=0;
        _nop_();
        _nop_();
        SCL=1;
        delay();//remain
        SCL=0;
        _nop_();
        _nop_();
        }

        void I2C_SendNoAck()

        {
        SDA=1;
        _nop_();
        _nop_();
        SCL=1;
        delay();//remain
        SCL=0;
        _nop_();
        _nop_();
        }

        void I2C_SendByte(byte SData)
        {uchar i;
        for(i=0;i<8;i++)
        { SDA=(bit)(SData&0x80);
        SData=SData<<1;
        SCL=1;
        delay();
        SCL=0;
        }
        }

        byte I2C_ReceiveByte()
        {uchar i;
        byte RData;
        RData=0;

        for(i=0;i<8;i++)
        { SDA=1;
        _nop_();
        SCL=1;
        _nop_();
        _nop_();
        RData=RData<<1;
        RData=RData|SDA;
        _nop_();
        _nop_();
        SCL=0;
        }
        return(RData);
        }

        void I2C_SendToSubAddress(byte SlaveAddress,byte SubAddress,byte *pSData,uchar N)
        {uchar i;
        I2C_Start();
        I2C_SendByte(SlaveAddress);//send slave address(write device)
        I2C_ReceiveAck();
        I2C_SendByte(SubAddress);//send sub address
        I2C_ReceiveAck();

        for(i=0;i{
        I2C_SendByte(pSData[i]);
        I2C_ReceiveAck();
        }
        I2C_Stop();
        }

        void I2C_ReceiveFromSubAddress(byte SlaveAddress,byte SubAddress,byte *pRData,uchar N)
        {uchar i;
        I2C_Start();
        I2C_SendByte(SlaveAddress);//send slave address(write device)
        I2C_ReceiveAck();
        I2C_SendByte(SubAddress);//send sub address
        I2C_ReceiveAck();
        I2C_Start();//I2C Start Again!
        I2C_SendByte(SlaveAddress+1);//send slave address(read device)
        I2C_ReceiveAck();
        for(i=0;i{
        pRData[i]=I2C_ReceiveByte();
        I2C_SendAck();
        }
        pRData[i]=I2C_ReceiveByte();
        I2C_SendNoAck();
        I2C_Stop();
        }

        main()
        {byte *pData;
        byte a[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        pData=a;
        I2C_ReceiveFromSubAddress(0xA0,0x20,pData,16);
        I2C_SendToSubAddress(0xA0,0,pData,16);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大冶市| 镇江市| 叶城县| 邵阳市| 淄博市| 漾濞| 屏东市| 栾川县| 雷波县| 藁城市| 泰兴市| 鹤山市| 泸溪县| 宁武县| 桦甸市| 丽水市| 习水县| 仙桃市| 松江区| 灯塔市| 准格尔旗| 朝阳区| 平昌县| 石阡县| 四平市| 西吉县| 玉林市| 舒兰市| 柳州市| 成安县| 平武县| 桐城市| 盈江县| 土默特左旗| 台中市| 灌南县| 郑州市| 河南省| 尼木县| 墨竹工卡县| 治县。|