0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于從I2C接口上的ADC讀取數(shù)據(jù)

星星科技指導(dǎo)員 ? 來源:ADI ? 作者:ADI ? 2023-04-04 10:59 ? 次閱讀

本應(yīng)用筆記討論了通過I2C兼容接口讀取多字節(jié)數(shù)據(jù)時(shí)需要注意的問題。討論了一次讀取一個(gè)字節(jié)的陷阱,并提供了一些具體示例。本文還介紹了處理此類數(shù)據(jù)傳輸?shù)恼_方法。

介紹

I2C兼容的雙線接口是一種強(qiáng)大的機(jī)制,用于將微控制器微處理器連接到低速外設(shè),例如帶有集成模數(shù)轉(zhuǎn)換器ADC)的外設(shè)。通過該總線進(jìn)行通信的最基本形式(即一次從從站寄存器寫入/讀取單個(gè)字節(jié))非常簡(jiǎn)單。但是,為了簡(jiǎn)單起見,將自己限制在這種方法上有一些陷阱。

通過 2 字節(jié)通道傳輸 1 字節(jié)數(shù)據(jù)

與外設(shè)(尤其是傳感器)的任何其他數(shù)字接口一樣,我們需要從設(shè)備的內(nèi)部寄存器中讀取正確的數(shù)據(jù)。當(dāng)寄存器中的數(shù)據(jù)在讀取過程中發(fā)生變化時(shí),這一點(diǎn)尤其重要。如果ADC在數(shù)據(jù)傳輸時(shí)運(yùn)行轉(zhuǎn)換或更新寄存器,則數(shù)據(jù)可能會(huì)發(fā)生變化。許多設(shè)備都有一個(gè)內(nèi)部緩沖區(qū)(通常無法從外部訪問),其中包含最新的轉(zhuǎn)換結(jié)果。當(dāng)沒有I2C活動(dòng)時(shí),該器件使用新數(shù)據(jù)更新所謂的“客戶可訪問”寄存器。

I2C協(xié)議一次傳輸1字節(jié)的數(shù)據(jù)。因此,如果感興趣的數(shù)據(jù)總量超過 8 位并且傳輸處理不當(dāng),則可能會(huì)出現(xiàn)問題。例如,MAX44000的環(huán)境光傳感器(ALS)數(shù)據(jù)寄存器可以有多達(dá)14位數(shù)據(jù)(加上1位表示溢出,這意味著應(yīng)增加計(jì)數(shù)/勒克斯設(shè)置)。

注冊(cè) B7 B6 B5 B4 B3 B2 B1 B0 注冊(cè)地址
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ù)??梢院?jiǎn)單地執(zhí)行兩個(gè)由STOP(P)條件終止的單次讀取,如圖1所示。

pYYBAGQrkpSAJO48AAAWYOXbvV4777.gif

圖1.單字節(jié)讀取。

這種方法有一個(gè)致命的缺陷。具體而言,發(fā)送 STOP 條件會(huì)向設(shè)備發(fā)出信號(hào),以返回更新“客戶可見”寄存器。因此,在從寄存器0x04獲取數(shù)據(jù)后,實(shí)際上可以在讀取寄存器14x0之前更新05位數(shù)據(jù)。在某些情況下,此缺陷可能會(huì)造成災(zāi)難性后果。

例如,如果光照水平處于一定水平,MAX44000環(huán)境光傳感器處于10位、12位或14位模式。假設(shè)電平徘徊在一個(gè)區(qū)域中,因此寄存器14x0和04x0中的05位將處于255或256個(gè)總數(shù),這可能是由于緩慢增加的光或一些少量的噪聲。考慮表 2 中的三種情況。

第一個(gè)字節(jié)讀取期間
的寄存器狀態(tài)(僅限讀0x04)
第二次字節(jié)讀取期間
的寄存器狀態(tài)(僅限讀0x05)
結(jié)果(14 位)
poYBAGQrkpWAOmnaAAAEWPC33p8632.gif pYYBAGQrkpaAcREKAAAES8vwA3Y844.gif pYYBAGQrkpeAQoJVAAABziD1l-g926.gif
poYBAGQrkpiAW2W5AAAERG3-Z6g736.gif pYYBAGQrkpmAP3-kAAAEW7w9SAU568.gif poYBAGQrkpmAbGvYAAABdRoRHHc702.gif
pYYBAGQrkpqAFjt1AAAEaZ-5wto572.gif poYBAGQrkpuAKN9IAAAEMXNce0U925.gif pYYBAGQrkpuALE2IAAABrm1kqiE760.gif

