小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

一篇短文讓你徹底理解什么是I2C通信

 看見就非常 2022-03-28

一、I2C協(xié)議

I2C 也叫 IIC(Inter-Integrated Circuit)總線,是一種由PHILIPS公司在80年代開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。它是半雙工通信方式

我們首先閱讀以下這個例子,這會方便后面大家進一步理解I2C協(xié)議:

如圖所示,老師(MCU)將球(數(shù)據(jù))傳給眾多學(xué)生中的一個(眾多外設(shè)設(shè)備中的一個)。

首先老師將球踢給某學(xué)生,即主機發(fā)送數(shù)據(jù)給從機,步驟如下:

① 老師:開始了(start);
② 老師:A!我要發(fā)球給你!(地址/方向);
③ 學(xué)生A:到!(回應(yīng));
④ 老師把球發(fā)出去(傳輸);
⑤ A收到球之后,應(yīng)該告訴老師一聲(回應(yīng));
⑥ 老師:結(jié)束(停止);

接著老師讓學(xué)生把球傳給自己,即從機發(fā)送數(shù)據(jù)給主機,步驟如下:

① 老師:開始了(start);
② 老師:B!把球發(fā)給我!(地址/方向);
③ 學(xué)生B:到!
④ B把球發(fā)給老師(傳輸);
⑤ 老師收到球之后,給B說一聲,表示收到球了(回應(yīng));
⑥ 老師:結(jié)束(停止)。

從上面的例子可知,都是老師(主機)主導(dǎo)傳球,按照規(guī)范的流程(通信協(xié)議),以保證傳球的準(zhǔn)確性,
收發(fā)球的流程總結(jié)如下:
① 老師說開始了,表示開始信號(start);
② 老師提醒某個學(xué)生要發(fā)球,表示發(fā)送地址和方向(address/read/write);
③ 該學(xué)生回應(yīng)老師(ack);
④ 老師發(fā)球/接球,表示數(shù)據(jù)的傳輸;
⑤ 收到球要回應(yīng):回應(yīng)信號(ACK);
⑥ 老師說結(jié)束,表示IIC傳輸結(jié)束。

以上就是I2C的傳輸協(xié)議,如果是使用IO口來模擬I2C協(xié)議,那么就得需要依次實現(xiàn)上述每個步驟。

二、I2C物理層

這里提個小問題,什么是物理層?

我們可以以分層的思想來理解,例如對于通信協(xié)議,我們可以把它分為物理層協(xié)議層。

物理層規(guī)定通訊系統(tǒng)中具有機械、電子功能部分的特性,確保原始數(shù)據(jù)在物理媒體的傳輸。

協(xié)議層主要規(guī)定通訊邏輯,統(tǒng)一收發(fā)雙方的數(shù)據(jù)打包、解包標(biāo)準(zhǔn)。

簡單來說物理層規(guī)定我們用嘴巴還是用肢體來交流,協(xié)議層則規(guī)定我們用中文還是英文來交流。

I2C通信設(shè)備物理層如圖所示:


I2C通信設(shè)備物理層的特點如下:

① I2C 是一個支持設(shè)備的總線。總線指多個設(shè)備共用的信號線。在一個I2C 通訊總線中,可連接多個I2C 通訊設(shè)備,支持多個通訊主機及多個通訊從機。

② 一個I2C 總線只使用兩條總線線路,一條雙向串行數(shù)據(jù)線(SDA) ,一條串行時鐘線(SCL)。數(shù)據(jù)線即用來表示數(shù)據(jù),時鐘線用于數(shù)據(jù)收發(fā)同步。

③ 每個連接到總線的設(shè)備都有一個獨立地址,主機可以利用這個地址進行不同設(shè)備之間的訪問。

④ 總線通過上拉電阻接到電源。當(dāng)I2C 設(shè)備空閑時,會輸出高阻態(tài),而當(dāng)所有設(shè)備都空閑,都輸出高阻態(tài)時,由上拉電阻把總線拉成高電平。

⑤ 多個主機同時使用總線時,為了防止數(shù)據(jù)沖突,會利用仲裁方式決定由哪個設(shè)備占用總線。

⑥ 具有三種傳輸模式:標(biāo)準(zhǔn)模式傳輸速率為100kbit/s ,快速模式為400kbit/s ,高速模式下可達(dá) 3.4Mbit/s,但目前大多I2C 設(shè)備尚不支持高速模式。

⑦ 連接到相同總線的 IC 數(shù)量受到總線的最大電容 400pF 限制 。

三、I2C協(xié)議層

