今天花了半天時間學習I2C總線協議,算是弄得比較透徹,拿出來和大家分享一下。
·I2C總線特點
·I2C總線三種狀態
·I2C總線必要知識點
·I2C總線寫過程
·I2C總線讀過程
一、I2C總線特點
在講之前呢我為大家畫了一幅圖。
從圖看呢,比較簡陋,但是麻雀雖小五臟俱全,想表達的都可以在圖中看出來。
從圖中我們可以看出呢,I2C總線的特點呢是:
1.它是由兩根線組成的,一根叫SCL(串行時鍾線),一根叫SDA(串行數據線)。線少,好處自然不用多說咯,但是速度肯定就慢了,用作外設之間的數據接口夠用了。而快速的芯片內部通信,用的是AMBA總線通信,想了解的自己查一下,或者過幾天我研究后再寫。
2.每顆I2C芯片呢都可以作為主機和從機,但一次通行中只允許存在一個主機。
兩點特點是不是有點少啊,沒事兒,在了解后面的知識點后,自己總結吧,主要講后面內容呢。
二、I2C總線的三種狀態
I2C總線存在三種狀態:
1.空閑
2.工作開始
3.工作停止
先說空閑狀態:當SCL與SDA同時為高電平時,為空閑態,說白了,就啥也不干。如下圖:
再說說開始工作狀態,此時SCL為高,而SDA出現下降沿,如下圖:
最后就是停止工作狀態,此時SCL為高,SDA出現上升沿,如下圖:
三、I2C總線必要知識點
除了要知道上面的三種狀態,還需要知道下面五點內容,方可理解最后的讀寫過程。要來了,接招:
1.I2C總線協議要求1個字節位寬為8位(8bit)
2.從機地址位寬為7bit,但上面說了啊一個字節要8bit,不着急,還有1個bit的位寬用來存放主機是用來寫(0),還是用來讀(1),加起來剛好8bit。比如0100101(地址位)0(讀寫位,此處為寫),可以看出讀寫位為最低位。
3.每顆I2C芯片都有各自的地址,互相之間有可能相同,有可能不同。相同時呢,就是要實現一個主機同時對多個從機進行數據交換。為了使各個I2C芯片之間更加靈活,每顆I2C芯片都有固定的4位地址,以及3位可編程地址,當4位固定地址相同時,用軟件編輯后3位,使之相同,所以最多可以有8台(2的三次方)從機可以同時與主機通信。
4.一個字節傳輸完畢之后,主機將SDA拉高,主機I2C芯片就不再干活了,等待從機反饋(ACK acknowledge),這時從機I2C芯片開始對傳輸過程做判定,判定讀取成功時,將SDA拉低,以表示我完成啦,你繼續吧。主機得到這個訊息之后,就會進行下一步既定的操作。如果從機讀取失敗,那么SDA將不會變化。此時主機就會知道,哦,沒發成功,接下來是繼續重新傳輸一遍還是終止操作,這個由寫好的程序來定。 到這里大家會不會想到這樣會有一個BUG,那就是只要SDA一直不變,那主機就一直不干活了?當然主機也不是傻子(其實應該是程序猿也不是傻子),那就等一個時間唄,一定時間內,我收不到信號拉低,那就認為你出問題了。這個時間就是半個SCL周期。
5.在4中提到了時鍾周期,這里再科普一下。看下圖(download的,還有百度水印):
從這張圖可以看出,一整個流程應該是9個時鍾周期,在第九個周期的高過程,必須完成ACK。每位數據對應一個high,在這半個周期內,要求SDA上的數據是穩定的,不能發生改變,為啥?用類似建立時間保持時間來理解。
四、I2C總線寫過程
寫過程如下:
1.主機發送從機地址(7bit)+0(0是寫),所有從機都會接收到這個信息,但是只有地址匹配的從機反饋一個ACK(0),並准備后面的接收工作,其它地址不對的從機,'早點洗洗睡吧,沒咱啥事兒了'。
2.主機收到這個ACK,開始發送內存地址(8bit),所有地址匹配的從機(前面說過,一個主機可以匹配多個從機,只要那從機地址相同就行)接收這個8bit的內存地址,在吩咐下去之后,給主機一個反饋ACK(0),'我OK啦'。
3.主機收到這個ACK,開始發送數據給從機,一個字節8bit,從機接收完成,給主機反饋ACK(0)。
4.主機收到這個ACK,是繼續發送數據,還是發送終止信號,取決於數據是否發送完畢。
五、I2C總線讀過程
讀過程如下:
1.主機發送從機地址(7bit)+0(0是寫),這里為啥又是寫呢?首先,主機得找到這些從機呀,當然要將從機地址寫給各個從機了。所有從機都會接收到這個信息,但是只有地址匹配的從機反饋一個ACK(0),並准備后面的接收工作,其它地址不對的從機,'誒......早點洗洗睡吧,又沒咱啥事兒了'。
2.主機接收到這個ACK,開始發送8bit的內存地址給從機,'把這個地址找到,把貨給我取出來備着,我一會兒要從你這里提貨啊!'。從機找好這些地址后,反饋一個ACK(0)給主機。
3.主機收到這個ACK,再發一次從機地址(7bit),只不過這次最后一個換成1(讀)了。從機收到並返回ACK(0)。
4.主機收到這個ACK,做好了接收從機信息的准備,這個時候從機信息到了,主機接收完信息后不對從機發送反饋(畢竟人家是老大啊,老大拿好了還要給小嘍嘍打個報告?)直接發起終止信號,心疼從機3秒鍾。
好了,到這里就講完了,繼續心疼從機3秒.......
補充:I2C通信協議允許暫停功能,就是在主機傳輸數據時,從機需要進行一個優先級高的事件時,從機通過拉低SCL,迫使主機等待,等到處理完緊急事件后,從機釋放SCL,主機繼續傳輸。