標籤:資料 art 工作 linux 代碼 時間
一、介紹
I2C匯流排是由Philips公司發明的一種兩線式串列匯流排,用於串連微控制器及其外圍裝置。I2C最主要的優點是簡單、有效。由於不需要額外獨立的介面,所以i2c匯流排佔用的空間非常少,減少了電路板的空間和晶片引腳的數量。i2c匯流排最初是為音頻和視頻裝置開放,現在已應用於各種裝置。
二、I2C概述
I2C匯流排是由資料線SDA和時鐘線SCL構成的串列匯流排,可發送和接受資料,每個裝置都有唯一的地址識別。I2C運用主/從雙向通訊,器件發送資料到匯流排上則定義為發送器,器件接受資料則是接受器。主器件和從器件都可以工作於接收和發送狀態。匯流排必須由主器件(通常為微處理器)控制,主器件產生SCL控制匯流排的傳輸方向,併產生起始和停止條件。SDA上的資料狀態僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA上狀態的改變被用來表示起始和停止。
I2C資料格式如下:
無資料:SCL=1,SDA=1;
開始位(Start):當SCL=1時,SDA由1向0跳變;
停止位(Stop):當SCL=1時,SDA由0向1跳變;
資料位元:當SCL由0向1跳變時,由發送方控制SDA,此時SDA為有效資料,不可隨意改變SDA;
當SCL保持為0時,SDA上的資料可隨意改變;
地址位:定義同資料位元,但只由發送器發給接收器;
應答位(ACK):當發送方傳送完8位時,發送方釋放SDA,由接收方控制SDA,且SDA=0;
否應答位(NACK):當發送方傳送完8位時,發送方釋放SDA,由接收方控制SDA,且SDA=1。
當資料為單位元組傳送時,格式為:
開始位,8位地址位(含1位讀寫位),應答,8位元據,應答,停止位。
當資料為一串位元組傳送時,格式為:
開始位,8位地址位(含1位讀寫位),應答,8位元據,應答,8位元據,應答,……,8位元據,應答,停止位。
需要注意的是:
(1)SCL一直由主器件(Master)控制,SDA依照資料傳送的方向,讀資料時由從器件(Slave)控制SDA,寫資料時由Master控制SDA。當8位元據傳送完畢之後,應答位或者否應答位的SDA控制權與資料位元傳送時相反。
(2)開始位“Start”和停止位“Stop”,只能由Master來發出。
(3)地址的8位傳送完畢後,成功配置地址的Slave裝置必鬚髮送“ACK”。否則否則一定時間之後Master視為逾時,將放棄資料傳送,發送“Stop”。
(4)當寫資料的時候,Master每發送完8個資料位元,Slave裝置如果還有空間接受下一個位元組應該回答“ACK”,Slave裝置如果沒有空間接受更多的位元組應該回答“NACK”,Master當收到“NACK”或者一定時間之後沒收到任何資料
將視為逾時,此時Master放棄資料傳送,發送“Stop”。
(5)當讀資料的時候,Slave裝置每發送完8個資料位元,如果Master希望繼續讀下一個位元組,Master應該回答“ACK”以提示Slave準備下一個資料,如果Master不希望讀取更多位元組,Master應該回答“NACK”以提示Slave裝置准
備接收Stop訊號。
(6)當Master速度過快Slave端來不及處理時,Slave裝置可以拉低SCL不放(SCL=0將發生“線與”)以阻止Master發送更多的資料。此時Master將視情況減慢或結束資料傳送。
三、I2C驅動架構
Linux的I2C體繫結構分為3個組成部分:
1.I2C核心
I2C 核心提供了I2C匯流排驅動和裝置驅動的註冊、登出方法,I2C通訊方法(即“algorithm”)上層的、與具體適配器無關的代碼以及探測裝置、檢測裝置地址的上層代碼等。
2.I2C匯流排驅動
I2C匯流排驅動是對I2C硬體體繫結構中適配器端的實現,適配器可由CPU控制,甚至直接整合在CPU內部。
I2C匯流排驅動主要包含了I2C適配器資料結構i2c_adapter、I2C適配器的algorithm資料結構i2c_algorithm和控制I2C適配器產生通訊訊號的函數。
經由I2C匯流排驅動的代碼,我們可以控制I2C適配器以主控方式產生開始位、停止位、讀寫周期,以及以從裝置方式被讀寫、產生ACK等。
3.I2C裝置驅動
I2C裝置驅動是對I2C硬體體繫結構中裝置端的實現,裝置一般掛接在受CPU控制的I2C適配器上,通過I2C適配器與CPU交換資料。
I2C裝置驅動主要包含了資料結構i2c_driver和i2c_client,我們需要根據具體裝置實現其中的成員函數。