I2C是什么?
在消費(fèi)電子和工業(yè)電子等領(lǐng)域中,會使用各種類型的芯片,有時需要快速地進(jìn)行數(shù)據(jù)交互,為了使用最簡單的方式使這些芯片互聯(lián)互通,于是I2C誕生了。I2C(Inter-Integrated Circuit)是一種通用的總線協(xié)議。它是Philips公司半導(dǎo)體事業(yè)部(現(xiàn)在的NXP)在80年代初為方便主板、嵌入式系統(tǒng)設(shè)計(jì)的一種簡單、雙向二線制同步串行總線。由于其簡單性,它被廣泛用于微控制器與傳感器陣列、顯示器、IoT設(shè)備、EEPROM等之間的通信。I2C的專利在2006年11月1日已到期,大家可以免費(fèi)使用。
對于硬件工程師來說,只需要2個管腳,極少的連接線和面積,就可以實(shí)現(xiàn)芯片間的通信,對于軟件設(shè)計(jì)人員來說,可以使用同一個I2C驅(qū)動庫,來實(shí)現(xiàn)不同器件的驅(qū)動,大大減少了軟件的開發(fā)時間。極低的工作電流,降低了系統(tǒng)的功耗,完善的應(yīng)答機(jī)制大大增強(qiáng)了通信的可靠性。
I2C總線的介紹
I2C總線概述
I2C總線采用兩條線路——串行數(shù)據(jù)(SDA)和串行時鐘(SCL)線在連接到總線的器件間傳遞信息。每個器件都有一個唯一的地址識別,而且都可以作為一個發(fā)送器或接收器(由器件的功能決定)。比如,在系統(tǒng)中LCD驅(qū)動器只是一個接收器,而存儲器則既可以接收又可以發(fā)送數(shù)據(jù)。除了發(fā)送器和接收器外,器件在執(zhí)行數(shù)據(jù)傳輸時也可以被看作是主機(jī)或從機(jī)。主機(jī)是初始化總線的數(shù)據(jù)傳輸并產(chǎn)生允許傳輸?shù)臅r鐘信號的器件。此時,任何被尋址的器件都被認(rèn)為是從機(jī)。
I2C總線特點(diǎn)
●它是一個支持多器件的總線。在一個I2C通信總線中,可連接多個I2C通信器件,支持多個通信主機(jī)及多個通信從機(jī)。
●SDA和SCL都是雙向線路,都通過一個電流源或上拉電阻連接到正的電源電壓(見下圖),當(dāng)總線空閑時,兩條線路上都是高電平。連接到總線的器件輸出級必須是漏極開路或集電極開路才能執(zhí)行線與的功能。
●多個主機(jī)同時使用總線時,為了防止數(shù)據(jù)沖突,會利用仲裁方式?jīng)Q定由哪個器件占用總線。在I2C總線上產(chǎn)生時鐘信號通常是主機(jī)器件的責(zé)任。當(dāng)在總線上傳輸數(shù)據(jù)時,每個主機(jī)產(chǎn)生自己的時鐘信號。主機(jī)發(fā)出的總線時鐘信號只有在以下的情況才能被改變:慢速地從機(jī)器件控制時鐘線并延長時鐘信號,或者在發(fā)生仲裁時被另一個主機(jī)改變。
I2C總線基礎(chǔ)知識
I2C總線通信的常識與術(shù)語
常識
●多主機(jī)總線,如果兩個或更多主機(jī)同時初始化,數(shù)據(jù)傳輸可以通過重提檢測和仲裁防止數(shù)據(jù)被破壞。
●串行的8bit雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100kbit/s,快速模式下可達(dá)400kbit/s,高速模式下可達(dá)3.4Mbit/s。
●連接到相同I2C總線的器件數(shù)量只受到總線的最大電容400pF的限制。
●I2C通信的數(shù)據(jù)以8bit為單位,每次發(fā)送完一個數(shù)據(jù)都要等待接收方的ACK信號。
術(shù)語
發(fā)送器:發(fā)送數(shù)據(jù)到總線的器件。
接收器:從總線接收數(shù)據(jù)的器件。
主機(jī):發(fā)送起始/終止信號和時鐘信號的器件。
從機(jī):被主機(jī)尋址的器件。
仲裁:是一個在有多個主機(jī)同時嘗試控制總線但只允許其中一個控制總線并使傳輸不被破壞的過程。
同步:兩個或多個器件同步時鐘信號的過程。
SDA:數(shù)據(jù)線通信期間,SDA的電平改變只能發(fā)生在SCL在低電平期間。
SCL:時鐘線。
I2C總線通信中共有以下幾種狀態(tài)
●空閑狀態(tài):SDA和SCL兩條信號線同時處于高電平。
●起始狀態(tài):SCL為高電平,SDA由高電平到低電平。起始信號由主控器發(fā)起,發(fā)起前處于空閑狀態(tài)。
●結(jié)束狀態(tài):SCL為高電平,SDA由低電平到高電平。結(jié)束信號由主控器發(fā)起,發(fā)起后處于空閑狀態(tài)。
有效的數(shù)據(jù)位傳輸:
在I2C總線上傳送的每一位數(shù)據(jù)都有一個時鐘脈沖相對應(yīng)(或同步控制),即在SCL串行時鐘的配合下,數(shù)據(jù)在SDA上從高位向低位依次串行傳送每一位的數(shù)據(jù)。
進(jìn)行數(shù)據(jù)傳送時,在SCL呈現(xiàn)高電平期間,SDA上的電平必須保持穩(wěn)定,低電平為數(shù)據(jù)0,高電平為數(shù)據(jù)1。只有在SCL為低電平期間,才允許SDA上的電平改變狀態(tài)。
應(yīng)答信號與非應(yīng)答信號:
I2C總線上的所有數(shù)據(jù)都是以8位字節(jié)傳送的,發(fā)送器每發(fā)送一個字節(jié),就在第9個時鐘脈沖期間釋放數(shù)據(jù)線,由接收器反饋一個應(yīng)答信號。應(yīng)答信號為低電平時,規(guī)定為有效應(yīng)答位(ACK簡稱應(yīng)答位),表示接收器已經(jīng)成功地接收了該字節(jié);應(yīng)答信號為高電平時,規(guī)定為非應(yīng)答位(NACK),一般表示接收器接收該字節(jié)沒有成功。對于反饋有效應(yīng)答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩(wěn)定的低電平。
關(guān)于I2C總線的基礎(chǔ)知識大概介紹到這里,I2C總線經(jīng)過這么多年行業(yè)應(yīng)用已非常廣泛,下面我們就來聊下大家所關(guān)心的I2C總線的應(yīng)用。
I2C總線的應(yīng)用
I2C總線的主要用途
用于與顯示器件的對接:通過I2C總線,可以使處理器和顯示器件之間的交互更加方便與快捷,實(shí)現(xiàn)更加智能化的人機(jī)交互控制。
用于外圍芯片的接口:I2C總線可以和可編程的外圍芯片進(jìn)行對接,如定時器,繼電器和存儲器等,可以大大減少數(shù)據(jù)通信和控制電路的連接線數(shù)量,降低系統(tǒng)復(fù)雜度,節(jié)省成本。
用于傳感器的接口:I2C總線可以實(shí)現(xiàn)各種類型的傳感器和微處理器或微控制器之間的高速通信,從而可以實(shí)現(xiàn)復(fù)雜的控制系統(tǒng),以及實(shí)時監(jiān)測系統(tǒng)狀態(tài)。
用于模擬和數(shù)字芯片的接口:I2C總線用于主機(jī)與模擬和數(shù)字芯片之間的數(shù)據(jù)傳輸,同時也可以實(shí)現(xiàn)外設(shè)和外設(shè)之間的快速傳輸,這種鏈路通信方式有助于滿足系統(tǒng)各部分通信協(xié)作和控制需求。
用于系統(tǒng)間的擴(kuò)展:I2C總線可以連接兩個或者更多的系統(tǒng),實(shí)現(xiàn)系統(tǒng)間的快速擴(kuò)展,避免系統(tǒng)因拓?fù)浣Y(jié)構(gòu)問題而出現(xiàn)混亂情況。比如:GPIO擴(kuò)展、電平轉(zhuǎn)換、系統(tǒng)熱插拔緩沖等等。
I2C總線的使用注意事項(xiàng)
I2C總線不支持多級主機(jī),只支持單級,只有一個主機(jī)可以激活總線,這個主機(jī)負(fù)責(zé)控制和管理,總線的數(shù)據(jù)傳輸,多個主機(jī)存在時,只能有一個處于激活狀態(tài),其他主機(jī)要進(jìn)行數(shù)據(jù)通信時,必須先通知當(dāng)前主機(jī)放權(quán),再等待放權(quán)成功后才能激活。
I2C總線只支持先進(jìn)先出等單向數(shù)據(jù)傳輸,不支持雙向數(shù)據(jù)傳輸和多級傳輸。
主機(jī)要保證在總線上傳輸?shù)臄?shù)據(jù)字節(jié)不能超過1024字節(jié)。
在I2C總線中,主機(jī)只能改變數(shù)據(jù)傳輸?shù)乃俣?,從機(jī)只能接受主機(jī)傳輸?shù)臄?shù)據(jù)速度。
如果使用多根I2C總線時,可以設(shè)置不同的總線地址來辨別不同的從機(jī)和主機(jī),不同總線之間應(yīng)盡量避免長度和信號強(qiáng)度兩者可能存在差異。如果需要連接多根I2C總線,就需要使用I2C總線糾錯技術(shù),確保數(shù)據(jù)傳輸?shù)恼_性。