過年期間, 大家是不是有立下什麼志向要學些什麼呢?
基於Bear一直有在介紹跟開發版有關的文章, 這次我們要介紹個稍微艱澀的名詞: i2c
他是個什麼樣的東西呢? 別急, Bear會用最簡單的方式介紹給大家的!
基於Bear一直有在介紹跟開發版有關的文章, 這次我們要介紹個稍微艱澀的名詞: i2c
他是個什麼樣的東西呢? 別急, Bear會用最簡單的方式介紹給大家的!
在使用Arduino與手邊的Sensor做溝通的時候,
常常會遇到溝通界面的問題,
最常見的其中之一大概就是I2C了!所以在這邊簡單介紹給大家瞭解。
有興趣從事嵌入式系統(Embedded System)開發的朋友也別錯過噢!
(有關Arduino教學應用開發文, 可以參考本文最底部介紹)
常常會遇到溝通界面的問題,
最常見的其中之一大概就是I2C了!所以在這邊簡單介紹給大家瞭解。
有興趣從事嵌入式系統(Embedded System)開發的朋友也別錯過噢!
(有關Arduino教學應用開發文, 可以參考本文最底部介紹)
圖中的device 1, 2, 3 就是手邊的Sensor, LCD screen…
連接到的就是你的Arduino 之類的控制器,
Rp就是一般的電阻 大約從1.8k~4.7k 皆可。
在I2C中有個重要概念要記得:Master and Slave,
Master就是你的controller, Slave就是外接的其他東西。
(可以用一般伺服器的Server & Client的概念來理解, 如果不清楚概念的可以點選參考這篇)
所以 I2C device不是master 就是slave,此外master只會有一個但是slave可以有多個。
那Master跟Slave之間要如何溝通呢?
連接到的就是你的Arduino 之類的控制器,
Rp就是一般的電阻 大約從1.8k~4.7k 皆可。
在I2C中有個重要概念要記得:Master and Slave,
Master就是你的controller, Slave就是外接的其他東西。
(可以用一般伺服器的Server & Client的概念來理解, 如果不清楚概念的可以點選參考這篇)
所以 I2C device不是master 就是slave,此外master只會有一個但是slave可以有多個。
那Master跟Slave之間要如何溝通呢?
簡單的來說,在每次開始的第一步,就是要送Start sequence到slave 然後在要結束前送stop sequence
Data是8bits傳輸 是由MSB 開始傳輸 每八個bit傳輸完以後會有一個acknowledge bit 所以會有9個pulse。
如果收到的ACK bit 是low的話 就代表device已經可以準備接收下一筆data, 但是如果收到的ACK bit是high的話
就表示不能再接收任何資料 此時mater應該要結束傳輸(傳送stop sequence)
Data是8bits傳輸 是由MSB 開始傳輸 每八個bit傳輸完以後會有一個acknowledge bit 所以會有9個pulse。
如果收到的ACK bit 是low的話 就代表device已經可以準備接收下一筆data, 但是如果收到的ACK bit是high的話
就表示不能再接收任何資料 此時mater應該要結束傳輸(傳送stop sequence)
我們馬上可以想到一個問題就是 I2C可以傳輸多快呢?
一般來說I2C的標準是100 KHz, 菲利浦公司定義了faster speed mode可以傳輸高達 400 KHz, high speed mode
更可以高達 3.4Mhz. 不過正常來說 還是用 100KHz 為一個設計標準。
利用I2C溝通的時候還要特別注意到一件事情 那就是Slave Address:每一個I2C device都會有自己的address (7 bits or 10 bits) 通常使用7 bits, 10 bits很少見, 在7bits的情況下的話 代表我們最多可以連接128個device
此外我們在傳送的mater slave的資訊的時候還必須在最後面多加上個bit R/W 所以送出去的總共還是八個bits
比如說我們要送write to address為21 (10101) -> 42 (101010) and if you want to read the data from this address -> 43 (101011)
從實作的角度還看的話
如果我們要進行寫入(Write)的動作的話 我們依照下列的做法:1. 送出start sequence
2. 接著送 address 的資訊
3. 在找到matched的slave address之後 master比需要送出internal location
或是register number inside the slave that master wish to write or read from.
這個location 會隨著不同的device而改變。
4. 接著就可以對slave做寫入的動作了 slave的部分會自動調整internal location address
5. 資料傳輸完成後,最後就是送stop sequence來結束傳輸的動作。
如果我們要進行讀取(Read)的動作的話 我們依照下列的做法:
在讀取的部分稍微複雜一些,因為在讀取之前我們必須要先告訴slave那個internal address我們想要讀取
所以在讀取之前 我們必須要先做一個寫入的動作。
1. 送start sequence
2. 然後送address + R/W (LSB=0)
3. 接著再送internal register number到要讀取的地方
4. 接著你再送一次start sequence 和 address(with LSB=1) (又叫做重新啓動restart)
5. 接著你就可以讀取data了
6. 最後讀取結束的時候再送stop sequence就可以了
如果我們要進行寫入(Write)的動作的話 我們依照下列的做法:1. 送出start sequence
2. 接著送 address 的資訊
3. 在找到matched的slave address之後 master比需要送出internal location
或是register number inside the slave that master wish to write or read from.
這個location 會隨著不同的device而改變。
4. 接著就可以對slave做寫入的動作了 slave的部分會自動調整internal location address
5. 資料傳輸完成後,最後就是送stop sequence來結束傳輸的動作。
如果我們要進行讀取(Read)的動作的話 我們依照下列的做法:
在讀取的部分稍微複雜一些,因為在讀取之前我們必須要先告訴slave那個internal address我們想要讀取
所以在讀取之前 我們必須要先做一個寫入的動作。
1. 送start sequence
2. 然後送address + R/W (LSB=0)
3. 接著再送internal register number到要讀取的地方
4. 接著你再送一次start sequence 和 address(with LSB=1) (又叫做重新啓動restart)
5. 接著你就可以讀取data了
6. 最後讀取結束的時候再送stop sequence就可以了
Reference :本篇的圖及內容大多自於 http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html
有興趣的人可以到該網站看看
喜歡這篇文章嗎? 或許你也會喜歡以下開發板文章
[1] iPhone 製作Arduino藍芽聊天室
[2] Arduino製作家中遙控器教學
[3] Android 電視盒開發板怎麼選? Takobear簡單告訴你!
[4] 如何第一次用Arduino就上手?
[5] 用Ardunio 控制讓伺服馬達旋轉吧!
[6] 利用Arduino控制家裡電燈吧!
想知道更多訊息, 趕快加入Takobear粉絲團吧!
有興趣的人可以到該網站看看
喜歡這篇文章嗎? 或許你也會喜歡以下開發板文章
[1] iPhone 製作Arduino藍芽聊天室
[2] Arduino製作家中遙控器教學
[3] Android 電視盒開發板怎麼選? Takobear簡單告訴你!
[4] 如何第一次用Arduino就上手?
[5] 用Ardunio 控制讓伺服馬達旋轉吧!
[6] 利用Arduino控制家裡電燈吧!
想知道更多訊息, 趕快加入Takobear粉絲團吧!