I2C,念法應該是[ I-squared-C],不過不必糾結於念法,老美也有亂念的,像是[I-Two-C],聽得懂就好。
I2C只需要兩根線就可以。一根是SCL(Serial Clock?),另外一根是SDA(Serial Data?)。SCL顧名思義,就是提供clock的線,SDA則是要跟clock對齊的資料。
I2C是master-slave的BUS架構,master是大多數只有一個,slave則是可以有很多個。而只有master可以拉SCL。
因為只有一根線可以傳資料,所以必須定義SDA訊號的內容。I2C超簡單,只有幾種:
1. Start condition:傳輸開始
2. End condition:傳輸結束
3. 8-bit address:因為是BUS架構,必須指定這次傳輸要傳給哪個裝置。很好玩的是,I2C並沒有動態指定address的協定,所以每個裝置的address都是先講好的。所以記得檢查你的I2C bus上有沒有address衝除的裝置。每個裝置的datasheet都會說明它自己的address。有一個bit是拿來表示這次的傳輸是讀還是寫,所以其實只有7-bit可以用,所以address最大是127。
4. 8-bit or 16bit
data
5. ACK:表示資料收到了
在這邊又衍生出另外一個問題:SDA到底要先傳most significant bit還是最後傳?google了一下發現是先傳。
I2C協定有許多變種,所以就不列波形圖(其實是懶),每個裝置的datasheet都會列出它需要的波形圖,唯一可以相信的就是這個。其實I2C對於波形的準確性不是很在意,意思到了就會動,而這也代表著它的傳輸速度不會太快,了不起100Kbps吧。請注意,100Kbps是指clock rate,也就是100Khz,實際上有效資料有到50Kbps就可以偷笑了。
我以前沒想過的是,用8051就可以拉出I2C需要的波型。後來想想也對,反正先拉SCL再拉SDA即可,反正容許誤差很大,這樣也會動。但是速度一定是慢,而且用8051寫這個可是一件苦差事。
還有一種是直接透過硬體控制I2C,只要填填register就好。這種比較簡單,而且速度比較快。
I2C debug很簡單,直接用示波器量訊號,一翻兩瞪眼,是誰的問題一目了然。
在debug時,另外一個問題是(怎麼這麼多問題),到底誰會在哪個時候拉SDA?這個就是大哉問了。大部分都是master,裝置應該是只會在回資料跟ACK才會需要拉吧。這點一定要注意,不然到時候就會錯怪忠良了。
1 comment:
Hi 你好,你的這篇真是讓我收益良多,
「address最大是127」這點,後來讀到某些資料時,很多文件對於address的講法比較偏好於「所以address永遠只能為偶數,最後一個bit保留紀錄讀/寫資訊用」這樣,兩個講法是同義的,當初對初學者的我來說真的很難搞懂,所以在這裡幫你補充一下 :D
Post a Comment