在最后兩種情況下,我們不是讀取 255 或 256,而是讀取 0 或 511。這是一個(gè)巨大的問題。發(fā)生這種情況是因?yàn)榧拇嫫髦械臄?shù)據(jù)在發(fā)送 STOP 條件后,在第一次和第二次讀取之間0x04和0x05更新。在第一種有問題的情況下,第一個(gè)字節(jié)被正確讀取。但是當(dāng)讀取第二個(gè)字節(jié)時(shí),數(shù)據(jù)總共讀取了 256 個(gè)計(jì)數(shù),其中最低字節(jié)為零。因此,我們從設(shè)備中獲得了零讀數(shù)。在第二個(gè)問題情況下,數(shù)據(jù)也是總共256個(gè)計(jì)數(shù)。這似乎變成了 511 個(gè)計(jì)數(shù),因?yàn)樵诎l(fā)送 STOP 條件后但在讀取第二個(gè)字節(jié)之前,數(shù)據(jù)減少了一個(gè)計(jì)數(shù)。有關(guān)在多次讀取中發(fā)生這種情況的次數(shù)的示例,請(qǐng)參見圖 2。

poYBAGQrkpyAe_QMAAAVDNy6OyE646.gif

圖2.單字節(jié)讀取多個(gè)樣本的實(shí)際讀數(shù)。

通過一次讀取 2 個(gè)字節(jié)可以輕松避免此問題,如圖 3 所示。這是通過在讀取第一個(gè)數(shù)據(jù)字節(jié)后發(fā)送 REPEAT START 而不是 STOP 條件來完成的,并且實(shí)現(xiàn)起來相當(dāng)簡(jiǎn)單。通過讀取2個(gè)字節(jié),我們可以防止器件執(zhí)行更多的I2C寄存器更新,即使我們?cè)趦蓚€(gè)器件之間發(fā)送相同數(shù)量的位。

pYYBAGQrkp2AFYZCAAATRihzZK0787.gif

圖3.2 字節(jié)讀取的圖示。