I2C 的協(xié)議定義了通信的起始和停止信號、數(shù)據(jù)有效性、響應(yīng)、仲裁、時鐘同步和地址廣播等環(huán)節(jié)。

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ā)送一個P停止信號。

  • 白色背景:主→從

  • 灰色背景:從→主

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ā)送一個P停止結(jié)束信號。

  • 白色背景:主→從

  • 灰色背景:從→主

3、起始信號與停止信號

起始信號S停止信號P是兩種特殊的狀態(tài)。

當(dāng) SCL 線是高電平時 SDA 線從高電平向低電平切換,這個情況表示通信的起始。

當(dāng) SCL 是高電平時 SDA 線由低電平向高電平切換,表示通信的停止。

起始和停止信號一般由主機產(chǎn)生。

4、設(shè)備地址與數(shù)據(jù)方向

I2C 總線上的每個設(shè)備都有自己的獨立地址,主機發(fā)起通信時,通過SDA 信號線發(fā)送設(shè)備地址(SLAVE_ADDRESS)來查找從機。

I2C 協(xié)議規(guī)定設(shè)備地址可以是 7 位或 10 位,實際中 7 位的地址應(yīng)用比較廣泛。

緊跟設(shè)備地址的一個數(shù)據(jù)位用來表示數(shù)據(jù)傳輸方向,它是數(shù)據(jù)方向位(R/W),第 8 位或第 11 位。

數(shù)據(jù)方向位為“1”時表示主機由從機讀數(shù)據(jù),該位為“0”時表示主機向從機寫數(shù)據(jù)。


注意:讀數(shù)據(jù)方向時,主機會釋放對SDA 信號線的控制,由從機控制SDA 信號線,主機接收信號;寫數(shù)據(jù)方向時,SDA 由主機控制,從機接收信號。

5、數(shù)據(jù)有效性

I2C 使用 SDA 信號線來傳輸數(shù)據(jù),使用 SCL 信號線進行數(shù)據(jù)同步。

SDA線上的數(shù)據(jù)必須在時鐘的高電平周期保持穩(wěn)定,數(shù)據(jù)線的高或低電平狀態(tài)只有在 SCL 線的時鐘信號是低電平時才能改變。

換言之,SCL為高電平時表示有效數(shù)據(jù),SDA為高電平表示“1”,低電平表示“0”;SCL為低電平時表示無效數(shù)據(jù),此時SDA會進行電平切換,為下次數(shù)據(jù)表示做準(zhǔn)備。

6、應(yīng)答信號

I2C 的數(shù)據(jù)和地址傳輸都帶響應(yīng)。

響應(yīng)包括“應(yīng)答(ACK)”和“非應(yīng)答(NACK)”兩種信號。

I2C每次傳輸?shù)?位數(shù)據(jù),每次傳輸后需要從機反饋一個應(yīng)答位,以確認(rèn)從機是否正常接收了數(shù)據(jù)。

當(dāng)主機發(fā)送了8位數(shù)據(jù)后,會再產(chǎn)生一個時鐘,此時主機放開SDA的控制,讀取SDA電平,在上拉電阻的影響下,此時SDA默認(rèn)為高,必須從機拉低,以確認(rèn)收到數(shù)據(jù)。

作為數(shù)據(jù)接收端時,當(dāng)設(shè)備(無論主從機)接收到I2C 傳輸?shù)囊粋€字節(jié)數(shù)據(jù)或地址后,若希望對方繼續(xù)發(fā)送數(shù)據(jù),則需要向?qū)Ψ桨l(fā)送“應(yīng)答(ACK)”信號,發(fā)送方會繼續(xù)發(fā)送下一個數(shù)據(jù);若接收端希望結(jié)束數(shù)據(jù)傳輸,則向?qū)Ψ桨l(fā)送“非應(yīng)答(NACK)”信號,發(fā)送方接收到該信號后會產(chǎn)生一個停止信號,結(jié)束信號傳輸。

7、傳輸時序圖


從圖中可以看出:

① SDA和SCL開始都為高電平,然后主機將SDA拉低,表示開始信號.

② 在接下來的8個時間周期里,主機控制SDA的高低,發(fā)送從機地址。其中第8位如果為0,表示接下來是寫操作,即主機傳輸數(shù)據(jù)給從機;如果為1,表示接下來是讀操作,即從機傳輸數(shù)據(jù)給主機;另外,數(shù)據(jù)傳輸是從最高位到最低位,因此傳輸方式為MSB(Most Significant Bit)。

