<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 通過(guò)I2C兼容接口讀取ADC數據

通過(guò)I2C兼容接口讀取ADC數據

作者: 時(shí)間:2011-09-02 來(lái)源:網(wǎng)絡(luò ) 收藏

本應用筆記討論了多字節時(shí)需要特別注意的地方。介紹了每次一個(gè)字節時(shí)容易出現的問(wèn)題,并給出了幾個(gè)具體示例。本文也描述了進(jìn)行傳輸的正確方法。

本文引用地址:http://dyxdggzs.com/article/150268.htm

概述

I²C2線(xiàn)是功能強大的總線(xiàn)機制,用于連接微控制器或微處理器與低速外設,例如:集成了模/數轉換器()的外設?;谠摽偩€(xiàn)的最基本的通信方式(即,寫(xiě)入/從機寄存器的一個(gè)字節)非常直觀(guān)。但是,如果因為這種方法簡(jiǎn)單而掉以輕心,則會(huì )導致嚴重的系統錯誤。

單字節通道傳送2字節

任何連接外設(尤其是傳感器)的數字,都需要確保從器件的內部寄存器正確讀取數據,尤其是在讀取寄存器的過(guò)程中數據發(fā)生變化的情況下。數據傳輸過(guò)程中,如果執行轉換操作并更新寄存器的內容,數據則會(huì )發(fā)生改變。許多器件帶有內部緩存器(通常不能從外部訪(fǎng)問(wèn)),用來(lái)存放最新轉換結果。當I²C總線(xiàn)處于空閑狀態(tài)時(shí),更新所謂的“用戶(hù)可訪(fǎng)問(wèn)”寄存器內容。

I²C協(xié)議每次只傳送1個(gè)字節的數據。因此,如果有效數據字長(cháng)超過(guò)8位,并且沒(méi)有合理處置傳輸操作,則會(huì )引發(fā)問(wèn)題。比如,MAX44000環(huán)境光傳感器(ALS)的數據寄存器具有多達14位的數據(另有1位作為溢出標志,表示需要增加計數/亮度設置)。

表1. MAX44000 ALS數據寄存器

REGISTERB7B6B5B4B3B2B1B0REGISTER ADDRESS
High Byte (ALS)OFL
ALSDATA[13:8]
0x04
ADC Low Byte (ALS)
ALSDATA[7:0]
0x05

我們不能I²C直接讀取所有數據ALSDATA[13:0],需要首先讀取寄存器0x04的內容,然后讀取寄存器0x05的內容,再把這些數據合并到一個(gè)至少16位的寄存器內。因此,在讀取這些數據時(shí)需要特別謹慎。兩次簡(jiǎn)單的單字節讀操作(利用STOP (P)條件終止)完成數據讀取,如圖1所示。

圖1. 單字節讀操作
圖1. 單字節讀操作

這種方法存在致命缺陷,確切地說(shuō),向器件發(fā)送STOP條件,返回“用戶(hù)可見(jiàn)”的寄存器內容。由此,從寄存器0x04讀取數據后,實(shí)際的14位數據可能在讀取0x05寄存器之前已經(jīng)更新。幾種情形下,這種缺陷可能導致嚴重錯誤。

例如,當MAX44000環(huán)境光傳感器處于10位、12位或14位模式時(shí),亮度處于相對穩定狀態(tài),假設亮度在小范圍波動(dòng),或許亮度正在緩慢上升,或周?chē)嬖谏倭吭肼?,使?x04和0x05寄存器的14位數據計數值為255或256,考慮表2中的三種情形。

表2. 誤差圖示說(shuō)明

State of Registers During
First Byte Read (Read 0x04 Only)
State of Registers During
Second Byte Read (Read 0x05 Only)
Result (14 Bit)
Illustration of the GlitchIllustration of the GlitchIllustration of the Glitch
Illustration of the GlitchIllustration of the GlitchIllustration of the Glitch
Illustration of the GlitchIllustration of the GlitchIllustration of the Glitch

在后兩種情形下,我們可能讀到0或511,而不是讀255或256,這是一個(gè)很?chē)乐氐腻e誤。發(fā)生這已錯誤的原因在于,第一次和第二次讀操作之間,發(fā)出STOP狀態(tài)后,寄存器0x04和0x05中的數據被更新。第一種出現問(wèn)題情形下,第一個(gè)字節可以正確讀出,但在讀第二個(gè)字節時(shí),總數為256的數據對應的最低位為零,因而,我們從器件中得到讀數0;第二種出現問(wèn)題的情形下,數據總計數值為256,由于在STOP狀態(tài)發(fā)出后,第二個(gè)字節的數據在讀取之前減少了1,所以顯示為511,圖2給出了多次讀取數據時(shí),這種故障的抽樣情況。

圖2. 多次采樣時(shí),實(shí)際讀取單字節的數值
圖2. 多次采樣時(shí),實(shí)際讀取單字節的數值

這個(gè)問(wèn)題很容易通過(guò)一次讀取2字節數據來(lái)避免,如圖3所示。具體操作是,讀取第一個(gè)數據字節后,發(fā)送REPEATED START (而不是STOP)進(jìn)行操作,操作非常簡(jiǎn)單。通過(guò)讀取2個(gè)字節,盡管在兩個(gè)器件之間發(fā)送完全相同的位數,卻可避免器件不恰當地更新I²C寄存器的內容。

圖3. 2字節讀操作示意圖
圖3. 2字節讀操作示意圖

上述示例適用于MAX44000和MAX44009,進(jìn)行多次讀操作時(shí)不會(huì )自動(dòng)遞增寄存器指針。器件功能各有差異,但工作原理相同。也可以將其很容易地擴展到N字節讀取操作。應用筆記AN3588:“MAXQ2000微控制器軟件I²C驅動(dòng)”一文給出了幾個(gè)C程序示例。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>