大家好,,這里是程序員杰克。一名平平無(wú)奇的嵌入式軟件工程師,。 作為嵌入式開(kāi)發(fā)人員,,無(wú)論是硬件還是軟件工程師,或多或少都會(huì)接觸過(guò)I2C接口的外設(shè),。諸如常用的存儲(chǔ)器EEPROM等皆是I2C接口進(jìn)行通信,。本系列推文主要是對(duì)I2C總線(xiàn)進(jìn)行總結(jié)和分享,本篇推文主要是對(duì)I2C總線(xiàn)及其通訊時(shí)序進(jìn)行介紹和分享,。后續(xù)會(huì)分別出推文分享MCU實(shí)現(xiàn)I2C接口以及在FPGA實(shí)現(xiàn)I2C邏輯時(shí)序,。
01 I2C總線(xiàn)介紹 I2C總線(xiàn)是由Philips公司開(kāi)發(fā)的一種簡(jiǎn)單,、雙向二線(xiàn)制同步串行總線(xiàn),。它只需要兩根線(xiàn)即可在連接于總線(xiàn)上的集成IC器件之間雙向通信。其特點(diǎn)如下:I2C作為總線(xiàn),,其總線(xiàn)上會(huì)掛載很多的設(shè)備,,下圖為一個(gè)典型的總線(xiàn)拓?fù)洌?/span> I2C總線(xiàn)的物理連接上比較簡(jiǎn)單,由SDA(串行數(shù)據(jù)線(xiàn)),、SCL(串行時(shí)鐘線(xiàn)),、上拉電阻組成。單一設(shè)備硬件電路如下圖所示(EEPROM-24C02為例):
特別說(shuō)明: 多個(gè)器件連接在一條總線(xiàn)上時(shí),,SDA,、SCL上各有一個(gè)上拉電阻便可. I2C總線(xiàn)支持三種模式:標(biāo)準(zhǔn)模式、快速模式,、高速模式,,其對(duì)應(yīng)的速率如下表所示:
模式
| 速率(bit/s) | 標(biāo)準(zhǔn)模式
| 100k
| 快速模式 | 400k | 高速模式 | 3.4M
| 對(duì)于一個(gè)完整的I2C協(xié)議而言,其包括起始位,、主從數(shù)據(jù)交互以及停止位,。整體時(shí)序,、組成如下所示:組成 | 描述
| 空閑狀態(tài)
| 總線(xiàn)空閑時(shí),SDA,、SCL皆為高電平
| 起始位
| SCL為高電平時(shí),,SDA出現(xiàn)下降沿
| 主從數(shù)據(jù)交互 (數(shù)據(jù)+應(yīng)答)
| 數(shù)據(jù):1字節(jié)的控制幀/數(shù)據(jù)幀 | 應(yīng)答:數(shù)據(jù)傳輸完成后的下一個(gè)時(shí)鐘沿,SDA-0表示應(yīng)答,,SDA=1表示非應(yīng)答.
| 停止位 | SCL為高電平時(shí),SDA出現(xiàn)上升沿 |
02 I2C讀寫(xiě)時(shí)序介紹 I2C總線(xiàn)上的設(shè)備主動(dòng)發(fā)起通信時(shí)作為主機(jī),,被動(dòng)接收時(shí)作為從機(jī),。因此對(duì)于I2C讀寫(xiě)時(shí)序而言,分為主機(jī),、從機(jī)讀寫(xiě)時(shí)序,。本篇主要是描述主機(jī)的讀寫(xiě)時(shí)序操作,從機(jī)的時(shí)序不在此系列推文分享,。 對(duì)于I2C主機(jī)在SCL時(shí)鐘驅(qū)動(dòng)下的基本寫(xiě)時(shí)序組成如下所示:
寫(xiě)時(shí)序組成 | 描述
| 起始位
| SCL為高電平時(shí),,SDA出現(xiàn)下降沿. 表示一次總線(xiàn)通信的開(kāi)始. 由主機(jī)發(fā)起. | 控制幀(8bit) (主機(jī)->從機(jī))
| 由從機(jī)地址(SLAVE_ADDRESS)和操作位(R/W)組成. R/W:控制幀[0]為操作位,0-表示寫(xiě),,1-表示讀,; 控制幀[7:1]為從機(jī)地址,具體使用的位數(shù)由器件決定,; | 應(yīng)答位 (從機(jī)->主機(jī)) | 從機(jī)接收到對(duì)應(yīng)的控制幀后,,匹配到器件地址后,會(huì)返回一個(gè)應(yīng)答ACK信號(hào),;主機(jī)只有接收到應(yīng)答后,,才會(huì)發(fā)送數(shù)據(jù);
| 數(shù)據(jù)幀(8bit) (主機(jī)->從機(jī)) | 主機(jī)寫(xiě)到從機(jī)的1字節(jié)數(shù)據(jù)(8bit).
| 應(yīng)答/非應(yīng)答 (從機(jī)->主機(jī)) | 從機(jī)接收到對(duì)應(yīng)的數(shù)據(jù)幀后,,會(huì)根據(jù)具體器件,,選擇返回一個(gè)應(yīng)答ACK/非應(yīng)答NACK信號(hào). | 停止位
| SCL為高電平時(shí),SDA出現(xiàn)上升沿. 表示一次總線(xiàn)通信的結(jié)束. 由主機(jī)發(fā)起. |
對(duì)于I2C主機(jī)在SCL時(shí)鐘驅(qū)動(dòng)下的基本讀時(shí)序組成如下所示: 讀時(shí)序組成 | 描述
| 起始位
| SCL為高電平時(shí),,SDA出現(xiàn)下降沿. 表示一次總線(xiàn)通信的開(kāi)始. 由主機(jī)發(fā)起. | 控制幀(8bit) (主機(jī)->從機(jī))
| 由從機(jī)地址(SLAVE_ADDRESS)和操作位(R/W)組成. R/W:控制幀[0]為操作位,,0-表示寫(xiě),1-表示讀,; 控制幀[7:1]為從機(jī)地址,,具體使用的位數(shù)由器件決定; | 應(yīng)答位 (從機(jī)->主機(jī)) | 從機(jī)接收到對(duì)應(yīng)的控制幀后,,匹配到器件地址后,,會(huì)返回一個(gè)應(yīng)答ACK信號(hào);主機(jī)只有接收到應(yīng)答后,,才會(huì)發(fā)送數(shù)據(jù),;
| 數(shù)據(jù)幀(8bit) (從機(jī)->主機(jī)) | 從機(jī)返回給主機(jī)的1字節(jié)數(shù)據(jù)(8bit). | 應(yīng)答/非應(yīng)答 (主機(jī)->從機(jī)) | 主機(jī)接收到從機(jī)返回的數(shù)據(jù)幀后,,會(huì)根據(jù)具體器件,選擇返回一個(gè)應(yīng)答ACK/非應(yīng)答NACK信號(hào)給從機(jī). | 停止位
| SCL為高電平時(shí),,SDA出現(xiàn)上升沿. 表示一次總線(xiàn)通信的結(jié)束. 由主機(jī)發(fā)起. | I2C主機(jī)的讀寫(xiě)時(shí)序的起始位,、控制幀、控制幀應(yīng)答以及停止位是一致的,,差異主要體現(xiàn)在是數(shù)據(jù)幀,、數(shù)據(jù)幀的應(yīng)答的主從方向上。差異點(diǎn)
| 寫(xiě)時(shí)序
| 讀時(shí)序 | 數(shù)據(jù)幀(8bit) | 主機(jī)寫(xiě)入到從機(jī)(主->從)
| 從機(jī)返回給主機(jī)(從->主) | 應(yīng)答/非應(yīng)答 | 從機(jī)做出應(yīng)答/非應(yīng)答(從->主) | 主機(jī)做出應(yīng)答/非應(yīng)答(主->從)
|
03 文章總結(jié)
I2C總線(xiàn)以其外圍電路簡(jiǎn)單,、占用PCB面積小,、總線(xiàn)可掛載多節(jié)點(diǎn)設(shè)備等特點(diǎn)而被廣泛應(yīng)用,因此,,對(duì)于學(xué)習(xí)I2C總線(xiàn)的電路結(jié)構(gòu),、時(shí)序還是很有必要的。
|