新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > C51單片機模擬I2C總線驅(qū)動程序設(shè)計(2)

        C51單片機模擬I2C總線驅(qū)動程序設(shè)計(2)

        作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
        /************************************ I2C_RcvB ********************************
        函數(shù)名:uchar I2C_RcvB()
        入口:
        出口:uchar 型數(shù)據(jù)
        功能描述:
        接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),收完后需要調(diào)用應(yīng)答函數(shù)。
        調(diào)用函數(shù):
        全局變量
        *******************************************************************************
        uchar I2C_RcvB()
        {
        uchar retc;
        uchar BitCnt; //位
        retc = 0;
        SDA = 1; //置數(shù)據(jù)總線為輸入方式,作為接收方要釋放 SDA.
        for(BitCnt=0;BitCnt<8;BitCnt++)
        {
        _nop_();
        SCL = 0; //置時鐘線為低準備接收數(shù)據(jù)位
        SomeNOP(); //時鐘低電平周期大于 4.7us
        SCL = 1; //置時鐘線為高使數(shù)據(jù)有效
        _nop_();
        _nop_();
        retc = retc<<1;
        if(SDA==1)
        {
        retc = retc + 1;//讀數(shù)據(jù)位,接收的數(shù)據(jù)放入 retc 中
        }
        _nop_();
        _nop_();
        }
        SCL = 0;
        _nop_();
        _nop_();
        return(retc);
        }
        /************************************ I2C_Ackn ********************************
        函數(shù)名:void I2C_Ackn(bit a)
        入口:0 或 1
        出口:
        功能描述:主控制器進行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號)
        說明:作為接收方的時候,必須根據(jù)當前自己的狀態(tài)向發(fā)送器反饋應(yīng)答信號
        調(diào)用函數(shù):
        全局變量:
        *******************************************************************************
        void I2C_Ackn(bit a)
        {
        if(a==0) //在此發(fā)送應(yīng)答或非應(yīng)答信號
        {
        SDA = 0;
        }
        else
        {
        SDA = 1;
        }
        SomeNOP();
        SCL = 1;
        SomeNOP(); //時鐘電平周期大于 4 us
        SCL = 0; //清時鐘線鉗住 I2C 總線以便繼續(xù)接收
        _nop_();
        _nop_();
        }
        /******************************** I2C_ISendB **********************************
        函數(shù)名:bit I2C_ISendB(uchar sla, uchar suba,uchar c)
        入口:從器件地址 sla,子地址 suba, 發(fā)送字節(jié) c
        出口:0(操作有誤),1(操作成功)
        功能描述:從啟動總線到發(fā)送地址、數(shù)據(jù),結(jié)束總線的全過程,
        如果返回1:表示操作成功,否則操作有誤。
        調(diào)用函數(shù):I2C_Start(),I2C_SendB(uchar c),I2C_Stop()
        全局變量:I2C_Ack
        *******************************************************************************
        bit I2C_ISendB(uchar sla, uchar suba, uchar c)
        {
        I2C_Start(); //啟動總線
        I2C_SendB(sla); //發(fā)送器件地址
        if(!I2C_Ack)
        {
        return(0);
        }
        I2C_SendB(suba); //發(fā)送器件子地址
        if(!I2C_Ack)
        {
        return(0);
        }
        I2C_SendB(c); //發(fā)送數(shù)據(jù)
        if(!I2C_Ack)
        {
        return(0);
        }
        I2C_Stop(); //結(jié)束總線
        return(1);
        }
        /********************************** I2C_IRcvB *********************************
        函數(shù)名:bit I2C_IRcvB(uchar sla, uchar suba, uchar *c)
        入口:從器件地址 sla, 子地址 suba, 收到的數(shù)據(jù)在 c
        出口:1(操作成功),0(操作有誤)
        功能描述:從啟動總線到發(fā)送地址、讀數(shù)據(jù),結(jié)束總線的全過程。
        調(diào)用函數(shù):
        I2CS_tart(),
        I2C_SendB(uchar c),
        I2C_RcvB(),
        I2C_Ackn(bit a),
        I2C_Stop()
        全局變量:I2C_Ack
        *******************************************************************************
        bit I2C_IRcvB(uchar sla, uchar suba, uchar *c)
        {
        I2C_Start(); //啟動總線
        I2C_SendB(sla);
        if(!I2C_Ack)
        {
        return(0);
        }
        I2C_SendB(suba); //發(fā)送器件子地址
        if(!I2C_Ack)
        {
        return(0);
        }
        I2C_Start(); //重復(fù)起始條件
        I2C_SendB(sla+1); //發(fā)送讀操作的地址
        if(!I2C_Ack)
        {
        return(0);
        }
        *c = I2C_RcvB(); //讀取數(shù)據(jù)
        I2C_Ackn(1); //發(fā)送非應(yīng)答位
        I2C_Stop(); //結(jié)束總線
        return(1);
        }


        評論


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

        關(guān)閉
        主站蜘蛛池模板: 瑞昌市| 旌德县| 承德县| 沁阳市| 阿鲁科尔沁旗| 浦北县| 乌鲁木齐县| 内江市| 海兴县| 宜阳县| 赤壁市| 文山县| 滦南县| 凤城市| 宁城县| 叶城县| 马公市| 祥云县| 仪陇县| 郎溪县| 深水埗区| 古浪县| 丰顺县| 南通市| 云南省| 绍兴市| 曲靖市| 平陆县| 建始县| 外汇| 汝南县| 台湾省| 沙河市| 安庆市| 犍为县| 师宗县| 托里县| 滦平县| 冀州市| 萝北县| 土默特右旗|