个人总结之I2C总线协议
1.what is I2C?
簡單講就是用來傳輸數據的兩根線:一根數據線(SDA)一根時鐘線(SCL)
2.I2C怎么傳輸的?
(1)基本過程:
?????1.主機發出開始信號
?????2.主機接著發出一字節的從機地址信息,其中最低位為讀寫控制碼(1為讀、0為寫)
?高七位為從機器件地址
?????3.從機發出認可信號
?????4.主機開始發送信號,每發完一字節后,從機發出認可信號給主機
?????5.主機發出停止信號
?
(2)對以上信號的具體說明:
?????開始信號:在時鐘線為高電平期間,數據線由高變低,將產生一個開始信號
?????停止信號:在時鐘線為高電平期間,數據線由低變高,將產生一個停止信號
?????應答信號:即認可信號,主機寫從機時,每寫完一個字節,如果正確從機將在下一個時鐘周期將數據線拉低,以告訴主機操作有效。在主機讀從機的時候,正確讀完一個字節后,主機在下一個時鐘周期同樣也要將數據線拉低,發出認可信號,告訴從機所發數據已經收妥(注:讀從機時主機在最后一個字節數據接收完后,不發應答,直接發停止信號)
注意:任何在時鐘線為高電平期間的數據線上的電平改變都被認為是起始和停止信號,所以數據改變必須要在時鐘為低電平時改變。
(3)數據格式:
?????
I2C支持兩種數據格式:
7bit/10bit尋址數據格式
7bit/10bit尋址和重復開始信號的格式
從設備地址:
總線上每個設備都有自己的一個addr,共7個bit,廣播地址全0.
系統中可能有多個同種芯片,為此addr分為固定部分和可編程部份,細節視芯片而定,看datasheet。
?
硬件結構:
每一個I2C總線器件內部的SDA、SCL引腳電路結構都是一樣的,引腳的輸出驅動與輸入緩沖連在一起。其中輸出為漏極開路的場效應管、輸入緩沖為一只高輸入阻抗的同相器。這種電路具有兩個特點:
(1)由于 SDA、SCL 為漏極開路結構,借助于外部的上拉電阻實現了信號的“線與”邏輯;?
(2)引腳在輸出信號的同時還將引腳上的電平進行檢測,檢測是否與剛才輸出一致。為 “時鐘同步”和“總線仲裁”提供硬件基礎。
3.幾個I2C的疑問
(1)模擬I2C與硬件I2C有什么區別
?????原理上:硬件I2C(提供專門的SDA,SCL口)的時鐘是系統產生的,一般由晶振分頻產生。模擬I2C通過編程模擬時鐘線和數據線。
?????控制上:硬件I2C通過硬件中斷實現各種操作。模擬I2C沒有中斷的概念,通過IO口電平置高置低來實現寫入和讀取。
?????性能上:硬件模式更高效更穩定。
(2)MPU6050和MPU9250的I2C
?????之前對于這兩個芯片的通過I2C的操作地址有點亂,如要獲取到加速度計的原始值,首先要發送開始信號,然后是發送從機地址(I2C的設備地址),然后發送寄存器的地址(這里很多人會搞亂了,因為要發兩次地址,第一次是I2C設備地址,第二次是加速度計的地址),接下來才能獲取到原始數據。
4.怎么實現I2C?
?之前的所有鋪墊都是為了實現I2C通訊,所以怎么用代碼實現也是尤為關鍵的一個問題。
下面是是I2C的讀寫流程:
寫寄存器的標準流程為:
1.??? Master發起START
2.??? Master發送I2C addr(7bit)和w操作0(1bit),等待ACK
3.??? Slave發送ACK
4.??? Master發送reg addr(8bit),等待ACK
5.??? Slave發送ACK
6.??? Master發送data(8bit),即要寫入寄存器中的數據,等待ACK
7.??? Slave發送ACK
8.??? 第6步和第7步可以重復多次,即順序寫多個寄存器
9.??? Master發起STOP
讀寄存器的標準流程為:
1.??? Master發送I2C addr(7bit)和w操作1(1bit),等待ACK
2.??? Slave發送ACK
3.??? Master發送reg addr(8bit),等待ACK
4.??? Slave發送ACK
5.??? Master發起START
6.??? Master發送I2C addr(7bit)和r操作1(1bit),等待ACK
7.??? Slave發送ACK
8.??? Slave發送data(8bit),即寄存器里的值
9.??? Master發送ACK
10.??? 第8步和第9步可以重復多次,即順序讀多個寄存器
以上通訊流程模擬I2C跟硬件I2C都類似,不同的地方是讀寫:
如MSP430的程序:
模擬I2C發送數據
void LCD_WrCmd(unsigned char cmd)
{
????unsigned char i=8, temp=0;
????//LCD_DC=0;
????for(i=0;i<8;i++) //發送一個八位數據
????{
????????LCD_SCL_L;
???????
????????temp = cmd&0x80;
????????if (temp == 0)
????????{
????????????LCD_SDA_L;
????????}
????????else
????????{
????????????LCD_SDA_H;
????????}
????????LCD_SCL_H;
????????cmd<<=1;; ???????
????} ????
}
通過時鐘線SCL和數據線SDA的高低電平來傳入數據
而硬件I2C:
//寫入數據// Load TX buffer
void USCI_B1_I2C_WriteByte(unsigned char byte)
{
??while(!(UCB1IFG & UCTXIFG));
??UCB1TXBUF = byte;
}
直接通過UCB1TXBUF 來發送
總結
以上是生活随笔為你收集整理的个人总结之I2C总线协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL未能排它地锁定数据库以执行该操作解
- 下一篇: SQL查询中的转义字符