如何設(shè)計(jì)基于I2C總線的處理器的聯(lián)網(wǎng)方案?
隨著微控制器的價(jià)格越來(lái)越低,功能越來(lái)越強(qiáng)大,電氣設(shè)計(jì)人員發(fā)現(xiàn)在單板和多板系統(tǒng)中都使用多個(gè)小型控制器是一種更加經(jīng)濟(jì)高效的方法。這種輔助處理器能夠減輕主處理器在耗時(shí)任務(wù)上面的處理開(kāi)銷,例如掃描鍵盤(pán)、顯示控制器和電機(jī)控制。這些控制器也可以配置為各種各樣的專用外設(shè)。
最近,我接受了一項(xiàng)任務(wù):開(kāi)發(fā)一種能夠方便地適用于多種應(yīng)用的接口(軟/硬件),且要符合嵌入式處理器中常用的行業(yè)標(biāo)準(zhǔn)。在分析了一些典型應(yīng)用之后,我們列出了一些針對(duì)該硬件接口的設(shè)計(jì)需求:常用于32位和8位處理器;能夠得到常用外設(shè)器件的支持;外設(shè)接口代碼量低于0.5kB;引腳數(shù)量少;數(shù)據(jù)帶寬可達(dá)10kBps;RAM用量少;一條總線上支持多種外設(shè);方便使用API;不需要外部接口驅(qū)動(dòng)硬件。
由于要求引腳數(shù)量少,所以必須采用串行接口。目前處理器中常見(jiàn)的串行接口包括SPI、I2C、USB和RS-232。通過(guò)從不同方面權(quán)衡比較這些接口,我最終選擇了I2C,因?yàn)樗涌诤?jiǎn)單,靈活性好,得到了大多數(shù)低成本控制器的支持。在不需要很高傳輸速度的情況下,較少的引腳數(shù)和流量控制功能還使得I2C接口相比SPI接口具有更大的優(yōu)勢(shì)。
I2C的工作原理
I2C是一種雙線雙向接口,包括一個(gè)時(shí)鐘信號(hào)和一個(gè)數(shù)據(jù)信號(hào)(SCL和SDA)。在不增加任何其他信號(hào)的情況下,一條I2C總線就可以支持多達(dá)12個(gè)設(shè)備。I2C接口規(guī)范包括三種工作速度:100kbps、400kbps和3.4Mbps。大多數(shù)常見(jiàn)的控制器只支持100-和400kbps兩種模式。I2C總線支持一個(gè)主設(shè)備多個(gè)從設(shè)備,或者多個(gè)主設(shè)備的配置結(jié)構(gòu)。
I2C一個(gè)非常重要的特性就是它支持流量控制。如果某個(gè)從設(shè)備無(wú)法保持連續(xù)的字節(jié)傳輸,它可以將總線掛起,直到能夠跟上主設(shè)備的傳輸速度。這對(duì)于包含最小規(guī)模的I2C硬件并且必須在固件上支持部分傳輸協(xié)議的從設(shè)備來(lái)說(shuō)是非常有用的。I2C總線規(guī)范支持7b和10b兩種尋址協(xié)議。我發(fā)現(xiàn)7b尋址模式在大部分應(yīng)用中的效率更高。
在開(kāi)始編寫(xiě)代碼之前,我們需要很好地了解I2C總線的工作原理。任何情況下I2C總線至少要包含一個(gè)主設(shè)備,至少要掛有一個(gè)或多個(gè)從設(shè)備。主設(shè)備總是由主到從發(fā)起數(shù)據(jù)傳輸操作。無(wú)論有多少個(gè)外設(shè)掛接在總線上,I2C接口只有兩個(gè)信號(hào)。
兩個(gè)信號(hào)都是集電極開(kāi)路的,通過(guò)大小為2.7k左右的上拉電阻接Vcc電源。SDA信號(hào)是雙向的,可以由主設(shè)備或從設(shè)備驅(qū)動(dòng)。SCL信號(hào)是由主設(shè)備驅(qū)動(dòng)的,但是在一個(gè)數(shù)據(jù)字節(jié)的末尾從設(shè)備必須保持SCL信號(hào)為低,以延遲總線直到從設(shè)備開(kāi)始處理數(shù)據(jù)。主設(shè)備在數(shù)據(jù)字節(jié)的最后一位傳輸完之后釋放SCL信號(hào),然后檢查SCL信號(hào)是否變高。如果SCL沒(méi)有變高,那么主設(shè)備認(rèn)為從設(shè)備正在請(qǐng)求主設(shè)備延遲,直到其開(kāi)始處理數(shù)據(jù)。
當(dāng)通過(guò)I2C總線發(fā)送數(shù)據(jù)時(shí),只有當(dāng)SCL為低電平時(shí)才能進(jìn)行數(shù)據(jù)變換。當(dāng)SCL信號(hào)為高時(shí),任何方向的數(shù)據(jù)都應(yīng)該是穩(wěn)定的.
當(dāng)總線空閑時(shí),主設(shè)備和從設(shè)備都不下拉SDA和SCL信號(hào)。在發(fā)起一次數(shù)據(jù)傳輸時(shí),主設(shè)備驅(qū)動(dòng)SDA信號(hào)從高電平變成低電平,同時(shí)SCL信號(hào)為高。一般地,當(dāng)SCL信號(hào)為高電平時(shí),SDA信號(hào)的狀態(tài)保持不變,但啟動(dòng)或停止條件下除外。當(dāng)SCL信號(hào)為高并且SDA信號(hào)從低變高時(shí),是傳輸停止的情況(如圖2所示)。
I2C總線以8b為單位傳輸數(shù)據(jù)。每傳輸一個(gè)字節(jié)時(shí),必須得到數(shù)據(jù)接收方的確認(rèn)。所有的數(shù)據(jù)都是從MSB(最高有效位)開(kāi)始傳輸?shù)摹?/p>