來源:百問網(wǎng)_嵌入式linux wiki_jz2440 新1期視頻維基教程 (視頻文字版)
作者:韋東山
本文字數(shù):1856,閱讀時長:3.5分鐘
I2C協(xié)議
I2C在硬件上的接法如下(圖19-1)所示,主控芯片引出兩條線SCL,SDA線,在一條I2C總線上可以接很多I2C設(shè)備,我們還會放一個上拉電阻(放一個上拉電阻的原因以后我們再說)。
我們怎么傳輸數(shù)據(jù),我們需要發(fā)數(shù)據(jù)從主設(shè)備發(fā)送到從設(shè)備上去,也需要把數(shù)據(jù)從從設(shè)備傳送到主設(shè)備上去,數(shù)據(jù)涉及到雙向傳輸。
舉個例子:
體育老師:可以把球發(fā)給學生,也可以把球從學生中接過來。
1.發(fā)球:a.老師說:注意了(start) b.老師對A學生說我要球發(fā)給你(地址)。
- c.老師就把球發(fā)出去了(傳輸)。
- d.A收到球之后,應(yīng)該告訴老師一聲(回應(yīng))。
- e.老師說下課(停止)
2.接球:
- a.老師說注意了(start),
- b.老師說:B把球發(fā)給我(地址)
- c.B就把球發(fā)給老師(傳輸)
- d.老師收到球之后,給B說一聲,表示收到球了(回應(yīng))。
- e.老師說下課(停止)
我們就使用這個簡單的例子,來解釋一下IIC的傳輸協(xié)議。
- 老師說注意了,表示開始信號(start)
- 老師告訴某個學生,表示發(fā)送地址(address)
- 老師發(fā)球/接球,表示數(shù)據(jù)的傳輸
- 老師/學生收到球,回應(yīng)表示:回應(yīng)信號(ACK)
- 老師說下課,表示IIC傳輸接受(P)
IIC傳輸數(shù)據(jù)的格式
1.寫操作:
剛開始主芯片要發(fā)出一個start信號,然后發(fā)出一個設(shè)備地址(用來確定是往哪一個芯片寫數(shù)據(jù)),方向(讀/寫,0表示寫,1表示讀)。
回應(yīng)(用來確定這個設(shè)備是否存在),然后就可以傳輸數(shù)據(jù),傳輸數(shù)據(jù)之后,要有一個回應(yīng)信號(確定數(shù)據(jù)是否接受完成),然后再傳輸下一個數(shù)據(jù)。
每傳輸一個數(shù)據(jù),接受方都會有一個回應(yīng)信號,數(shù)據(jù)發(fā)送完之后,主芯片就會發(fā)送一個停止信號。
白色背景:主→從
灰色背景:從→主
2.讀操作:
剛開始主芯片要發(fā)出一個start信號,然后發(fā)出一個設(shè)備地址(用來確定是從哪一個芯片讀取數(shù)據(jù)),方向(讀/寫,0表示寫,1表示讀)。
回應(yīng)(用來確定這個設(shè)備是否存在),然后就可以傳輸數(shù)據(jù),傳輸數(shù)據(jù)之后,要有一個回應(yīng)信號(確定數(shù)據(jù)是否接受完成),然后再傳輸下一個數(shù)據(jù)。
每傳輸一個數(shù)據(jù),接受方都會有一個回應(yīng)信號,數(shù)據(jù)發(fā)送完之后,主芯片就會發(fā)送一個停止信號。
白色背景:主→從
灰色背景:從→主
傳輸是以8位為單元數(shù)據(jù)傳輸?shù)?,先傳輸最高?MSB),主芯片發(fā)出start信號之后,然后發(fā)出9個時鐘傳輸數(shù)據(jù)。
(1)開始信號(S):SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。
(2)結(jié)束信號(P):SCL為高電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。
(3)響應(yīng)信號(ACK):接收器在接收到8位數(shù)據(jù)后,在第9個時鐘周期,拉低SDA
SDA上傳輸?shù)臄?shù)據(jù)必須在SCL為高電平期間保持穩(wěn)定,SDA上的數(shù)據(jù)只能在SCL為低電平期間變化。如圖
1.問題:如何在SDA上實現(xiàn)雙向傳輸?
答:主芯片通過一根SDA線既可以把數(shù)據(jù)發(fā)給從設(shè)備,也可以從SDA上讀取數(shù)據(jù),連接SDA線的引腳里面必然有兩個引腳(發(fā)送引腳/接受引腳)。
2.問題:主設(shè)備(從設(shè)備)發(fā)送數(shù)據(jù)時,從設(shè)備(主設(shè)備)的發(fā)送引腳,不影響數(shù)據(jù)的發(fā)送,怎么做到呢?
答:里面放一個三極管,使用開極(極電集開發(fā)出去作為輸出)電路,如下圖
下面畫一個真值表:
- 從真值表和電路圖我們可以知道,當某一個芯片不行影響SDA線時,那就不驅(qū)動這個三極管。
- 想輸出高電平時;都不驅(qū)動(高電平就由上拉電阻決定)。
- 想輸出低電平,就驅(qū)動三極管。
從下面的例子可以看看數(shù)據(jù)是怎么傳的(實現(xiàn)雙向傳輸),比如:主設(shè)備發(fā)送(8bit)給從設(shè)備 1.前8個clk
- 從設(shè)備不要影響,從設(shè)備不驅(qū)動三極管;
- 主設(shè)備決定數(shù)據(jù);
2.第9個clk,由從設(shè)備決定數(shù)據(jù)
- 主設(shè)備不驅(qū)動三極管;
- 從設(shè)備決定數(shù)據(jù);
從上面的例子,就可以知道,怎樣在一條線上實現(xiàn),雙向傳輸?shù)霓k法。這就是為什么在SDA,SCL上放上拉電阻的原因。
在第9個時鐘之后,如果有某一方處于繁忙狀態(tài),它可以一直把SCL拉低當SCL為低電平時候,大家都不應(yīng)該使用IIC總線,只有當SCL從低電平變?yōu)楦唠娖降臅r候,IIC總線才能被使用。
從前圖我們也可以知道ACK信號應(yīng)該是低電平。主設(shè)備不驅(qū)動三極管,如果從設(shè)備不驅(qū)動三極端的話SDA應(yīng)該是高電平,當從設(shè)備接收數(shù)據(jù)之后,發(fā)出回應(yīng)信號的時候,就會驅(qū)動三極管,讓SDA變?yōu)榈碗娖健K哉f:ACK信號是低電平。
對于IIC協(xié)議它只能規(guī)定怎么傳輸數(shù)據(jù),數(shù)據(jù)什么含義它完全不能夠控制,數(shù)據(jù)的含義有從設(shè)備決定。