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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)—IIC—EEPROM(CAT24WCXX)—03

          51單片機(jī)—IIC—EEPROM(CAT24WCXX)—03

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
          今天沒(méi)事做,突然想起來(lái)了IIC,所以決定回顧一下下,呵呵,忘記了不少,所以打算寫(xiě)出來(lái),便于以后記憶。。。,這里的例子就拿CAT24WCXX的EEPROM來(lái)解釋吧~~(我也是邊寫(xiě)文章,邊寫(xiě)代碼~~~累?。?p>一、IIC總線簡(jiǎn)介

          本文引用地址:http://www.ex-cimer.com/article/201611/321508.htm

          1.IIC總線的主要特點(diǎn)

          IIC總線是一種簡(jiǎn)單、雙向二線制同步串行總線。

          (1)總線只有兩根線,既串行時(shí)鐘線(SCL)和串行數(shù)據(jù)線(SDA),這在設(shè)計(jì)中大大減少了硬件接口

          (2)每個(gè)連接到總線上的器件都有一個(gè)用于識(shí)別的器件地址,(注意,器件地址由芯片內(nèi)部硬件電路和外部地址引腳同時(shí)決定,這樣就避免了~~你懂得)從而建立了簡(jiǎn)單的主從關(guān)系,從而每個(gè)器件都可以作為發(fā)送器,也可以作為接收器。

          (3)同步時(shí)鐘允許器件以不同的波特率進(jìn)行通訊。

          (4)同步時(shí)鐘可以作為停止和重新啟動(dòng)串行口發(fā)送的握手電路(就是開(kāi)始和結(jié)束信號(hào))。

          (5)串行的速率不定(標(biāo)準(zhǔn)100kb/s。。。其它的就不用關(guān)心了)。

          (6)連接到同一總線的集成電路只受400pf的最大總線電容。

          2.IIC總線的基本結(jié)構(gòu)

          機(jī)構(gòu)圖網(wǎng)上一推推的~~~

          每個(gè)器件都有唯一的地址,器件兩兩之間都可以進(jìn)行信息傳送。當(dāng)某個(gè)器件向總線上發(fā)送信息時(shí),它就是發(fā)送器(也叫做主控制器),而當(dāng)其從總線上接收信息時(shí),它又成為接收器(從控制器)。在信息的傳送過(guò)程中,主控制器發(fā)送的信號(hào)分為器件地址碼、器件單元地址和數(shù)據(jù)3部分(這里你完全可以聯(lián)系EEPROM,它們?nèi)齻€(gè)的功能看名字也能才出來(lái),我就不寫(xiě)了)。

          3.IIC總線的信息傳送(這里才它XX的是重點(diǎn),上邊的都是廢話)

          當(dāng)IIC總線沒(méi)有數(shù)據(jù)傳送時(shí),數(shù)據(jù)線(SDA)和時(shí)鐘線(SCL)都為高電平。當(dāng)主控制器向某個(gè)器件傳送信息時(shí),首先應(yīng)向總線傳送開(kāi)始信號(hào),然后才能傳送信息(這里信息包括地址啊,數(shù)據(jù)啊~~)當(dāng)信息傳送結(jié)束時(shí)還應(yīng)該傳送個(gè)結(jié)束信號(hào),開(kāi)始信號(hào)和結(jié)束信號(hào)的規(guī)定如下:

          ~~~~~~~~~~開(kāi)始信號(hào):SCL為高電平時(shí),SDA由高變?yōu)榈偷奶?,開(kāi)始傳送數(shù)據(jù)。

          匯編的代碼:

          START:SETBSDA
          NOP
          SETBSCL;起始條件建立大于4.7us
          NOP
          NOP
          NOP
          NOP
          CLRSDA;起始條件鎖定大于4.7us
          NOP
          NOP
          NOP
          NOP
          NOP
          CLRSCL;鉗住總線,準(zhǔn)備好發(fā)送數(shù)據(jù)
          NOP
          RET

          當(dāng)然然后就是c的代碼了:

          void IIC_start()
          {
          sda=1;
          _nop_();
          scl=1;//開(kāi)始信號(hào)建立時(shí)間大于4.7us
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          sda=0; //開(kāi)始信號(hào)鎖定大于4us
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          scl=0;//鉗住IIC總線,準(zhǔn)備發(fā)送或者接收數(shù)據(jù)
          _nop_();
          _nop_();
          }

          ~~~~~~~~~~~結(jié)束信號(hào):SCL為高電平時(shí),SDA由低變?yōu)楦叩奶?,結(jié)束傳送數(shù)據(jù)。

          還是先是匯編:(這里就不注釋了,太煩了)

          STOP:CLRSDA
          NOP
          SETBSCL
          NOP
          NOP
          NOP
          NOP
          NOP
          SETBSDA
          NOP
          NOP
          NOP
          NOP
          NOP
          RET

          c文件:

          voidIIC_stop()
          {
          sda=0;
          _nop_();
          scl=1;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          sda=1;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          }

          開(kāi)始信號(hào)和結(jié)束信號(hào)之間的傳送的是信息,信息的字節(jié)沒(méi)有限制,但每個(gè)字節(jié)必須為8位,高位在前,低位在后。數(shù)據(jù)線SDA上每一位信息狀態(tài)的改變只能發(fā)生在時(shí)鐘線SCl為低電平期間(這里因?yàn)閯偛砰_(kāi)始信號(hào)和結(jié)束信號(hào),SCl為高電平的期間SDA狀態(tài)的改變已經(jīng)被用來(lái)表示開(kāi)始信號(hào)和結(jié)束信號(hào))。同時(shí)每個(gè)字節(jié)后面必須接受一個(gè)應(yīng)答信號(hào)(ACK),ACK是從器件接收到8位數(shù)據(jù)后向主控制器發(fā)出的特定的低電平脈沖,用來(lái)表示已經(jīng)接收到數(shù)據(jù)(注意是在SCL為高,檢測(cè)SDA是否為低電平,之前SDA要拉高),如果主器件沒(méi)有受到應(yīng)答信號(hào),轉(zhuǎn)到出錯(cuò)處理~~

          ~~~~~~~檢測(cè)應(yīng)答位的程序:

          匯編程序:

          ;返回值A(chǔ)CK=1時(shí)表示應(yīng)達(dá)
          CACK:
          SETBSDA
          NOP
          NOP
          SETBSCL
          CLRACK
          NOP
          NOP
          MOVC,SDA
          JCCEND
          SETBACK;應(yīng)答位置1,既返回應(yīng)答位為1
          CEND:
          NOP
          CLRSCL
          NOP
          c程序(這里面有ack這個(gè)bit型的變量,提前設(shè)置為全局變量,所以函數(shù)類型為void)

          void IIC_ack()
          {
          _nop_();
          _nop_();
          sda=1;//8位數(shù)據(jù)發(fā)送完后,準(zhǔn)備接收數(shù)據(jù)
          _nop_();
          _nop_();
          scl=1;
          _nop_();
          _nop_();
          _nop_();
          if(sda==1)
          ack=0;
          else ack=1;//接收到應(yīng)答位,ack為1,否則置0
          scl=0;
          _nop_();
          _nop_();
          }

          主控器件每次傳送的信息的第一個(gè)字節(jié)必須是器件的地址碼,第二個(gè)字節(jié)為器件的單元地址,用于實(shí)現(xiàn)選擇所操作的器件的內(nèi)部單元,從第三個(gè)字節(jié)開(kāi)始為傳送的數(shù)據(jù)(這里器件的地址碼自己可以上網(wǎng)上搜,高四位為器件的類型碼,最低位為讀寫(xiě)位,其他三位你懂得,自己的設(shè)置位~~~,然后就是器件的單元地址,這個(gè)就看你的器件的存儲(chǔ)器地址了,最后就是數(shù)據(jù)~~~呵呵)。


          上一頁(yè) 1 2 3 下一頁(yè)

          關(guān)鍵詞: 51單片機(jī)IICEEPRO

          評(píng)論


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

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