由於用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位。
右移時最高位保持原數,最低位移除。
由於用mpu6050模塊,所以要用上i2c通信原理。