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

          新聞中心

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

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

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


          評論


          技術專區(qū)

          關閉
          看屁屁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); })();