上述示例適用于MAX44000和MAX44009,它們?cè)谶M(jìn)行多次讀取時(shí)不會(huì)自動(dòng)遞增寄存器指針。您的設(shè)備可能行為不同,但原理始終相同。這很容易擴(kuò)展到讀取 N 個(gè)字節(jié)。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2551

    文章

    51106

    瀏覽量

    753663
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120385
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6498

    瀏覽量

    544687
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HDMI信號(hào)在Type-c接口上是如何分配的?

    關(guān)于Type-c 傳輸HDMI是否有相關(guān)案例,資料提供?HDMI信號(hào)在Type-c接口上是如何分配的?
    發(fā)表于 02-29 08:28

    如何將CubeMX LSM303AH連接到I2C接口上呢?

    如何將CubeMX LSM303AH連接到I2C接口上呢?求大神告知
    發(fā)表于 12-16 06:44

    I2C總線接口模塊設(shè)計(jì)

    本實(shí)驗(yàn)是基于EasyFPGA030的I2C總線接口模塊設(shè)計(jì),用EasyFPGA030開發(fā)套件通過I2C協(xié)議實(shí)現(xiàn)對(duì)二線制I2C串行EEPROM的讀寫操作,先把
    發(fā)表于 11-02 17:01 ?41次下載

    基于ADJC702x的I2C總線接口設(shè)計(jì)

    闡明了 I2C總線 的特性,以基于ARM7TDMI 體系結(jié)構(gòu)的新型ADC702x 系列MicroConverter ADC7020 為例子,介紹了內(nèi)帶I2C
    發(fā)表于 06-07 16:56 ?24次下載
    基于ADJC702x的<b class='flag-5'>I2C</b>總線<b class='flag-5'>接口</b>設(shè)計(jì)

    通過I2C兼容接口讀取ADC數(shù)據(jù)

    本應(yīng)用筆記討論了通過I2C兼容接口讀取多字節(jié)數(shù)據(jù)時(shí)需要特別注意的地方。介紹了每次讀取一個(gè)字節(jié)時(shí)容易出現(xiàn)的問題,并給出了幾個(gè)具體示例。本文也描
    發(fā)表于 08-26 22:13 ?891次閱讀
    通過<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>

    MPU6050+I2C讀取數(shù)據(jù)+-精簡(jiǎn)版

    MPU6050+I2C讀取數(shù)據(jù)+-精簡(jiǎn)版 值得學(xué)習(xí)
    發(fā)表于 11-03 10:28 ?0次下載

    mpu6050對(duì)應(yīng)i2c地址是什么_如何讀取數(shù)據(jù)

    本文主要介紹了mpu6050對(duì)應(yīng)i2c地址是什么,并通過stm32的硬件讀取mpu6050的數(shù)據(jù)。MPU6050 的 I2C 地址是 0xD0H(11010000B)。
    發(fā)表于 12-11 16:04 ?2.5w次閱讀
    mpu6050對(duì)應(yīng)<b class='flag-5'>i2c</b>地址是什么_如何<b class='flag-5'>讀取</b><b class='flag-5'>數(shù)據(jù)</b>

    如何ADC通道讀取模擬輸入信號(hào)

    將以上草圖上傳到Uno32板上,然后MPIDE打開串行終端窗口。 ADC樣本(整數(shù)ADC輸出)以1秒的間隔打印在窗口上。您可以觀察這些數(shù)字如何隨著LDR上光線的變化而變化。如果您將手
    的頭像 發(fā)表于 12-05 16:59 ?8413次閱讀
    如何<b class='flag-5'>從</b>其<b class='flag-5'>ADC</b>通道<b class='flag-5'>讀取</b>模擬輸入信號(hào)

    LTC2481:帶Easy Drive輸入電流抵消和I2C接口的16位Delta Sigma ADC數(shù)據(jù)

    LTC2481:帶Easy Drive輸入電流抵消和I2C接口的16位Delta Sigma ADC數(shù)據(jù)
    發(fā)表于 05-24 15:29 ?162次下載
    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>表

    APM32F030C8T6_ADC_ADC Vref參考電壓數(shù)值讀取出錯(cuò)

    APM32F030C8T6_ADC_ADC Vref參考電壓數(shù)值讀取出錯(cuò)
    發(fā)表于 11-09 21:04 ?2次下載
    APM32F030<b class='flag-5'>C8T6_ADC_ADC</b> Vref參考電壓數(shù)值<b class='flag-5'>讀取</b>出錯(cuò)

    FPGA與ADC數(shù)字數(shù)據(jù)輸出的接口

    本文討論了標(biāo)準(zhǔn)接口 — SPI、I2C、SPORT、LVDS 和 JESD204A——用于將 FPGA 連接到 ADC。隨著數(shù)據(jù)速率的進(jìn)一步提高,F(xiàn)PGA與
    的頭像 發(fā)表于 12-21 10:57 ?7706次閱讀
    FPGA與<b class='flag-5'>ADC</b>數(shù)字<b class='flag-5'>數(shù)據(jù)</b>輸出的<b class='flag-5'>接口</b>

    關(guān)于I2C接口上ADC讀取數(shù)據(jù)及處理方法

    本應(yīng)用筆記討論了通過I2C兼容接口讀取多字節(jié)數(shù)據(jù)時(shí)需要注意的問題。討論了一次讀取一個(gè)字節(jié)的陷阱,
    的頭像 發(fā)表于 01-29 15:53 ?2068次閱讀
    <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>及處理方法

    I2CI3C關(guān)于功耗和傳輸速率的對(duì)比

    I2CI3C 關(guān)于功耗和傳輸速率的對(duì)比: I3C 使用推挽功能的雙線串行接口,速度可達(dá) 12.5 MHz
    的頭像 發(fā)表于 07-22 16:24 ?1899次閱讀
    <b class='flag-5'>I2C</b>和<b class='flag-5'>I3C</b><b class='flag-5'>關(guān)于</b>功耗和傳輸速率的對(duì)比

    什么是I3C接口 I3C和SPI接口有什么區(qū)別

    I3C接口使用兩根通信線,一根是數(shù)據(jù)線(SDL),另一根是時(shí)鐘線(SCL)。與I2C總線一樣,I3C接口
    的頭像 發(fā)表于 03-05 16:50 ?2865次閱讀
    什么是<b class='flag-5'>I3C</b><b class='flag-5'>接口</b> <b class='flag-5'>I3C</b>和SPI<b class='flag-5'>接口</b>有什么區(qū)別

    TLA2528小型8通道12位ADC,具有I2C接口GPIO數(shù)據(jù)

    電子發(fā)燒友網(wǎng)站提供《TLA2528小型8通道12位ADC,具有I2C接口GPIO數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-26 11:17 ?0次下載
    TLA2528小型8通道12位<b class='flag-5'>ADC</b>,具有<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>GPIO<b class='flag-5'>數(shù)據(jù)</b>表