本篇文章介紹I2C通訊協(xié)議及其FPGA實(shí)測(cè)波形。
有哪些內(nèi)容
I2C是什么
5種速率
4種信號(hào)
讀寫時(shí)序
7位和10位地址
I2C保留字節(jié)
FPGA實(shí)測(cè)I2C波形
SPI和I2C的對(duì)比
I2C是什么
在消費(fèi)電子,工業(yè)電子等領(lǐng)域,會(huì)使用各種類型的芯片,如微控制器,電源管理,顯示驅(qū)動(dòng),傳感器,存儲(chǔ)器,轉(zhuǎn)換器等,他們有著不同的功能,有時(shí)需要快速的進(jìn)行數(shù)據(jù)的交互,為了使用最簡單的方式使這些芯片互聯(lián)互通,于是I2C誕生了,I2C(Inter-Integrated Circuit)是一種通用的總線協(xié)議。它是由Philips(飛利浦)公司,現(xiàn)NXP(恩智浦)半導(dǎo)體開發(fā)的一種簡單的雙向兩線制總線協(xié)議標(biāo)準(zhǔn)。對(duì)于硬件設(shè)計(jì)人員來說,只需要2個(gè)管腳,極少的連接線和面積,就可以實(shí)現(xiàn)芯片間的通訊,對(duì)于軟件開發(fā)者來說,可以使用同一個(gè)I2C驅(qū)動(dòng)庫,來實(shí)現(xiàn)實(shí)現(xiàn)不同器件的驅(qū)動(dòng),大大減少了軟件的開發(fā)時(shí)間。極低的工作電流,降低了系統(tǒng)的功耗,完善的應(yīng)答機(jī)制大大增強(qiáng)通訊的可靠性。
多主多從
5種速率
I2C協(xié)議可以工作在以下5種速率模式下,不同的器件可能支持不同的速率。
標(biāo)準(zhǔn)模式(Standard):100kbps
快速模式(Fast):400kbps
快速模式+(Fast-Plus):1Mbps
高速模式(High-speed):3.4Mbps
超快模式(Ultra-Fast):5Mbps(單向傳輸)
I2C速率模式【bps:bit/s,即SCL的頻率】其中超快模式是單向數(shù)據(jù)傳輸,通常用于LED、LCD等不需要應(yīng)答的器件,和正常的I2C操作時(shí)序類似,但是只進(jìn)行寫數(shù)據(jù),不需要考慮ACK應(yīng)答信號(hào)。
超快模式在I2C協(xié)議的官方文檔NXP_UM10204_I2C-bus specification and user manual_Rev.6,超快模式和其他模式在3.2和3.1章節(jié)分別進(jìn)行介紹。
4種信號(hào)
I2C協(xié)議最基礎(chǔ)的幾種信號(hào):起始、停止、應(yīng)答和非應(yīng)答信號(hào)。
起始信號(hào)
I2C協(xié)議規(guī)定,SCL處于高電平時(shí),SDA由高到低變化,這種信號(hào)是起始信號(hào)。
停止信號(hào)
I2C協(xié)議規(guī)定,SCL處于高電平,SDA由低到高變化,這種信號(hào)是停止信號(hào)。
起始和停止信號(hào)
數(shù)據(jù)有效性
I2C協(xié)議對(duì)數(shù)據(jù)的采樣發(fā)生在SCL高電平期間,除了起始和停止信號(hào),在數(shù)據(jù)傳輸期間,SCL為高電平時(shí),SDA必須保持穩(wěn)定,不允許改變,在SCL低電平時(shí)才可以進(jìn)行變化。
數(shù)據(jù)有效性
應(yīng)答信號(hào)
I2C最大的一個(gè)特點(diǎn)就是有完善的應(yīng)答機(jī)制,從機(jī)接收到主機(jī)的數(shù)據(jù)時(shí),會(huì)回復(fù)一個(gè)應(yīng)答信號(hào)來通知主機(jī)表示“我收到了”。應(yīng)答信號(hào)出現(xiàn)在1個(gè)字節(jié)傳輸完成之后,即第9個(gè)SCL時(shí)鐘周期內(nèi),此時(shí)主機(jī)需要釋放SDA總線,把總線控制權(quán)交給從機(jī),由于上拉電阻的作用,此時(shí)總線為高電平,如果從機(jī)正確的收到了主機(jī)發(fā)來的數(shù)據(jù),會(huì)把SDA拉低,表示應(yīng)答響應(yīng)。
應(yīng)答信號(hào)使用MCU、FPGA等控制器實(shí)現(xiàn)時(shí),需要在第9個(gè)SCL時(shí)鐘周期把SDA設(shè)置為高阻輸入狀態(tài),如果讀取到SDA為低電平,則表示數(shù)據(jù)被成功接收到,可以進(jìn)行下一步操作。
非應(yīng)答信號(hào)
當(dāng)?shù)?個(gè)SCL時(shí)鐘周期時(shí),SDA保持高電平,表示非應(yīng)答信號(hào)。
非應(yīng)答產(chǎn)生非應(yīng)答信號(hào)可能是主機(jī)產(chǎn)生也可能是從機(jī)產(chǎn)生,產(chǎn)生非應(yīng)答信號(hào)的情況主要有以下幾種:
I2C總線上沒有主機(jī)所指定地址的從機(jī)設(shè)備
從機(jī)正在執(zhí)行一些操作,處于忙狀態(tài),還沒有準(zhǔn)備好與主機(jī)通訊
主機(jī)發(fā)送的一些控制命令,從機(jī)不支持
主機(jī)接收從機(jī)數(shù)據(jù)時(shí),主機(jī)產(chǎn)生非應(yīng)答信號(hào),通知從機(jī)數(shù)據(jù)傳輸結(jié)束,不要再發(fā)數(shù)據(jù)了
讀寫時(shí)序
向指定寄存器地址寫入指定數(shù)據(jù)操作時(shí)序:
寫時(shí)序從指定寄存器地址讀取數(shù)據(jù)操作時(shí)序:
讀時(shí)序注意,讀數(shù)據(jù)時(shí)有兩次起始信號(hào)。
7位和10位地址
大多數(shù)I2C器件支持7位地址模式,有一些器件還支持10位地址,而且兩種類型的器件可以連接在同一個(gè)I2C總線上,目前10位地址的器件還沒有被廣泛使用。主機(jī)發(fā)送,從機(jī)接收。使用10位地址進(jìn)行寫時(shí)序:
10位地址寫主機(jī)接收,從機(jī)發(fā)送。使用10位地址進(jìn)行讀時(shí)序:
10位地址讀
I2C保留字節(jié)
I2C讀寫時(shí)起始位之后的第一個(gè)字節(jié),除了廠商指定的設(shè)備地址外,還有一些保留字節(jié),主要有兩組0000 xxx和1111 xxx,保留字節(jié)的含義:
保留字節(jié)上述的10位地址模式,就是使用到了最后一種保留字節(jié)。第一種廣播模式,可以通過寫入第二個(gè)字節(jié)06h來復(fù)位I2C總線上所有的從機(jī)器件。具體操作時(shí)序可以查看文檔NXP_UM10204_I2C-bus specification and user manual_Rev.6:3.1.12 Reserved addresses章節(jié)有詳細(xì)介紹。其中device ID控制字(1111 1xx1),可以讀取I2C器件內(nèi)部的24位器件ID,通過對(duì)照NXP I2C協(xié)議器件列表可以查詢到器件所屬的廠商和型號(hào)。
24位ID設(shè)備ID與器件廠商對(duì)應(yīng)表
ID與廠商對(duì)照
FPGA實(shí)測(cè)I2C波形
FPGA實(shí)現(xiàn)UART、SPI、I2C等串行時(shí)序,最常用的實(shí)現(xiàn)方式就是狀態(tài)機(jī)大法,將各個(gè)步驟分解為各個(gè)狀態(tài),然后根據(jù)不同的狀態(tài)去控制輸出或讀取輸入,細(xì)節(jié)方面需要考慮數(shù)據(jù)的對(duì)齊、建立和保持時(shí)間、一些異常情況時(shí)狀態(tài)的跳轉(zhuǎn),不能進(jìn)入死循環(huán),或卡死在某一個(gè)狀態(tài)。I2C控制狀態(tài)機(jī)狀態(tài)定義:
//general S0_IDLE = 0, S1_START1 = 1, S2_CTRL_BYTE1 = 2, S3_ACK1 = 3, S4_ADDR = 4, S5_ACK2 = 5, //write: 0-1-2-3-4-5-》6-7-13-14 S6W_DATA = 6, S7W_ACK3 = 7, //read: 0-1-2-3-4-5-》8-9-10-11-12-13-14 S8R_START2 = 8, S9R_CTRL_BYTE2 = 9, S10R_ACK3 = 10, S11R_DATA = 11, S12R_NACK = 12, //general S13_STOP = 13, S14_DONE = 14, S15_ERR = 15;注意SDA雙向端口的方向控制。
output eeprom_scl, inout eeprom_sda, localparam DIR_IN = 1‘b0; localparam DIR_OUT = !DIR_IN; reg dir; reg i2c_sda; reg i2c_scl; assign eeprom_scl = i2c_scl; assign eeprom_sda = (dir == DIR_OUT) ? i2c_sda : 1’bz; wire sda_in = eeprom_sda;SDA應(yīng)該在第9個(gè)SCL時(shí)鐘周期設(shè)置為輸入狀態(tài):
SDA方向控制下圖的波形是使用Xilinx FPGA對(duì)AT24C1024的驅(qū)動(dòng),使用片上邏輯分析儀ChipScope抓取的實(shí)際波形,AT24C1024B存儲(chǔ)空間為1024K Bit = 131072 Byte,存儲(chǔ)單元地址位寬為17位。AT24C1024B寫時(shí)序:
i2c_writeAT24C1024B讀時(shí)序:
i2c_read
SPI和I2C的對(duì)比
I2C是半雙工,SPI是全雙工。
I2C支持多主多從模式,而SPI只能有一個(gè)主機(jī)。
從GPIO占用上來看,I2C占用更少的GPIO,更節(jié)省資源。
I2C有應(yīng)答響應(yīng)機(jī)制,數(shù)據(jù)可靠性更高,SPI沒有應(yīng)答機(jī)制。
I2C速率不會(huì)太高,最高速率3.4Mbps,SPI可以達(dá)到很高的速率。
I2C通過器件地址來選擇從機(jī),從機(jī)數(shù)量的增加不會(huì)導(dǎo)致GPIO的增加,而SPI通過CS選擇從機(jī),每增加一個(gè)從機(jī)就要多占用一個(gè)GPIO。
SPI協(xié)議在SCLK邊沿進(jìn)行數(shù)據(jù)采樣,I2C在SCL高電平期間進(jìn)行數(shù)據(jù)采樣。
兩者大多都應(yīng)用于板內(nèi)器件短距離通訊。
原文標(biāo)題:一文看懂I2C協(xié)議
文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
FPGA
+關(guān)注
關(guān)注
1625文章
21640瀏覽量
601362 -
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1809瀏覽量
64419 -
通訊協(xié)議
+關(guān)注
關(guān)注
10文章
268瀏覽量
20312
原文標(biāo)題:一文看懂I2C協(xié)議
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論