1 引 言
一個(gè)或多個(gè)微控制器以及外圍器件可以通過I2C總線接口非常方便的連接在一起構(gòu)成系統(tǒng)。這種總線結(jié)構(gòu)的連線和連接引腳少,器件間總線簡(jiǎn)單。結(jié)構(gòu)緊湊,因此其構(gòu)成系統(tǒng)的成本較低;并且在總線上增加器件不會(huì)影響系統(tǒng)的正常工作,所有的I。C器件共用一套總線,因此其系統(tǒng)修改和可擴(kuò)展性好。即使有不同時(shí)鐘速度的器件連接到總線上,時(shí)間同步機(jī)制也能夠很方便地確定總線時(shí)鐘,因此在嵌入式系統(tǒng)中得到了廣泛的應(yīng)用。
2 I2C總線原理
2.1 I2C工作原理
I2C總線是由數(shù)據(jù)線SDA和時(shí)鐘線SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。每個(gè)連接到總線的器件都可以通過惟一的地址與主機(jī)通訊,主機(jī)可以作為主機(jī)發(fā)送器或主機(jī)接收器。他是一個(gè)真正的多主機(jī)總線,如果兩個(gè)或更多主機(jī)同時(shí)初始化,數(shù)據(jù)傳輸可以通過沖突檢測(cè)和仲裁防止數(shù)據(jù)被破壞。串行的8位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100 kb/s,快速模式下可達(dá)400 kb/s,高速模式下可達(dá)3.4 Mb/s。連接到相同總線的IC數(shù)量只受到總線的電容400 pF限制。
I2C總線在傳送數(shù)據(jù)過程中共有3種特殊的電平變換情況,他們分別是:起始(start)、停止(stop)和響應(yīng)(aek)。
當(dāng)SCL為高電平時(shí),SDA由高電平向低電平跳變,這個(gè)表示起始條件;當(dāng)SCL是高電平時(shí),SDA線由低電平向高電平跳變表示停止條件。起始和停止條件一般由主機(jī)產(chǎn)生,總線在起始條件后被認(rèn)為處于忙的狀態(tài),在停止條件的某段時(shí)間后總線被認(rèn)為再次處于空閑狀態(tài)。
響應(yīng)信號(hào)是指從機(jī)在接收到8b數(shù)據(jù)后,向主機(jī)發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。在響應(yīng)的時(shí)鐘脈沖期間,從機(jī)必須將SDA線拉低使他在這個(gè)時(shí)鐘脈沖的高電平期間保持穩(wěn)定的低電平,主機(jī)收到應(yīng)答信號(hào)后,根據(jù)實(shí)際情況做出是否繼續(xù)傳遞信號(hào)的判斷。若未收到應(yīng)答信號(hào),則判斷為從機(jī)出現(xiàn)故障。
2.2操作時(shí)序
I2C總線運(yùn)用主/從雙向通訊。主機(jī)和從機(jī)都可以工作于接收和發(fā)送狀態(tài)。總線必須由主機(jī)(通常為微控制器)控制,主機(jī)產(chǎn)生串行時(shí)鐘(SCL)控制總線的傳輸方向,并產(chǎn)生起始和停止條件。SDA線上的數(shù)據(jù)狀態(tài)僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態(tài)的改變被用來表示起始和停止條件。具體時(shí)序見圖1。
3.1 系統(tǒng)自帶I2C寄存器的實(shí)現(xiàn)
下面以ARM S3C4510B為例,給出基于寄存器方式的I2C驅(qū)動(dòng)實(shí)現(xiàn)。S3C4510B內(nèi)含一個(gè)I2C總線主控器,可方便地與各種帶有I2C接口的器件相連。I2C總線控制器有3個(gè)特殊功能寄存器:一個(gè)控制狀態(tài)寄存器(I2CON),一個(gè)預(yù)分頻寄存器(I2CPS)和一個(gè)移位緩沖寄存器(I2CBUF)。通過配置這些寄存器,可實(shí)現(xiàn)正確的I2C數(shù)據(jù)傳輸時(shí)序。下面分別給出讀、寫實(shí)現(xiàn)的實(shí)例。讀操作:
寫數(shù)據(jù)的操作 先設(shè)置控制狀態(tài)寄存器的BF位(0x01),然后寫入數(shù)據(jù)到移位緩沖寄存器。移位緩沖寄存器無論是被讀還是寫,BF位均會(huì)自動(dòng)清零。若要進(jìn)行連續(xù)的讀/寫操作,必須設(shè)置控制狀態(tài)寄存器的ACK位(0x08)。
讀數(shù)據(jù)的操作 在設(shè)置控制狀態(tài)寄存器的BF位以后,可以進(jìn)行讀數(shù)據(jù)的操作,當(dāng)讀/寫完一個(gè)字節(jié)時(shí),可對(duì)ACK位進(jìn)行復(fù)位通知發(fā)送器/接收器讀數(shù)據(jù)操作結(jié)束。
在讀/寫操作完成以后,可通過對(duì)I2CCON寫入0x20生成結(jié)束碼。
3.2 以GPIO端口模擬I2C實(shí)現(xiàn)
此方法是直接用ARM S3C4510的GPIO(GeneralPurpose Input/Output)引腳模擬I2C總線的時(shí)序來實(shí)現(xiàn)數(shù)據(jù)傳輸。S3C4510B提供了18個(gè)可編程的通用I/O端口,用戶可將每個(gè)端口配置為輸入模式、輸出模式或特殊功能模式,由片內(nèi)的特殊功能寄存器IOPMOD和IOPCON控制。
控制I/O口的特殊功能寄存器一共有3個(gè):IOP-MOD,I0PCON和IOPDATA。I/O口模式寄存器(IOP-MOD)用于配置P17~P0的輸入輸出狀態(tài);I/O口控制寄存器IOPCON用于配置端口P8~P17的特殊功能,當(dāng)這些端口用作特殊功能(如外部中斷請(qǐng)求、外部中斷請(qǐng)求應(yīng)答、外部DMA請(qǐng)求或應(yīng)答、定時(shí)器溢出)時(shí),其工作模式由10PCON寄存器控制,而不再由IOPMOD寄存器;I/O口數(shù)據(jù)寄存器(IOPDATA)當(dāng)配置為輸入模式時(shí),讀取I/O口數(shù)據(jù)寄存器IOPDATA的每一位對(duì)應(yīng)輸入狀態(tài),當(dāng)配置為輸出模式時(shí),寫每一位對(duì)應(yīng)輸出狀態(tài)。位[17:O]對(duì)應(yīng)于18個(gè)I/0引腳P17~P0。
下面用GPIO的pin[O][1]腳進(jìn)行I2C模擬,其中低位為SDA,高位為SCL。首先給出一些便于操作的宏定義:
為ARM外掛PCF8563實(shí)現(xiàn)實(shí)時(shí)時(shí)鐘控制。PCF8563是PHILIPS公司生產(chǎn)的具有I2C接口的低功耗CM()S實(shí)時(shí)時(shí)鐘/日歷芯片。其總線速度為400kb/s,每次讀寫數(shù)據(jù)后,其內(nèi)嵌的字地址寄存器器會(huì)自動(dòng)產(chǎn)生增量。下面用模擬實(shí)現(xiàn)PCF8563的I2C實(shí)時(shí)時(shí)鐘芯片的操作,有字節(jié)寫/讀兩種狀態(tài),程序中從地址的讀地址為0A3H,寫地址為0A2H。
首先使能I2C總線,然后對(duì)I2C總線進(jìn)行開始操作,就緒之后,依次寫人器件地址(即0xA2),寫入寄存器地址,再寫人所設(shè)寄存器值。控制/狀態(tài)寄存器1為0,控制/狀態(tài)寄存器2為0,秒寄存器為30,分鐘寄存器45,小時(shí)寄存器為17,日寄存器為20,星期寄存器為0,月/世紀(jì)寄存器為88,年寄存器為6(即2006年8月20日17點(diǎn)45分30秒)。當(dāng)程序運(yùn)行一段時(shí)間(15分鐘)后,依次讀取寄存器,得到時(shí)間為2006年8月20日18點(diǎn)OO分30秒。
4 總 結(jié)
本文給出了兩種I2C驅(qū)動(dòng)的實(shí)現(xiàn)方法。前者直接利用主機(jī)端自帶的I2C總線控制器,通過配置一系列特殊寄存器實(shí)現(xiàn)I2C總線傳輸。這種方式適用于一些本身包含I2C總線控制器的芯片,實(shí)現(xiàn)起來簡(jiǎn)單方便。后者則適用于主機(jī)端沒有I2C控制器的情況。此時(shí)主機(jī)端只要有GPIO端口,就可利用其實(shí)現(xiàn)同樣的功能。在基于ARM加μClinux的嵌入式視頻監(jiān)控產(chǎn)品中,同時(shí)將這兩種方法做了具體的運(yùn)用。其一的示例就是通過模擬的I2C總線,掛接PCF8563實(shí)時(shí)時(shí)鐘芯片,并取得很好的實(shí)時(shí)效果。