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