s5pv210——I2C基础详解、I2C时序详解
以下內容源于朱有鵬嵌入式課程的學習,如有侵權,請告知刪除 。
參考博客:
http://blog.csdn.net/oqqhutu12345678/article/details/65445338
http://www.cnblogs.com/biaohc/p/6271335.html
https://blog.csdn.net/Mr_Lyoko/article/details/79598106
https://blog.csdn.net/lingfeng5/article/details/73361833(推薦)
?
一、I2C介紹
1、物理接口:SCL+SDA
(1)SCL(serial clock):時鐘線,傳輸CLK信號,一般是I2C主設備向從設備提供時鐘的通道。
(2)SDA(serial data):數據線,通信數據(命令、地址、數據)都通過SDA線傳輸。
2、通信特征:串行、同步、電平、低速率
(1)串行通信。所有的數據以bit為單位在SDA線上串行傳輸(但每次傳輸8bit)。
(2)同步通信。即通信雙方工作在同一個時鐘。A方通過一根CLK信號線傳輸A的時鐘給B,B工作在A傳輸的時鐘下。
(3)非差分。因為I2C通信速率不高,而且通信雙方距離很近,所以使用電平信號通信。
(4)低速率。I2C一般用在同一個板子上的2個IC之間,傳輸的數據量不大,因此本身通信速率很低(一般幾百KHz,不同的I2C芯片的通信速率可能不同,具體在編程的時候要看設備允許的I2C通信最高速率)。
3、突出特征
(1)主設備+從設備
- 分主設備和從設備。通信由主設備發起和主導,從設備只是按照I2C時序協議被動的接受主設備的通信。
- 誰是主從設備,由通信雙方來決定(I2C協議并無規定)。
(2)可以多個設備掛在一條總線上(從設備地址)
- 主設備負責調度總線,決定某一時間和哪個從設備通信。
- 同一時刻,只能有一個從設備和主設備通信,其他從設備處于“冬眠”狀態。
- 每個I2C從設備在通信中都有一個I2C從設備地址,共7個bit,廣播地址全0。
- 它是從設備本身固有的屬性。通信時主設備需要知道從設備的地址,然后在通信中通過地址來甄別是不是自己要找的那個從設備。這個地址是一個電路板上唯一的,不是全球唯一的。
- 系統中可能有多個同種芯片,為此addr分為固定部分和可編程部份,細節視芯片而定,看datasheet。
- 理論上7位有128位地址,然而除去保留幾個保留地址如廣播地址0x00等,數量少于128個,且標準協議里預見了地址的局限性,擴充了10位地址的概念。
- 對于IIC可以掛多少個設備的問題:對于同一個地址的設備來說,在不進行地址擴充(片選)的情況下只能掛一個,對于不同的設備來說,標準協議里面沒有限制具體的個數的多少,這個由線路布線情況,軟件情況以及工作模式確定。對于標準模式,只要總線上的負載電容不超過400pf,不超過芯片的負載能力既可以。
(3)SDA傳輸數據是大端傳輸,是以字節為單位的,每次傳輸的有效數據都是1個字節(8位)。
4、應用領域
SoC和周邊外設之間的通信,典型的如EEPROM、電容觸摸IC、各種sensor等;
?
二、I2C時序
1、I2C通信時序的四個元素
(1)開始信號、結束信號
SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。 ??
SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。
分析:跳變有兩個方向1->0和0->1,因為SDA總線空閑是1(由下圖可知),且只有下拉操作,故1->0是開始信號,1->1是結束信號。
(2)數據bit傳輸(應答 / “0”、非應答 / “1”)
SCL為高電平時,SDA線若保持穩定,那么SDA上是在傳輸數據bit。
SDA傳輸完一個字節后,主機會釋放SDA線(最后一位若是0,則取消下拉恢復為高電平1,或者最后一位本來就是1),這時SDA處于高電平的狀態,從機就可以控制SDA線了。
若從機下拉了SDA線并且主機從SDA讀到了這一個低電平,則表示從機發送了一個確認信號(0)。
若從機不對SDA下拉,則主機讀到SDA依然位高電平,故表示一個非應答信號(1)。
?
2、I2C數據傳輸格式
(1)每一個通信周期的發起和結束都由主設備進行,從設備只有被動的響應主設備。
(2)在每個通信周期,主設備先發送8位的從設備地址
- 其中7位是從設備地址,1位表示主設備接下來是要寫數據到總線,還是從總線讀取數據;
- 主設備以廣播的形式發送,總線上的所有從設備都能收到這個信息;
- 從設備收到地址后,與本身的設備地址對比。
(3)發送方發送一段數據后,接收方需要回應一個ACK
- 這個響應只有1個bit位,只能表示2個意思,表示有無收到數據。
(4)在某個時刻,主設備和從設備只能有一個在發(占用總線,也就是向總線寫),另一個在收(從總線讀)。
?
3、數據在總線上的傳輸協議
?
a、綜述
(1)起始位及其后的8個clk中都是主設備在發送(主設備掌控總線),此時從設備只能讀取總線,通過讀總線來得知主設備發給從設備的信息;
(2)然后到了第9周期,按照協議規定從設備需要發送ACK給主設備,所以此時主設備必須釋放總線(主設備把總線置為高電平然后不要動),同時從設備試圖拉低總線發出ACK。
(3)如果從設備拉低總線失敗,或者從設備根本就沒有拉低總線,則主設備看到的現象就是總線在第9周期仍然一直保持高。這意味著主設備沒有收到ACK,主設備就認為剛才給從設備發送的8字節不對。
b、細述
主設備首先會發送7bit位的slave device地址,和1bit位的rean或者write命令。(這里的讀寫,講的是主機對總線的操作。比如寫,主機寫數據到總線,那么從機是讀的;比如讀,主機讀總線的數據,那么從機是寫的。)
(1)write命令
如果為write命令,則主設備釋放總線(If the I2C-bus is free, both SDA and SCL lines should be both at High level),即SDA為高位;然后從設備拉低SDA,表示ACK主設備;然后主設備再發送8bit數據,從設備再ACK(A),通信結束(P)。
寫寄存器的標準流程:
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
(2)read命令
如果為read命令,則從設備先拉低SDA表示ACK主設備,然后再發送8bit數據。主設備拉低SDA表示ACK從設備(我已經讀取8bit的數據了),之后結束。
讀寄存器的標準流程
1、Master發送I2Caddr(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步可以重復多次,即順序讀多個寄存器
總結
以上是生活随笔為你收集整理的s5pv210——I2C基础详解、I2C时序详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 唯美MACD
- 下一篇: linux gunzip r .tar,