引 言
IC總線(InterIC Bus)是一種通用的串行總線是用於IC器件之間連接的二線制總線他通過串行數據線(Serial Data LinesSDL)及串行時鐘線(Serial ClockLineSCL)兩線在連接到總線上的器件之間傳送信息並根據地址識別每個器件一個或多個微控制器以及外圍器件可以通過IC總線接口非常方便的連接在一起構成系統這種總線結構的連線和連接引腳少器件間總線簡單結構緊湊因此其構成系統的成本較低並且在總線上增加器件不會影響系統的正常工作所有的IC器件共用一套總線因此其系統修改和可擴展性好即使有不同時鐘速度的器件連接到總線上時間同步機制也能夠很方便地確定總線時鐘因此在嵌入式系統中得到了廣泛的應用 IC總線原理
. IC工作原理
IC總線是由數據線SDA和時鐘線SCL構成的串行總線可發送和接收數據每個連接到總線的器件都可以通過惟一的地址與主機通訊主機可以作為主機發送器或主機接收器他是一個真正的多主機總線如果兩個或更多主機同時初始化數據傳輸可以通過沖突檢測和仲裁防止數據被破壞串行的位雙向數據傳輸位速率在標准模式下可達 kb/s快速模式下可達 kb/s高速模式下可達 Mb/s連接到相同總線的IC數量只受到總線的最大電容 pF限制
IC總線在傳送數據過程中共有種特殊的電平變換情況他們分別是起始(start)停止(stop)和響應(aek)
當SCL為高電平時SDA由高電平向低電平跳變這個表示起始條件當SCL是高電平時SDA線由低電平向高電平跳變表示停止條件起始和停止條件一般由主機產生總線在起始條件後被認為處於忙的狀態在停止條件的某段時間後總線被認為再次處於空閒狀態
響應信號是指從機在接收到b數據後向主機發出特定的低電平脈沖表示已收到數據在響應的時鐘脈沖期間從機必須將SDA線拉低使他在這個時鐘脈沖的高電平期間保持穩定的低電平主機收到應答信號後根據實際情況做出是否繼續傳遞信號的判斷若未收到應答信號則判斷為從機出現故障
操作時序
IC總線運用主/從雙向通訊主機和從機都可以工作於接收和發送狀態總線必須由主機(通常為微控制器)控制主機產生串行時鐘(SCL)控制總線的傳輸方向並產生起始和停止條件SDA線上的數據狀態僅在SCL為低電平的期間才能改變SCL為高電平的期間SDA狀態的改變被用來表示起始和停止條件具體時序見圖
嵌入式系統中的IC驅動的兩種實現
系統自帶IC寄存器的實現
下面以arm SCB為例給出基於寄存器方式的IC驅動實現SCB內含一個IC總線主控器可方便地與各種帶有IC接口的器件相連IC總線控制器有個特殊功能寄存器一個控制狀態寄存器(ICON)一個預分頻寄存器(ICPS)和一個移位緩沖寄存器(ICBUF)通過配置這些寄存器可實現正確的IC數據傳輸時序下面分別給出讀寫實現的實例讀操作
通過對控制狀態寄存器(I
CC()N)寫入OxlO發送啟動碼初始化串行I
C總線
然後總線控制器發送
位的從設備地址並通過移位緩沖寄存器發送讀/寫控制位
接收器則在主控器的SCL脈沖期間通過將SDA線從高電平下拉到低電平作為應答信號
寫數據的操作 先設置控制狀態寄存器的BF位(x)然後寫入數據到移位緩沖寄存器移位緩沖寄存器無論是被讀還是寫BF位均會自動清零若要進行連續的讀/寫操作必須設置控制狀態寄存器的ACK位(x)
讀數據的操作 在設置控制狀態寄存器的BF位以後可以進行讀數據的操作當讀/寫完最後一個字節時可對ACK位進行復位通知發送器/接收器讀數據操作結束
在讀/寫操作完成以後可通過對ICCON寫入x生成結束碼
以GPIO端口模擬IC實現
此方法是直接用arm SC的GPIO(GeneralPurpose Input/Output)引腳模擬IC總線的時序來實現數據傳輸SCB提供了個可編程的通用I/O端口用戶可將每個端口配置為輸入模式輸出模式或特殊功能模式由片內的特殊功能寄存器IOPMOD和IOPCON控制
控制I/O口的特殊功能寄存器一共有個IOPMODIPCON和IOPDATAI/O口模式寄存器(IOPMOD)用於配置P~P的輸入輸出狀態I/O口控制寄存器IOPCON用於配置端口P~P的特殊功能當這些端口用作特殊功能(如外部中斷請求外部中斷請求應答外部DMA請求或應答定時器溢出)時其工作模式由PCON寄存器控制而不再由IOPMOD寄存器I/O口數據寄存器(IOPDATA)當配置為輸入模式時讀取I/O口數據寄存器IOPDATA的每一位對應輸入狀態當配置為輸出模式時寫每一位對應輸出狀態位[O]對應於個I/引腳P~P
下面用GPIO的pin[O][]腳進行IC模擬其中低位為SDA高位為SCL首先給出一些便於操作的宏定義
應用實例
為arm外掛PCF實現實時時鐘控制PCF是PHILIPS公司生產的具有IC接口的低功耗CM()S實時時鐘/日歷芯片其最大總線速度為kb/s每次讀寫數據後其內嵌的字地址寄存器器會自動產生增量下面用模擬實現PCF的IC實時時鐘芯片的操作有字節寫/讀兩種狀態程序中從地址的讀地址為AH寫地址為AH
首先使能IC總線然後對IC總線進行開始操作就緒之後依次寫人器件地址(即xA)寫入寄存器地址再寫人所設寄存器值控制/狀態寄存器為控制/狀態寄存器為秒寄存器為分鐘寄存器小時寄存器為日寄存器為星期寄存器為月/世紀寄存器為年寄存器為(即年月日點分秒)當程序運行一段時間(分鐘)後依次讀取寄存器得到時間為年月日點OO分秒
總 結
本文給出了兩種IC驅動的實現方法前者直接利用主機端自帶的IC總線控制器通過配置一系列特殊寄存器實現IC總線傳輸這種方式適用於一些本身包含IC總線控制器的芯片實現起來簡單方便後者則適用於主機端沒有IC控制器的情況此時主機端只要有GPIO端口就可利用其實現同樣的功能在基於arm加μClinux的嵌入式視頻監控產品中同時將這兩種方法做了具體的運用其一的示例就是通過模擬的IC總線掛接PCF實時時鐘芯片並取得很好的實時效果
From:http://tw.wingwit.com/Article/program/qrs/201312/30115.html