I2C總線(xiàn)驅(qū)動(dòng)在嵌入式系統(tǒng)中的兩種實(shí)現(xiàn)
3.2 以GPIO端口模擬I2C實(shí)現(xiàn)
此方法是直接用ARM S3C4510的GPIO(GeneralPurpose Input/Output)引腳模擬I2C總線(xiàn)的時(shí)序來(lái)實(shí)現(xiàn)數(shù)據(jù)傳輸。S3C4510B提供了18個(gè)可編程的通用I/O端口,用戶(hù)可將每個(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í),寫(xiě)每一位對(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。首先給出一些便于操作的宏定義:
3.3 應(yīng)用實(shí)例
為ARM外掛PCF8563實(shí)現(xiàn)實(shí)時(shí)時(shí)鐘控制。PCF8563是PHILIPS公司生產(chǎn)的具有I2C接口的低功耗CM()S實(shí)時(shí)時(shí)鐘/日歷芯片。其最大總線(xiàn)速度為400kb/s,每次讀寫(xiě)數(shù)據(jù)后,其內(nèi)嵌的字地址寄存器器會(huì)自動(dòng)產(chǎn)生增量。下面用模擬實(shí)現(xiàn)PCF8563的I2C實(shí)時(shí)時(shí)鐘芯片的操作,有字節(jié)寫(xiě)/讀兩種狀態(tài),程序中從地址的讀地址為0A3H,寫(xiě)地址為0A2H。
首先使能I2C總線(xiàn),然后對(duì)I2C總線(xiàn)進(jìn)行開(kāi)始操作,就緒之后,依次寫(xiě)人器件地址(即0xA2),寫(xiě)入寄存器地址,再寫(xiě)人所設(shè)寄存器值??刂疲癄顟B(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總線(xiàn)控制器,通過(guò)配置一系列特殊寄存器實(shí)現(xiàn)I2C總線(xiàn)傳輸。這種方式適用于一些本身包含I2C總線(xiàn)控制器的芯片,實(shí)現(xiàn)起來(lái)簡(jiǎn)單方便。后者則適用于主機(jī)端沒(méi)有I2C控制器的情況。此時(shí)主機(jī)端只要有GPIO端口,就可利用其實(shí)現(xiàn)同樣的功能。在基于ARM加μClinux的嵌入式視頻監(jiān)控產(chǎn)品中,同時(shí)將這兩種方法做了具體的運(yùn)用。其一的示例就是通過(guò)模擬的I2C總線(xiàn),掛接PCF8563實(shí)時(shí)時(shí)鐘芯片,并取得很好的實(shí)時(shí)效果。
評(píng)論