③ 總線中對應(yīng)從機地址的設(shè)備,發(fā)出應(yīng)答信號。

④ 在接下來的8個時間周期里,如果是寫操作,則主機控制SDA的高低;如果是讀操作,則從機控制SDA的高低。

⑤ 每次傳輸完成,接收數(shù)據(jù)的設(shè)備,都發(fā)出應(yīng)答信號。

⑥ 最后,在SCL為高電平時,主機由低拉高SDA,表示停止信號,整個傳輸結(jié)束。

8、一些疑問

問題一:如何在SDA上實現(xiàn)雙向傳輸?

答:主芯片通過一根SDA線既可以把數(shù)據(jù)發(fā)給從設(shè)備,也可以從SDA上讀取數(shù)據(jù),連接SDA線的引腳里面必然有兩個引腳(發(fā)送引腳/接受引腳)。

問題二:主設(shè)備(從設(shè)備)發(fā)送數(shù)據(jù)時,從設(shè)備(主設(shè)備)的發(fā)送引腳,不影響數(shù)據(jù)的發(fā)送,怎么做到呢?

答:里面放一個三極管,使用開極(極電集開發(fā)出去作為輸出)電路,如下圖

下面畫一個真值表:

從真值表和電路圖我們可以知道,當(dāng)某一個芯片不行影響SDA線時,那就不驅(qū)動這個三極管。

  • 想輸出高電平時;都不驅(qū)動(高電平就由上拉電阻決定)。

  • 想輸出低電平,就驅(qū)動三極管。

從下面的例子可以看看數(shù)據(jù)是怎么傳的(實現(xiàn)雙向傳輸),比如主設(shè)備發(fā)送(8bit)給從設(shè)備:
① 前8個clk,由主設(shè)備決定數(shù)據(jù):從設(shè)備不驅(qū)動三極管;主設(shè)備決定數(shù)據(jù);
② 第9個clk,由從設(shè)備決定數(shù)據(jù):主設(shè)備不驅(qū)動三極管;從設(shè)備決定數(shù)據(jù);

從上面的例子,就可以知道,怎樣在一條線上實現(xiàn),雙向傳輸?shù)霓k法。
這就是為什么在SDA,SCL上放上拉電阻的原因。

在第9個時鐘之后,如果有某一方處于繁忙狀態(tài),它可以一直把SCL拉低當(dāng)SCL為低電平時候,大家都不應(yīng)該使用IIC總線,只有當(dāng)SCL從低電平變?yōu)楦唠娖降臅r候,IIC總線才能被使用。

從前圖我們也可以知道ACK信號應(yīng)該是低電平。主設(shè)備不驅(qū)動三極管,如果從設(shè)備不驅(qū)動三極端的化SDA應(yīng)該是高電平,當(dāng)從設(shè)備接收數(shù)據(jù)之后,發(fā)出回應(yīng)信號的時候,就會驅(qū)動三極管,讓SDA變?yōu)榈碗娖?。所以說:ACK信號是低電平。

對于IIC協(xié)議它只能規(guī)定怎么傳輸數(shù)據(jù),數(shù)據(jù)什么含義它完全不能夠控制,數(shù)據(jù)的含義有從設(shè)備決定。

四、E2PROM存儲器(AT24Cxx)

E2PROM的全稱是“電可擦除可編程只讀存儲器”,即Electrically Erasable Programmable Read-Only Memory。

1、與Flash的異同

① E2PROM和Flash的本質(zhì)上是一樣的,F(xiàn)lash包括MCU內(nèi)部的Flash和外部擴展的Flash。

② 從功能上,F(xiàn)lash通常存放運行代碼,運行過程中不會修改,而E2PROM存放用戶數(shù)據(jù),可能會反復(fù)修改。

③ 從結(jié)構(gòu)上,F(xiàn)lash按扇區(qū)操作,E2PROM通常按字節(jié)操作。

2、結(jié)構(gòu)原理

E2PROM存儲器市面上各個品牌眾多,但在學(xué)習(xí)中最經(jīng)典就是AT24Cxx系列:


從命名上看,AT24Cxx中xx的單位是K Bit,如AT24C08,其存儲容量為8K Bit。對于AT24C02,其存儲容量為2K Bit,2*1024=2048Bit。

對于AT24C01/02,每頁大小為8 Byte,對于AT24C04/08/16,每頁大小為16 Byte。如圖所示,AT24C02由32頁(Page)組成,每一頁由8個字節(jié)(Byte)組成,每個Byte由8位(Bit)組成,Bit為最小存儲單位,存放1個0或1。

