色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)開(kāi)發(fā)--時(shí)序影響

          單片機(jī)開(kāi)發(fā)--時(shí)序影響

          作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏

          單片機(jī)開(kāi)發(fā)中,如果時(shí)序關(guān)系不正確定的話,數(shù)據(jù)就不能正確的讀寫(xiě)。因此,在程序中,如何正確的控制時(shí)序關(guān)系,就顯得特別的重要。

          本文引用地址:http://cafeforensic.com/article/201611/320781.htm

          先來(lái)看以下的兩個(gè)例子:

          1.DS1302時(shí)鐘芯片,采用SPI總線;

          2.24C08存儲(chǔ)芯片,采用I2C總線。

          在對(duì)DS1302進(jìn)行編程時(shí),發(fā)現(xiàn)數(shù)碼管只顯示時(shí)間的奇數(shù)值,而偶數(shù)值則不顯示。

          檢查了下程序,問(wèn)題定位在讀出數(shù)據(jù)與寫(xiě)入數(shù)據(jù)的函數(shù),原函數(shù)具體如下:

          uchar ReadDs1302()

          {

          uchar dat,i;

          SCLK=1;

          Delayus(2);

          for(i=0;i<8;i++)

          {

          dat>>=1;

          if(DATA==1)

          {

          dat|=0x80;

          }

          SCLK=1;

          Delayus(2);

          SCLK=0;

          Delayus(2);

          }

          return da;

          }

          將上面紅色字體的那行程序刪除,或者改為:SCLK=0,再重新燒寫(xiě)后,數(shù)碼管顯示的時(shí)間正常。

          而寫(xiě)入數(shù)據(jù)的函數(shù)如下:

          void WriteDs1302(uchar dat)

          {

          uchar i;

          SCLK=0;

          Delayus(2);

          for(i=0;i<8;i++)

          {

          DATA=dat&0x01;

          Delayus(2);

          SCLK=1;

          Delayus(2);

          SCLK=0;

          dat>>=1;

          Delayus(2);

          }

          }

          若只將上面藍(lán)色部分的程序改為:

          if(i<7)

          {

          SCLK=0;

          }

          重新燒寫(xiě)進(jìn)去后,數(shù)碼管也能正確的顯示。

          以藍(lán)色那行程序的修改,分析其原因:

          先看下SPI總線的讀操作時(shí)序,其為下降沿采樣,如下圖所示:

          從時(shí)序圖中,可看出,對(duì)于寫(xiě)數(shù)據(jù),是在時(shí)鐘的上升沿,而讀數(shù)據(jù),則是在時(shí)鐘的下降沿。

          程序修改前,在往DS1302中寫(xiě)入第八位數(shù)據(jù)后,時(shí)鐘信號(hào)就變?yōu)榈碗娖?。此后,進(jìn)入讀階段,在DS1302還沒(méi)將數(shù)據(jù)送到SDA線上時(shí),時(shí)鐘就變?yōu)楦唠娖?,此時(shí)對(duì)應(yīng)的SDA上的數(shù)據(jù),還是為寫(xiě)入的數(shù)據(jù)1。

          而程序修改后,即在SDA寫(xiě)入數(shù)據(jù)后,在第八位數(shù)據(jù)時(shí),SCLK就不降為低電平了,一直保持為高電平,直到DS1302將數(shù)據(jù)送到SDA時(shí),才變?yōu)榈碗娖?,在下降沿時(shí)對(duì)SDA上的數(shù)據(jù)進(jìn)行采樣。

          即修改后的程序,在讀寫(xiě)操作交替那個(gè)時(shí)鐘,等到DS1302送數(shù)據(jù)到SDA線上后,才變?yōu)榈碗娖?,進(jìn)行采樣的。

          對(duì)于24C08,其采用I2C總線技術(shù),當(dāng)程序燒寫(xiě)進(jìn)入后,發(fā)現(xiàn)不能正常的工作。

          問(wèn)題定位在I2C結(jié)束信號(hào)函數(shù),具體如下所示:

          void Stop()

          {

          SCL=1;

          SDA=0;

          _nop_();

          _nop_();

          _nop_();

          _nop_();

          _nop_();

          _nop_();

          SDA=1;

          _nop_();

          _nop_();

          _nop_();

          _nop_();

          _nop_();

          _nop_();

          }

          上面紅色兩行程序的順序?qū)φ{(diào)下,則能正確的讀寫(xiě)24C08芯片內(nèi)部的數(shù)據(jù)。

          分析其原因,則在于若執(zhí)行Stop()這個(gè)函數(shù)之前時(shí),若SDA上存在幾個(gè)周期的高電平時(shí),此時(shí)執(zhí)行SCL=1;SDA=0,相當(dāng)于多出了個(gè)I2C的開(kāi)始信號(hào),導(dǎo)致錯(cuò)誤。

          在實(shí)際中,總結(jié)了下以后幾點(diǎn),希望可以盡量避免時(shí)序操作錯(cuò)誤:

          1. 特別注意單字節(jié)讀,寫(xiě)函數(shù)剛開(kāi)始或結(jié)束時(shí),時(shí)鐘信號(hào)的高低電平;

          2. 可確定1或者0為程序的默認(rèn)電平。如對(duì)于DS1302的CLK,可以低電平;

          3. 從節(jié)省功耗的角度出發(fā),盡量保證默認(rèn)電平功耗低。以I2C總線為例,因其有上拉電阻 的存在,故可保證默認(rèn)電平為高;

          4. 同樣從功耗的角度出發(fā),盡量保證各類信號(hào)少翻轉(zhuǎn);

          5. 對(duì)于總線控制信號(hào)(如SPI總線的RST),一切信號(hào)都準(zhǔn)備好之后,控制信號(hào)才開(kāi)啟。當(dāng)總線要停止工作時(shí),先將控制信號(hào)關(guān)斷,再作其他信號(hào)的處理;

          6. 當(dāng)然,得時(shí)刻警惕信號(hào)的建立時(shí)間與保持時(shí)間。

          當(dāng)然,若在程序中查找不出問(wèn)題時(shí),可采用示波器,同時(shí)測(cè)量時(shí)鐘與數(shù)據(jù)信號(hào),判斷時(shí)序是否正確。



          評(píng)論


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

          關(guān)閉