本應(yīng)用筆記討論了通過I2C兼容接口讀取多字節(jié)數(shù)據(jù)時需要注意的問題。討論了一次讀取一個字節(jié)的陷阱,并提供了一些具體示例。本文還介紹了處理此類數(shù)據(jù)傳輸?shù)恼_方法。
介紹
I2C兼容的雙線接口是一種強大的機制,用于將微控制器或微處理器連接到低速外設(shè),例如帶有集成模數(shù)轉(zhuǎn)換器(ADC)的外設(shè)。通過該總線進行通信的最基本形式(即一次從從站寄存器寫入/讀取單個字節(jié))非常簡單。但是,為了簡單起見,將自己限制在這種方法上有一些陷阱。
通過 1 字節(jié)通道傳輸 2 字節(jié)數(shù)據(jù)
與外設(shè)(尤其是傳感器)的任何其他數(shù)字接口一樣,我們需要從設(shè)備的內(nèi)部寄存器中讀取正確的數(shù)據(jù)。當(dāng)寄存器中的數(shù)據(jù)在讀取過程中發(fā)生變化時,這一點尤其重要。如果ADC在數(shù)據(jù)傳輸時運行轉(zhuǎn)換或更新寄存器,則數(shù)據(jù)可能會發(fā)生變化。許多設(shè)備都有一個內(nèi)部緩沖區(qū)(通常無法從外部訪問),其中包含最新的轉(zhuǎn)換結(jié)果。當(dāng)沒有I2C活動時,該器件使用新數(shù)據(jù)更新所謂的“客戶可訪問”寄存器。
I2C協(xié)議一次傳輸1字節(jié)的數(shù)據(jù)。因此,如果感興趣的數(shù)據(jù)總量超過 8 位并且傳輸處理不當(dāng),則可能會出現(xiàn)問題。例如,MAX44000的環(huán)境光傳感器(ALS)數(shù)據(jù)寄存器可以有多達14位數(shù)據(jù)(加上1位表示溢出,這意味著應(yīng)增加計數(shù)/勒克斯設(shè)置)。
表 1.MAX44000 ALS數(shù)據(jù)寄存器
注冊 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | 注冊地址 |
ADC 高字節(jié) (ALS) | 奧福 | 數(shù)據(jù)[13:8] | 0x04 | ||||||
模數(shù)轉(zhuǎn)換器低字節(jié) (ALS) | 數(shù)據(jù)[7:0] | 0x05 |
我們無法通過I2C直接讀取所有ALSDATA[13:0],因此我們必須首先讀取寄存器0x04的內(nèi)容,然后讀取寄存器0x05的內(nèi)容,并在至少16位寄存器中連接數(shù)據(jù)。但是,我們必須注意如何讀取這些數(shù)據(jù)??梢院唵蔚貓?zhí)行兩個由STOP(P)條件終止的單次讀取,如圖1所示。
圖1.單字節(jié)讀取。
這種方法有一個致命的缺陷。具體而言,發(fā)送 STOP 條件會向設(shè)備發(fā)出信號,以返回更新“客戶可見”寄存器。因此,在從寄存器0x04獲取數(shù)據(jù)后,實際上可以在讀取寄存器0x05之前更新14位數(shù)據(jù)。在某些情況下,此缺陷可能會造成災(zāi)難性后果。
例如,如果光照水平處于一定水平,MAX44000環(huán)境光傳感器處于10位、12位或14位模式。假設(shè)電平徘徊在一個區(qū)域中,因此寄存器0x04和0x05中的14位將處于255或256個總數(shù),這可能是由于緩慢增加的光或一些少量的噪聲??紤]表 2 中的三種情況。
表 2.故障圖示
在最后兩種情況下,我們不是讀取 255 或 256,而是讀取 0 或 511。這是一個巨大的問題。發(fā)生這種情況是因為寄存器中的數(shù)據(jù)在發(fā)送 STOP 條件后,在第一次和第二次讀取之間0x04和0x05更新。在第一種有問題的情況下,第一個字節(jié)被正確讀取。但是當(dāng)讀取第二個字節(jié)時,數(shù)據(jù)總共讀取了 256 個計數(shù),其中最低字節(jié)為零。因此,我們從設(shè)備中獲得了零讀數(shù)。在第二個問題情況下,數(shù)據(jù)也是總共256個計數(shù)。這似乎變成了 511 個計數(shù),因為在發(fā)送 STOP 條件后但在讀取第二個字節(jié)之前,數(shù)據(jù)減少了一個計數(shù)。有關(guān)在多次讀取中發(fā)生這種情況的次數(shù)的示例,請參見圖 2。
圖2.單字節(jié)讀取多個樣本的實際讀數(shù)。
通過一次讀取 2 個字節(jié)可以輕松避免此問題,如圖 3 所示。這是通過在讀取第一個數(shù)據(jù)字節(jié)后發(fā)送 REPEAT START 而不是 STOP 條件來完成的,并且實現(xiàn)起來相當(dāng)簡單。通過讀取2個字節(jié),我們可以防止器件執(zhí)行更多的I2C寄存器更新,即使我們在兩個器件之間發(fā)送相同數(shù)量的位。
圖3.2 字節(jié)讀取的圖示。
上述示例適用于MAX44000和MAX44009,它們在進行多次讀取時不會自動遞增寄存器指針。您的設(shè)備可能行為不同,但原理始終相同。這很容易擴展到讀取 N 個字節(jié)。
審核編輯:郭婷
-
傳感器
+關(guān)注
關(guān)注
2553文章
51470瀏覽量
756994 -
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121304 -
adc
+關(guān)注
關(guān)注
99文章
6537瀏覽量
545901
發(fā)布評論請先 登錄
相關(guān)推薦
HDMI信號在Type-c接口上是如何分配的?
從9位1.2 GSPS DDR并行LVDS輸出ADC連續(xù)讀取數(shù)據(jù)的最佳方法是什么
I2C總線接口模塊設(shè)計
基于ADJC702x的I2C總線接口設(shè)計
![基于ADJC702x的<b class='flag-5'>I2C</b>總線<b class='flag-5'>接口</b>設(shè)計](https://file.elecfans.com/web2/M00/48/F8/pYYBAGKhtDCABvUiAAALvQZA24w648.jpg)
通過I2C兼容接口讀取ADC數(shù)據(jù)
![通過<b class='flag-5'>I2C</b>兼容<b class='flag-5'>接口</b><b class='flag-5'>讀取</b><b class='flag-5'>ADC</b><b class='flag-5'>數(shù)據(jù)</b>](https://file1.elecfans.com//web2/M00/A5/FA/wKgZomUMOxeAcf_kAAAFgBhWRm8923.gif)
I2C設(shè)備控制方法的實現(xiàn)
![<b class='flag-5'>I2C</b>設(shè)備控制<b class='flag-5'>方法</b>的實現(xiàn)](https://file1.elecfans.com//web2/M00/A6/22/wKgZomUMO-WAHejDAAARC3DO2ZA169.jpg)
如何將各種串行ADC連接到DSP(TMS320C50)的標(biāo)準串口上的方法
![如何將各種串行<b class='flag-5'>ADC</b>連接到DSP(TMS320<b class='flag-5'>C</b>50)的標(biāo)準串<b class='flag-5'>口上</b>的<b class='flag-5'>方法</b>](https://file.elecfans.com/web1/M00/51/54/o4YBAFsGYVeAUJzBAABgbDJ7Ijc038.png)
LTC2481:帶Easy Drive輸入電流抵消和I2C接口的16位Delta Sigma ADC數(shù)據(jù)表
![LTC2481:帶Easy Drive輸入電流抵消和<b class='flag-5'>I</b>2<b class='flag-5'>C</b><b class='flag-5'>接口</b>的16位Delta Sigma <b class='flag-5'>ADC</b><b class='flag-5'>數(shù)據(jù)</b>表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
EE-204:用于配置I2C?從設(shè)備的Blackfin?處理器SCCB軟件接口
![EE-204:用于配置<b class='flag-5'>I2C</b>?<b class='flag-5'>從</b>設(shè)備的Blackfin?<b class='flag-5'>處理</b>器SCCB軟件<b class='flag-5'>接口</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
FPGA與ADC數(shù)字數(shù)據(jù)輸出的接口
![FPGA與<b class='flag-5'>ADC</b>數(shù)字<b class='flag-5'>數(shù)據(jù)</b>輸出的<b class='flag-5'>接口</b>](https://file.elecfans.com//web2/M00/85/8A/pYYBAGOidhyAHKUtAAAqhui9VlY633.jpg)
關(guān)于從I2C接口上的ADC讀取數(shù)據(jù)
![<b class='flag-5'>關(guān)于</b><b class='flag-5'>從</b><b class='flag-5'>I</b>2<b class='flag-5'>C</b><b class='flag-5'>接口上</b>的<b class='flag-5'>ADC</b><b class='flag-5'>讀取</b><b class='flag-5'>數(shù)據(jù)</b>](https://file.elecfans.com//web2/M00/9D/18/pYYBAGQrkpSAJO48AAAWYOXbvV4777.gif)
EE-204:Blackfin處理器SCCB軟件接口,用于配置I2C從器件
![EE-204:Blackfin<b class='flag-5'>處理</b>器SCCB軟件<b class='flag-5'>接口</b>,用于配置<b class='flag-5'>I2C</b><b class='flag-5'>從</b>器件](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論