I2C基本原理及對I2C Adapter的理解


一、簡介 

   I2C(Inter-Integrated Circuit)總線是一種由PHILIPS公司開發的兩線式串行總線,用於連接微控制器及其外圍設備。I2C總線產生於在80年代,最初為音頻和視頻設備開發,如今主要在服務器管理中使用,其中包括單個組件狀態的通信。例如管理員可對各個組件進行查詢,以管理系統的配置或掌握組件的功能狀態,如電源和系統風扇。可隨時監控內存、硬盤、網絡、系統溫度等多個參數,增加了系統的安全性,方便了管理

二、技術性能

  •  工作速率有100Kbit/s、400Kbit/s和3.4Mbit/s三種;
  • 支持多機通訊;
  • 支持多主控模塊,但同一時刻只允許有一個主控
  • 數據線SDA時鍾SCL構成串行總線;
  • 每個電路和模塊都有唯一的地址;                  
  • 每個器件可以使用獨立電源
  • 連接到總線的接口數量只由總線電容是400pF的限制決定

三、基本工作原理

  • SDA和SCL都是雙向線路,都通過一個電流源或上拉電阻連接到正的電源電壓。當總線空閑時,這兩條線路都是高電平。連接到總線的器件輸出級必須是漏極開路或集電極開路才能執行線與的功能。
  • 以啟動信號START來掌管總線,以停止信號STOP來釋放總線;
  •  每次通訊以START開始,以STOP結束;
  • 啟動信號START后緊接着發送一個地址字節,其中7位為被控器件的地址碼,一位為讀/寫控制位R/W,R/W位為0表示由主控向被控器件寫數據,R/W為1表示由主控從被控器件讀數據;
  • 當主機發送了一個地址后,系統中的每個器件都在起始條件后將頭7位與自己的地址比較,如果被控器件檢測到收到的地址與自己的地址相同,在第9個時鍾期間反饋應答信號;
  • 每個數據字節在傳送時都是高位(MSB)在前

1、寫通訊過程:

    (1)主控在檢測到總線空閑的狀況下,首先發送一個START信號掌管總線;
    (2)發送一個地址字節(包括7位地址碼和一位R/W);
    (3)當被控器件檢測到主控發送的地址與自己的地址相同時發送一個應答信號(ACK);
    (4)主控收到ACK后開始發送第一個數據字節;
    (5)被控器收到數據字節后發送一個ACK表示繼續傳送數據,發送NACK表示傳送數據結束;
    (6)主控發送完全部數據后,發送一個停止位STOP,結束整個通訊並且釋放總線;

2、讀通訊過程

    (1)主控在檢測到總線空閑的狀況下,首先發送一個START信號掌管總線;
    (2)發送一個地址字節(包括7位地址碼和一位R/W);
    (3)當被控器件檢測到主控發送的地址與自己的地址相同時發送一個應答信號(ACK);
    (4) 主控收到ACK后釋放數據總線,開始接收第一個數據字節;
    (5)主控收到數據后發送ACK表示繼續傳送數據,發送NACK表示傳送數據結束;
    (6)主控發送完全部數據后,發送一個停止位STOP,結束整個通訊並且釋放總線;





四、總線時序分析

    1、總線空閑狀態

      SDA和SCL兩條信號線都處於高電平,即總線上所有的器件都釋放總線,兩條信號線各自的上拉電阻把電平拉高;

   2、啟動信號START

      時鍾信號SCL保持高電平,數據信號SDA的電平被拉低(即負跳變)。啟動信號必須是跳變信號,而且在建立該信號前必修保證總線處於空閑狀態;

 3、停止信號STOP  

   時鍾信號SCL保持高電平,數據線被釋放,使得SDA返回高電平(即正跳變),停止信號也必須是跳變信號

    4. 數據傳送

  SCL線呈現高電平期間,SDA線上的電平必須保持穩定,低電平表示0(此時的線電壓為地電壓),高電平表示1(此時的電壓由元器件的VDD決定)。只有在SCL線為低電平期間,SDA上的電平允許變化。

 5. 應答信號ACK

   I2C總線的數據都是以字節(8位)的方式傳送的,發送器件每發送一個字節之后,在時鍾的第9個脈沖期間釋放數據總線,由接收器發送一個ACK(把數據總線的電平拉低)來表示數據成功接收.

 6. 無應答信號NACK     

  在時鍾的第9個脈沖期間發送器釋放數據總線,接收器不拉低數據總線表示一個NACK,NACK有兩種用途:

      a. 一般表示接收器未成功接收數據字節;
      b. 當接收器是主控器時,它收到最后一個字節后,應發送一個NACK信號,以通知被控發送器結束數據發送,並釋放總線,以便主控接收器發送一個停止信號STOP。

