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