對許多剛開始接觸i2c的新手來說,最開始比較疑惑,當mcu做主機與一些i2c介面的從機(比如一些數字感測器,大多數仍為i2c介面)通訊時,無論是用io模擬i2c協議還是使用i2c模組,在傳送從機位址時為什麼都需要將從機手冊的i2c位址左移一位發出去呢?當然這個問題是比較初級的了,高手直接略過,新手權且簡單看一看作為學習資料吧。
首先以飛思卡爾kinetis系列為例(咳咳,好多人估計都快吐了,腫麼又是kinetis,俺也木有辦法,誰讓俺天天就接觸這個了,呵呵),我們先看看i2c模組的位址暫存器如下圖,這個比較直接明了,即本身位址暫存器就是高八位有效的,所以我們在寫入從機位址時肯定需要左移一位再寫進去,但是又有人要問了,為啥做成左對齊的格式呢(俺們都是習慣了右對齊啊),咳咳,那我們只能忍一忍繼續往下看。
好了,首先恭喜你堅持下來繼續往下看,呵呵,先上圖,該圖為i2c的時序圖,這個圖更為直接的解釋了左對齊位址及左移一位的原因,首先i2c的從機位址時msb先傳送的,所以需要左對齊,其次i2c時序中第8位即lsb使其r/w即讀寫控制位,這下又明了了吧,這也就是為什麼我們在讀寫i2c從機時都會左移一位然後或上乙個讀寫位了,如果不左移,後果你們都懂的,呵呵。
其實說到這,本篇文章應該就該收尾結束了,但是我想提醒的是,現在包括飛思卡爾官方或者第三方都提供了比較完善的i2c驅動庫(或者mqx下的i2c驅動),其驅動裡面已經做好了移位及讀寫控制操作,所以我們在呼叫函式介面時傳遞i2c從機位址時只需要把從機手冊中的i2c位址直接填進去即可,我們不需要自己先左移好位址在傳遞過去,這樣的話傳的位址就不對了。之所以最後提醒一句就是之前的確有使用者遇到這樣的問題了,最後花了很長時間才發現是自己預移一位造成從機位址錯誤了
I2C裝置主機與從機位址設定
i2c裝置一般使用mcu作為主機,主機與從機通過匯流排連線起來,分別是scl時鐘匯流排和sda資料匯流排,主機傳送給從機scl時鐘訊號,sda傳送資料,如下圖所示 stm32作為主裝置,主機位址可隨意設定,從裝置必須配置位址 i2c initstructure.i2c ownaddress1 i2c...
I2C器件的從裝置位址設定
i2c中24c02從位址設定 今天看了一下at24c02的程式,發現 從裝置位址 有點不明白,現在以at24c02為例子說說我的見解。首先,先看一下at24c02的晶元資料,我們會發現at24c02有三個位址a0,a1,a2。同時,我們會在資料的device address介紹發現i2c器件一共有七...
如何看I2C的從機位址(MMA8451Q晶元為例)
最近在寫乙個i2c通訊的程式,看到晶元規格書上面是這樣子寫從機位址的 規格書是這樣看得,6到0位是0x1c,然後加上讀或寫的那位也就是r w位上1or0,就成了8位,最後的0x39和0x38是從機位址0x1c並上了r w位之後得到的最終資料。通常來說從機位址應該是0x1c,然後根據自己的需求並上1o...