由於用mpu6050模塊,所以要用上i2c通信原理。


                   i2c通信原理
i2c總線只有兩根雙向信號線,一根是數據線SDA,一根是時鍾線SCL。
每個接到i2c總線上的器件都有唯一的地址,主機與其他器件之間的數據傳送可以是由主機發送給其他器件。主機為發送器,從機為接收器。在80c51單片機系統中,通常80C51單片機為主機,

                                     
    1:數據位的有效規定:

1.1:總線在進行數據傳送時,時鍾信號為高電平期間,數據線上的數據必須保持穩定,時鍾線為低電平期間時,數據線上的高電平和低電平才能允許變化。

1.2:起始信號和終止信號都是由主機發出的,起始信號產生后,總線就處於占用狀態;終止信號產生后,總線就處於空閑狀態

1.3:連接到i2c總線上的上的器件,若具有i2c總線的硬件接口,則很容易檢測到起始和終止信號。接收器件在接收到一個完整的數據字節后,有可能需要完成一些其他的工作,如處理內部中斷函數等,不能立即接收下一個字節數據,這時,接收器件可以將SCL時鍾線拉成低電平,從而使主機處於等待狀態,等到接收器准備好接收下一個字節后,再釋放SCL時鍾線,使之為高電平,從而數據傳送繼續進行。

    2:數據傳送格式:

2.1:字節傳送與應答
每一個字節必須保證是8位長度,數據傳送時,先傳送最高位,每一個被傳送字節后面都必須跟隨一個應答位(即一個數據幀有9位),由於某種原因從機不對主機尋址信號應答時(如從機正在進行實時性的處理工作而無法接收總線上的數據,它必須將數據線SDA置於高電平,主機產生一個終止信號以結束總線的數據傳送。如果從機對主機進行了應答,但在接收數據一段時間后無法接收更多的數據,從機可通過對無法接收的第一個數據字節的“非應答”通知主機,主機則應發出終止信號以結束數據的繼續傳送。當主機接收數據時,它收到最后一個數據字節后,必須向從機發出一個結束傳送的信號,這個信號是對從機的非應答來實現的,然后從機釋放數據線SDA,以允許主機產生終止信號。 

2.2:數據幀格式
i2c總線上的數據信號是廣義的。既包括地址信號,又包括真正的數據信號。在起始信號產生后,必須傳送一個從機的地址(7位),第8位是數據傳送的方向位(R/T),用“0”表示主機發送數據(T),“1”表示主機接收數據(R),每次數據傳送總是由主機產生的終止信號結束。但是,若主機希望繼續占用總線進行新的數據傳送,則可以不產生終止信號,馬上再次發出起始信號對另一從機進行尋址。

2.3:數據傳送過程中幾種組合方式
   
A表示應答,A非表示非應答(高電平),S表示起始信號,P表示終止信號

   a:主機向從機發送數據,數據傳送方向在整個傳送過程中不變

主機S -> 從機地址 -> 0 -> 從機A -> 主機發數據 -> 從機A -> 主機發數據 -> 從機A非 -> 主機P
 
  b:主機在第一個字節后,立即從從機讀數據

主機S -> 從機地址 -> 1 -> 從機A -> 從機發數據 ->主機A -> 從機發數據 ->主機A非 ->  主機P

 c:在傳送過程中,當需要改變傳送方向時,起始信號和從機地址都被重復產生一次,但兩次讀/寫方向位正好相反

主機S -> 從機地址 -> 0 -> 從機A -> 主機發數據 ->從機A或A非 -> 主機S->從機地址 -> 1 -> 從機A ->從機發數據 -> 主機A非-> 主機 P


     3:總線的尋址

3.1:主機發送地址時,總線上的每個從機都將這7位地址碼與自己的地址進行比較,如果相同則認為自己正被主機尋址,根據R/T位將自己確定為發送器或接收器。從機的地址由固定部分和可編程部分組成,在一個系統種可能希望接入多個相同的主機,從機地址中可編程部分決定了可接入總線該類器件的最大數目

3.2:典型信號模擬:
    (1)數據線狀態函數:

      u8    funcGetI2CStatus(void)
   {
    return I2C_sda;
   }

    (2)起始信號模擬函數:

     u8 I_start(void )//起始信號模擬
    { 
    SDAHigh(HIGH);         /* SDA 為 高電平*/
    I2C_delay();          /* SDA 穩定     */
    SCLHigh(HIGH);         /* SCL 為高電平*/
    I2C_delay();
    if(!funcGetI2CStatus())
    {
        return I2C_BUS_BUSY;
    }
     SDAHigh(LOW);          /* SDA 產生下降沿*/
    I2C_delay();
    SCLHigh(LOW);
    I2C_delay();
      if(funcGetI2CStatus())
     {
        return    I2C_BUS_ERROR;
    }
    else 
        return I2C_BUS_READY;
     }
 
    (3)終止信號模擬函數
  

     void I_stop(void)//終止信號模擬
     { 
    SDAHigh(LOW);
    I2C_delay();
    SCLHigh(HIGH);     /*SCL1 為高電平期間,SDA1產生一個上升沿*/
    I2C_delay();
    SDAHigh(HIGH);
    }

    (4)應答信號模擬函數
  
     void I_ACK(void) //應答信號模擬
    { 
    SDAHigh(LOW);
    I2C_delay();
    SCLHigh(HIGH);
    I2C_delay();
    SDAHigh(HIGH);
    I2C_delay();
    }
 
     4.串行E2PROM的擴展:
4.1:寫入過程:
 單片機進行寫操作時,首先發送該器件的7位地址碼和和寫方向位“0”,發送完后釋放SDA線並在SCL線上產生第9個時鍾信號。被選中的存儲器件在確認是自己的地址后,在SDA線上產生一個應答信號作為相應,單片機收到應答后就可以傳送數據了.傳送數據時,單片機首先發送一個字節的被寫入器件的存儲區的首地址,收到存儲器件的應答后,單片機就逐個發送各數據字節,但每發送一個字節后都要等待應答。
 AT24C系列器件片內地址在接收到每一個數據字節地址后自動加1,在芯片的“一次裝載字節數”(不同芯片字節數不同)限度內,只需輸入首地址。裝載字節數超過芯片的“一次裝載數”時,數據地址將“上卷”,前面的數據將被覆蓋。
 當要寫入的數據傳送完后,單片機應發出終止信號以結束寫入操作。寫入n個字節的數據格式:
S ->主機發送器件地址+0->從機A->主機寫入首地址-> 從機A -> 主機發送數據1-> 從機A ->...->主機發送數據n ->從機A ->主機發送P.

4.2:讀出過程
 單片機先發送該器件的7位地址碼和寫方向位“0”,發送完后釋放SDA數據線並在SCL線上產生第9個時鍾信號。被選中的存儲器器件在確認是自己的地址后,在SDA線上產生一個應答信號作為回應。然后再發一個字節的要讀出器件的存儲區的首地址,收到應答后,單片機要重復一次起始信號並發出器件地址和讀方向位(“1),收到器件應答后就可以讀出數據字節,每讀出一個字節,單片機都要回復應答信號。當最后一個字節數據讀完后,單片機應返回以"非應答"(高電平),並發出終止信號以結束讀操作。
S ->主機發送器件地址+0 ->從機A ->主機讀出首地址 ->從機A -> 主機發送器件地址+1 -> 從機A ->從機發送數據 -> 主機A ->... ->從機發送數據n ->主機非應答 ->主機p.

4.3:移位操作
左移時最低位補0,最高位移入PSW的CY位。
右移時最高位保持原數,最低位移除。
   
  
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM