作者:Wang Chao 出處 I2C是什么在消費(fèi)電子,,工業(yè)電子等領(lǐng)域,會使用各種類型的芯片,,如微控制器,電源管理,,顯示驅(qū)動,,傳感器,存儲器,,轉(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)。 對于硬件設(shè)計(jì)人員來說,,只需要2個(gè)管腳,,極少的連接線和面積,就可以實(shí)現(xiàn)芯片間的通訊,,對于軟件開發(fā)者來說,,可以使用同一個(gè)I2C驅(qū)動庫,,來實(shí)現(xiàn)實(shí)現(xiàn)不同器件的驅(qū)動,,大大減少了軟件的開發(fā)時(shí)間。極低的工作電流,,降低了系統(tǒng)的功耗,,完善的 應(yīng)答機(jī)制 大大增強(qiáng)通訊的可靠性。 5種速率I2C協(xié)議可以工作在以下5種速率模式下,,不同的器件可能支持不同的速率,。
【bps:bit/s,即SCL的頻率】 其中超快模式是單向數(shù)據(jù)傳輸,,通常用于LED,、LCD等不需要應(yīng)答的器件,和正常的I2C操作時(shí)序類似,,但是只進(jìn)行寫數(shù)據(jù),,不需要考慮ACK應(yīng)答信號。 在I2C協(xié)議的官方文檔 NXP_UM10204_I2C-bus specification and user manual_Rev.6 ,,超快模式和其他模式在3.2和3.1章節(jié)分別進(jìn)行介紹。 4種信號I2C協(xié)議最基礎(chǔ)的幾種信號: 起始,、停止,、應(yīng)答和非應(yīng)答信號 。 起始信號I2C協(xié)議規(guī)定,,SCL處于高電平時(shí),,SDA由高到低變化,這種信號是起始信號。 停止信號I2C協(xié)議規(guī)定,,SCL處于高電平,,SDA由低到高變化,這種信號是停止信號,。 數(shù)據(jù)有效性I2C協(xié)議對數(shù)據(jù)的采樣發(fā)生在SCL高電平期間,,除了起始和停止信號,在數(shù)據(jù)傳輸期間,,SCL為高電平時(shí),,SDA必須 保持穩(wěn)定 ,不允許改變,,在SCL低電平時(shí)才可以進(jìn)行變化,。 應(yīng)答信號I2C最大的一個(gè)特點(diǎn)就是有完善的應(yīng)答機(jī)制,從機(jī)接收到主機(jī)的數(shù)據(jù)時(shí),,會回復(fù)一個(gè)應(yīng)答信號來通知主機(jī)表示“ 我收到了 ”,。 應(yīng)答信號出現(xiàn)在1個(gè)字節(jié)傳輸完成之后,即第9個(gè)SCL時(shí)鐘周期內(nèi),,此時(shí)主機(jī)需要釋放SDA總線,,把總線控制權(quán)交給從機(jī),由于上拉電阻的作用,,此時(shí)總線為高電平,,如果從機(jī)正確的收到了主機(jī)發(fā)來的數(shù)據(jù),會把SDA拉低,,表示應(yīng)答響應(yīng),。 使用MCU、FPGA等控制器實(shí)現(xiàn)時(shí),,需要在第9個(gè)SCL時(shí)鐘周期把SDA設(shè)置為高阻輸入狀態(tài),,如果讀取到SDA為低電平,則表示數(shù)據(jù)被成功接收到,,可以進(jìn)行下一步操作,。 非應(yīng)答信號當(dāng)?shù)?個(gè)SCL時(shí)鐘周期時(shí),SDA保持高電平,,表示非應(yīng)答信號,。 非應(yīng)答信號可能是主機(jī)產(chǎn)生也可能是從機(jī)產(chǎn)生,產(chǎn)生非應(yīng)答信號的情況主要有以下幾種:
讀寫時(shí)序向指定寄存器地址寫入指定數(shù)據(jù)操作時(shí)序: 從指定寄存器地址讀取數(shù)據(jù)操作時(shí)序: 注意,讀數(shù)據(jù)時(shí)有兩次起始信號,。 7位和10位地址大多數(shù)I2C器件支持 7位地址 模式,,有一些器件還支持 10位地址 ,而且兩種類型的器件可以連接在同一個(gè)I2C總線上,,目前10位地址的器件 還沒有被廣泛使用 ,。 主機(jī)發(fā)送,從機(jī)接收,。使用10位地址進(jìn)行寫時(shí)序: 主機(jī)接收,,從機(jī)發(fā)送。使用10位地址進(jìn)行讀時(shí)序: I2C保留字節(jié)I2C讀寫時(shí)起始位之后的第一個(gè)字節(jié),,除了廠商指定的設(shè)備地址外,,還有一些保留字節(jié),主要有兩組0000 xxx和1111 xxx,,保留字節(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 ,,通過對照NXP I2C協(xié)議器件列表可以查詢到器件所屬的 廠商和型號 。 設(shè)備ID與器件廠商對應(yīng)表 FPGA實(shí)測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ù)的對齊,、建立和保持時(shí)間,、一些異常情況時(shí)狀態(tài)的跳轉(zhuǎn),不能進(jìn)入死循環(huán),,或卡死在某一個(gè)狀態(tài),。 I2C控制狀態(tài)機(jī)狀態(tài)定義: //generalS0_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-14S6W_DATA = 6,S7W_ACK3 = 7,//read: 0-1-2-3-4-5->8-9-10-11-12-13-14S8R_START2 = 8,S9R_CTRL_BYTE2 = 9,S10R_ACK3 = 10,S11R_DATA = 11,S12R_NACK = 12,//generalS13_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): 下圖的波形是使用Xilinx FPGA對AT24C1024的驅(qū)動,,使用片上邏輯分析儀ChipScope抓取的實(shí)際波形,,AT24C1024B存儲空間為1024K Bit = 131072 Byte,存儲單元地址位寬為17位,。 AT24C1024B寫時(shí)序: AT24C1024B讀時(shí)序: SPI和I2C的對比
|
|