3、設(shè)備地址

I2C設(shè)備都會有一個設(shè)備地址,不同容量的AT24Cxx,設(shè)備地址定義會有所差異:

例如AT24C02的容量為2K,對應(yīng)上圖中的第一行,高四位固定為“1010”,中間三位由A2、A1、A0引腳的電平?jīng)Q定,比如A2~A0引腳全接地,則值為“000”,最后的最低位為讀寫位,0代表寫命令,1代表讀命令。

A2、A1、A0引腳電平需要由原理圖決定,假設(shè)全接電源地,則如果需要向AT24C02寫數(shù)據(jù),則發(fā)送地址“1010 0000”,如果需要向AT24C02讀數(shù)據(jù),則發(fā)送地址“1010 0001”。

假設(shè)開發(fā)板有多個AT24C02掛在同一I2C總線上,通過這個規(guī)則,只需設(shè)計電路時,讓A2、A1、A0引腳電平不同,即可區(qū)分兩個AT24C02。

對于容量再大一點的AT24Cxx系列,比如AT24C04,器件地址由A2、A1引腳決定,數(shù)據(jù)空間有P0決定。比如對AT24C04的0-2K空間操作,則P0為0,對2K-4K空間操作,則P0為1。

4、寫操作

AT24Cxx支持字節(jié)寫模式頁寫模式。

字節(jié)寫模式是一個地址一個數(shù)據(jù)的寫;頁寫模式是連續(xù)寫數(shù)據(jù),一個地址多個數(shù)據(jù)的寫,但是頁寫模式不能自動跨頁,如果超出一頁長度,超出的數(shù)據(jù)會覆蓋原先寫入的數(shù)據(jù)。

如圖所示,為AT24Cxx字節(jié)寫模式的時序,在MCU發(fā)出開始信號(Start)后,發(fā)出8 Bit的設(shè)備地址信息(圖中讀寫位為低電平,即寫數(shù)據(jù)),待收到AT24Cxx應(yīng)答信號后,再發(fā)出要寫的數(shù)據(jù)地址,再次等待AT24Cxx應(yīng)答,最后發(fā)出8 Bit數(shù)據(jù)寫數(shù)據(jù),待AT24Cxx應(yīng)答后,發(fā)出停止信號(Stop),完成一次單字節(jié)寫數(shù)據(jù)。

AT24C02容量為2K,因此數(shù)據(jù)地址范圍為0x00-0xFF,即0-255,每個數(shù)據(jù)地址每次寫1Byte,即8bit,也就剛好2568=2048Bit。對于1K容量的產(chǎn)品,數(shù)據(jù)地址范圍為0x00-0x7F,最高位不會用到,因此圖中數(shù)據(jù)地址的最高位為*,意思是對于1K容量的產(chǎn)品,該位無需關(guān)心。

上圖為AT24Cxx的頁寫模式時序,與字節(jié)寫模式的差異在于,不是只發(fā)送1Byte數(shù)據(jù),而是任意多個。需要注意,該模式不能跨頁寫,遇到跨頁時,需要重新發(fā)送完整的時序。

值得一提的是,AT24Cxx每次寫完之后,再到下次寫之前,需要間隔5ms時間,以確保上次寫操作在芯片內(nèi)部完成,如圖所示。

5、讀操作

AT24Cxx支持當(dāng)前地址讀模式、隨機地址讀模式順序讀模式。

當(dāng)前地址讀模式就是在上一次讀/寫操作之后的最后位置,繼續(xù)讀出數(shù)據(jù),比如上次讀/寫在地址n,接下來可以直接從n+1處讀出數(shù)據(jù);隨機地址讀模式是指定數(shù)據(jù)地址,然后讀出數(shù)據(jù);順序讀模式是連續(xù)讀出多個數(shù)據(jù)。

在當(dāng)前地址讀模式下,無需發(fā)送數(shù)據(jù)地址,數(shù)據(jù)地址為上一次讀/寫操作之后的位置,時序如圖所示,注意在結(jié)尾,主機接收數(shù)據(jù)后,無需產(chǎn)生應(yīng)答信號。

在隨機地址讀模式下,需要先發(fā)送設(shè)備地址,待讀的數(shù)據(jù)地址,接著再重新發(fā)出開始信號,設(shè)備地址,讀出數(shù)據(jù),時序如圖所示。

在順序讀模式下,需要先從當(dāng)前地址讀模式或隨機地址讀模式啟動,隨后便可連續(xù)讀多個數(shù)據(jù),時序如圖所示。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多