五、尋址約定

地址的分配方法有兩種:
    1. 含CPU的智能器件,地址由軟件初始化時定義,但不能與其它的器件有沖突;
    2. 不含CPU的非智能器件,由廠家在器件內部固化,不可改變。

    高7位為地址碼,其分為兩部分:
    1. 固定部分,不可改變,由廠家固化的統一地址;
    2. 可編程部分,此部分由器件可使用的管腳決定。例如,如果器件有4個固定的和3個可編程的地址位,那么相同的總線上共可以連接8個相同的器件(並非所有器件都可以設定)。

注冊過程:

drivers/i2c/busses/i2c-qup.c(這是適配器的驅動)
platform_driver_register
qup_i2c_probe    //在arch/arm/mach-msm/devices-msm8x60.c中定義了多少個gsbix_qup_i2c_resources就有多少個I2C Adapter,這個probe函數就會執行多少次
i2c_add_numbered_adapter
i2c_register_adapter
i2c_scan_static_board_info
i2c_new_device    //arch/arm/mach-msm/board-xxx.c里面定義的i2c設備在此注冊(這就是靜態注冊)
device_register //從這句開始即是設備模型的東西
device_add
bus_probe_device
device_attach
__device_attach       //每注冊一個設備都會調用此函數,每注冊一個驅動也會調用__driver_attach,先注冊設備還是驅動無硬性規定,不過驅動和設備是相偎相依的
driver_match_device //會根據device的name字段和bus上掛載的drivers鏈表中每一個driver的id_table的name字段比較,如果相等即找到了自己的driver
driver_probe_device  //如果相等調用此函數,不相等返回0。接下來會調用具體設備驅動的probe函數

drivers/i2c/i2c-dev.c
調用到的__process_new_driver-->i2c_do_add_adapter-->attach_adapter會真正執行,其他地方調用此函數均不執行。每一個i2c adapter會在/dev下生成一個字符設備。

這里只寫了大概的流程,有興趣的讀者可自行跟蹤代碼流程。

六、I2C Adapter 和I2C Bus

  gsbi是物理上實際存在的部件,它可以模擬成i2c、gpio、spi、uart、sdio等,此i2c即是gsbi模擬的。這里順便提下i2c adapter和i2c總線,兩者都是物理上必須存在的,哪怕是其他部件模擬的,例如GSBI模擬I2C,那么GSBI這個部件是實際存在的。GSBI的走線會與所有i2c設備互連,GSBI的接口即是i2c adapter,與其他i2c設備互連的走線即是i2c總線。如果GSBI模擬成uart,那么與uart的rx/tx pin連接的走線即是uart串口線。這是高通平台的設計,換作其他平台,也一定會有一個i2c adapter或者說可以模擬成i2c adapter的物理部件存在。猜測i2c adapter位於片上系統中,類似I/O接口的東西,沒有固件,驅動它的代碼即是各平台相關的i2c adapter driver。GSBI的地址以及模擬成的qup i2c/uart的地址都是編址好的,在arch/arm/mach-msm/devices-msm8x60.c最開頭可以看到這些物理地址。我們知道ARM是統一編址的,在代碼中要用ioremap把它映射到虛擬內存,這樣就可以訪問了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM