IIC知識整理以及ADS1115
什麼是IIC?
IIC (Inter-Integrated Circuit), 通常發音為: I-squared-C,是多主、多從、分組交換、單工的序列匯流排,通常用於處理器或微控制器與低速外圍器件的短距離通訊連線。這個通訊協議是由(NXP半導體的前生)飛利浦公司發明,並在2006年開始,I2C協議的實施不要許可費,但仍要收取I2C從機分配地址的費用。
來自:wiki
IIC的特性如下:
- 僅用兩線連線;
- 不像RS232那樣有著嚴格的波特率要求,而是由主裝置(mater)產生時鐘訊號;
- 裝置之間的主/從關係簡單,每個裝置都有軟體給予的唯一地址;
- IIC是一個真正的多主匯流排,提供仲裁和衝突檢測的功能。
IIC 的發展歷史
時間 | 事件 |
---|---|
1982年 | 最初的100KHz I2C系統產生,其作為內部匯流排系統用於建立帶各種飛利浦晶片的控制電路。 |
1992年 | I2C的首個標準版本1.0出現,加入400KHz的(Fast-mode)快速模式;引入10bits的地址,使得系統能夠容納多達1008個節點。 |
1998年 | 版本2.0加入3.4MHz的高速模式(High-speed mode)以及滿足系統在電壓和電流方面的節能需求。 |
2000年 | 版本2.1基於版本2 引入一個小清理。 |
2007年 | 版本3 加入1 Mhz 快速+模式(Fast-mode plus)。 |
2012年 | 版本4 加入5 MHz的極快模式(Ultra Fast-mode),這種模式的資料線和時鐘線使用推輓輸出來替代上拉電阻,並加入了輔助分配Id表。此模式只能用於單向匯流排。 |
2012年 | 版本5 修正了一些錯誤。 |
2014年 | 版本6 修正了兩幅圖。 |
物理(電氣)特性
IIC物理層的連線結構十分簡單,訊號的傳輸僅需2根線(裝置之間隔離)便能實現,分別是通訊時鐘線(SCL)和資料線(SDA),SCL作為時鐘線進行時鐘同步,SDA作為資料傳輸線路,由於只有一條,這決定了IIC通訊是單工的。一般無隔離的情況下,由於共地還需引入一條地線。
圖1 Fast/standard 模式下的裝置連線
通常,I2C通訊裝置之間只通過普通導線進行連線,位元流訊號採用TTL/CMOS標準下的高/低電平來表示1/0訊號,這一方式使得傳輸距離很短(本來設計目的就是用於短距離通訊),直接連線的傳輸距離短達40cm,提升通訊距離則需使用P82B715一類的中繼器或者改用其它通訊協議與裝置。
匯流排通訊協議
IIC是多主的匯流排協議。匯流排的時鐘訊號(SCL)是由主裝置提供,因此同一時間一條匯流排中只能存在一個主裝置,先不考慮多主情況下的匯流排仲裁競爭,只考慮主裝置確定的通訊規則。
圖2 7位地址模式下資料傳輸電平
以7位地址主從IIC傳輸為例
IIC傳輸資料的模式模式為:
[ 開始 +(7位地址+1位讀寫+1位ACK)+(8位資料+1位ACK)*n+停止 ]
在傳輸過程中,每傳輸8位後,要通過一個ACK位進行相互確認。
— 接下來,將具體介紹協議—
一位訊號資料傳遞模式
圖3 傳遞一位資料
IIC協議通過資料線SDA在SCL的配合下實現資訊的有效傳送。每條線均可產生5V/0V或3.3V/0V的高低電平(也可以是其它方式,常用TTL和CMOS的電平模式),如圖3所示,每當時鐘線SCL產生高電平時,SDA所產生的電平訊號為當前時鐘週期下傳輸的有效訊號;而當SCL為低電平時,SDA可改變,以產生下一週期的傳輸訊號。
PS: 個人認為當SCL產生上升沿後,對方裝置開始檢測SDA的電平,以此作為當前傳輸的資料,而下降沿是作為SDA資訊可調整的訊號,在之後就能進行SDA的電平調整。
開始和結束條件
圖4 開始和結束電平分析
I2C匯流排在待機狀態時,SDA和SCL都處於高電平(兩根線一般情況均接上拉電阻)。
- 當開始工作時,開始訊號由主裝置(master)發起,SDA先由高電平轉為低電平,此時的SCL是高電平。此後,SDA和SCL便配合傳輸開始工作。
- 當停止工作時,在SCL處於高電平下,SDA由低電平轉為高電平。
第一個byte (7位地址+1位讀寫+1位ACK)
第一個位元組,共8位,前7位數可以大多數作為從機(slave)的地址,而某些數位是作為其他功能標誌,本文不進行深究。7位從機地址之後的是讀寫位,如果為高電平,則是從從裝置中獲取資料,反之 0 則是向從裝置寫入資料,這將會影響下一個位元組的操作。8位資料之後是一個ACK位的響應操作,主裝置會將SDA置於高電平,等待從裝置響應(由於是上拉電阻,一端置低取低),從裝置置低,主裝置就獲得響應,然後就可進行下一位元組的操作。
注意:有時採用無響應的方式,這取決於從裝置的模式,為了通訊的可靠性,建議採用有響應的方式。
Write(寫)操作(8位資料+1位ACK)
這是寫操作,ACK位均是從從裝置向主裝置傳送的。
Read(讀)操作(8位資料+1位ACK)
主裝置每次傳送8位資料完畢後,主裝置會返回一個ACK值(低電平)以響應已獲得資料。
操作例項
接下來將用IIC獲取ADS1115晶片的電壓值。
SLAVE地址
由於模組addr pin是懸空的,參考表5應該和Ground同一個地址,為SLAVE ADDRESS:1001000。
Pointer 暫存器
這個暫存器具有指向下一個暫存器的作用,類似索引,通過向該暫存器寫入不同的資料,就可指向相應的暫存器,接下來就可以對該暫存器進行操作。
以指向config暫存器操作為例:
-
對暫存器config進行寫操作
Start+地址+寫+ACK*+0000 0001+ACK*+Config_H+ACK*+Config_L+NACK*/ACK*+End -
對暫存器config進行讀操作
Start+地址+寫+ACK*+0000 0001+NACK*/ACK*+End
ReStart+地址+讀+ACK*+Config_H*+ACK+Config_L*+NACK+End
注:帶*表示從裝置向主裝置傳送。
pointer暫存器中只有BIT1、BIT0有效,指向地址見表6如下:
CONFIG 暫存器
Lo_thresh and Hi_thresh 暫存器
上下限,暫存器中的是帶符號的補碼(負數 取反加1)
預設:
補碼:8000 H~7FFF H
原碼:(-2^15)~(2^15-1)
CONVERSION暫存器
該暫存器存著轉換得到的AD值。
例如:
操作流程
- 設定 Lo_thresh 和 Hi_thresh 暫存器
對 Lo_thresh 寫操作
Start+地址+寫+ACK*+00000010+ACK*
+Lo_thresh_H+ACK*+Lo_thresh_L+NACK*/ACK*+End
對 Hi_thresh 寫操作
Start+地址+寫+ACK*+00000011+ACK*
+Hi_thresh_H+ACK*+Hi_thresh_L+NACK*/ACK*+End - 設定CONFIG 暫存器
Start+地址+寫+ACK*+0000 0001+ACK*+Config_H+ACK*+Config_L+NACK*/ACK*+End - 讀取Conversion register
Start+地址+寫+ACK*+0000 0000+NACK*/ACK*+End
ReStart+地址+讀+ACK*+Conversion_H*+ACK+Conversion_L*+NACK+End - 轉換
參考
[1] Semiconductor P. The i2c-bus specification[J]. 2000.
[2] ADS1115 datasheet
[3] wiki
相關文章
- Java知識整理Java
- Maven知識整理Maven
- 一些知識點的整理以及面試題記錄面試題
- JavaScript知識點整理JavaScript
- CSS知識點整理CSS
- [心得]UNP知識整理
- JVM 面試知識整理JVM面試
- 知識目錄整理
- kafka知識整理——部署Kafka
- MQTT知識點整理MQQT
- CANFD知識點整理
- 課堂知識整理
- RabbitMq知識整理以及在java語言下的簡單例項MQJava單例
- Flow 常用知識點整理
- 原生JS知識點整理JS
- Handler知識收集整理
- Babel基礎知識整理Babel
- Runtime知識點整理
- JAVA核心面試知識整理Java面試
- Blender入門知識整理
- JS基礎知識整理JS
- String知識點整理
- 機器學習知識點整理(三)機器學習
- jQuery面試知識點整理jQuery面試
- Java集合類知識整理Java
- JS跨域知識整理JS跨域
- 整理:iOS開發知識點iOS
- 【整理】JVM知識點大梳理JVM
- PHP 易錯知識點整理PHP
- Koa 框架常用知識點整理框架
- Python基礎知識整理Python
- Java 資料庫知識整理Java資料庫
- Web前端基礎知識整理Web前端
- MySQL 分割槽表知識整理MySql
- vue知識點整理(轉發)Vue
- Servlet基礎知識點整理Servlet
- mysql知識樹整理【4】---pymysqlMySql
- struts2知識點整理