本應(yīng)用筆記討論了通過(guò)I2C兼容接口讀取多字節(jié)數(shù)據(jù)時(shí)的注意事項(xiàng)。討論了一次讀取一個(gè)字節(jié)的陷阱,并給出了一些具體示例。本文還介紹了處理此類數(shù)據(jù)傳輸?shù)恼_方法。**
I2C是嵌入式系統(tǒng)中使用的串行數(shù)據(jù)傳輸協(xié)議之一。它用于將低速外圍設(shè)備連接到嵌入式微處理器。它還用于中低數(shù)據(jù)速率通信。EPROM,實(shí)時(shí)時(shí)鐘系統(tǒng)存儲(chǔ)設(shè)備,遠(yuǎn)程溫度傳感器和I / O端口擴(kuò)展器是慢速外圍設(shè)備的一些示例。
兼容I2C的兩線式接口是一種強(qiáng)大的機(jī)制,可用于將微控制器或微處理器與低速外圍設(shè)備接口,例如具有集成模數(shù)轉(zhuǎn)換器(ADC)的外圍設(shè)備。通過(guò)該總線進(jìn)行通信的最基本形式(即一次向/從從寄存器寫入/讀取單個(gè)字節(jié))非常簡(jiǎn)單。但是,為簡(jiǎn)單起見,將自己限制在這種方法上存在一些陷阱。
通過(guò)1字節(jié)通道傳輸2字節(jié)數(shù)據(jù)
與其他任何與外圍設(shè)備(尤其是傳感器)的數(shù)字接口一樣,我們需要從設(shè)備的內(nèi)部寄存器中讀取正確的數(shù)據(jù)。當(dāng)寄存器的數(shù)據(jù)在讀取過(guò)程中發(fā)生變化時(shí),這一點(diǎn)尤其重要。如果在數(shù)據(jù)傳輸時(shí)ADC運(yùn)行其轉(zhuǎn)換或更新寄存器,則數(shù)據(jù)可能會(huì)發(fā)生變化。許多設(shè)備具有內(nèi)部緩沖區(qū)(通常不能從外部訪問(wèn)),該緩沖區(qū)包含轉(zhuǎn)換的最新結(jié)果。當(dāng)沒有I2C活動(dòng)時(shí),設(shè)備使用新數(shù)據(jù)更新所謂的“客戶可訪問(wèn)”寄存器。
I2C協(xié)議一次傳輸1個(gè)字節(jié)的數(shù)據(jù)。因此,如果感興趣的總量數(shù)據(jù)長(zhǎng)于8位并且傳輸處理不正確,則可能會(huì)出現(xiàn)問(wèn)題。例如,MAX44000的環(huán)境光傳感器(ALS)數(shù)據(jù)寄存器最多可包含14位數(shù)據(jù)(加上1位表示溢出,這意味著應(yīng)增加計(jì)數(shù)/照度設(shè)置)。
我們無(wú)法直接通過(guò)I2C讀取所有ALSDATA [13:0],因此我們必須首先讀取寄存器0x04的內(nèi)容,然后讀取寄存器0x05的內(nèi)容,并將數(shù)據(jù)連接到至少一個(gè)16位寄存器中。但是,我們必須注意如何讀取此數(shù)據(jù)。可以簡(jiǎn)單地執(zhí)行兩個(gè)以STOP(P)條件終止的單次讀取,如圖1所示。

這種方法有一個(gè)致命的缺陷。具體來(lái)說(shuō),發(fā)送STOP條件會(huì)向器件發(fā)出信號(hào),要求其返回以更新“客戶可見”寄存器。因此,從寄存器0x04獲取數(shù)據(jù)后,實(shí)際上14位數(shù)據(jù)可以在讀取寄存器0x05之前進(jìn)行更新。在某些情況下,此缺陷可能會(huì)造成災(zāi)難性的后果。
一個(gè)例子是,如果光照水平在一定水平,MAX44000環(huán)境光傳感器處于10位,12位或14位模式。假設(shè)電平徘徊在某個(gè)區(qū)域內(nèi),則寄存器0x04和0x05中的14位計(jì)數(shù)總計(jì)為255或256,這可能是由于光線緩慢增加或少量噪聲引起的??紤]圖2所示表中的三種情況。

單字節(jié)讀取。
在最后兩種情況下,我們讀取0或511,而不是讀取255或256。這是一個(gè)很大的問(wèn)題。發(fā)生這種情況的原因是在發(fā)送STOP條件之后,在第一次讀取和第二次讀取之間更新了寄存器0x04和0x05中的數(shù)據(jù)。在第一種有問(wèn)題的情況下,正確讀取了第一個(gè)字節(jié)。但是到讀取第二個(gè)字節(jié)時(shí),數(shù)據(jù)讀取的總數(shù)為256,其中最低字節(jié)為零。因此,我們從該設(shè)備獲得零讀數(shù)。在第二個(gè)有問(wèn)題的情況下,數(shù)據(jù)也總計(jì)為256個(gè)計(jì)數(shù)。由于在發(fā)送STOP條件之后但在讀取第二個(gè)字節(jié)之前數(shù)據(jù)減少了一個(gè)計(jì)數(shù),因此該計(jì)數(shù)似乎變?yōu)?11個(gè)計(jì)數(shù)。有關(guān)在多次讀取中發(fā)生這種情況的次數(shù)的示例,請(qǐng)參見圖3。

單字節(jié)的實(shí)際讀數(shù)可讀取許多樣本。
如圖4所示,通過(guò)一次讀取2個(gè)字節(jié)可以輕松避免此問(wèn)題,這是通過(guò)在讀取第一個(gè)數(shù)據(jù)字節(jié)之后發(fā)送REPEATED START而不是STOP條件來(lái)完成的,并且非常容易實(shí)現(xiàn)。通過(guò)讀取2個(gè)字節(jié),即使我們?cè)趦蓚€(gè)器件之間總體上發(fā)送了相同數(shù)量的位,也阻止了該部分執(zhí)行更多的I2C寄存器更新。

2字節(jié)讀取的插圖。
上面的例子適用于MAX44000和MAX44009,它們?cè)谶M(jìn)行多次讀取時(shí)不會(huì)自動(dòng)遞增寄存器指針。您的設(shè)備的行為可能有所不同,但是原理始終相同。這很容易擴(kuò)展為讀取N個(gè)字節(jié)。
編輯:hfy
-
微控制器
+關(guān)注
關(guān)注
49文章
8890瀏覽量
165909 -
寄存器
+關(guān)注
關(guān)注
31文章
5622瀏覽量
130483 -
模數(shù)轉(zhuǎn)換器
+關(guān)注
關(guān)注
26文章
4107瀏覽量
130285 -
時(shí)鐘系統(tǒng)
+關(guān)注
關(guān)注
1文章
135瀏覽量
13033
發(fā)布評(píng)論請(qǐng)先 登錄
RDMA設(shè)計(jì)64:數(shù)據(jù)吞吐量性能測(cè)試分析
量水堰計(jì)是如何實(shí)現(xiàn)數(shù)據(jù)傳輸和遠(yuǎn)程監(jiān)控的?
天碩(TOPSSD)技術(shù)深解:TBW(總寫入字節(jié)數(shù))的工程實(shí)現(xiàn)
I2C的總線協(xié)議
CW32單片機(jī)I2C接口來(lái)讀寫EEPROM芯片
使用fal api 來(lái)讀寫1024 字節(jié)數(shù)據(jù),需要需要考慮被高優(yōu)先級(jí)線程打斷嗎?
為什么rt_device_read()只能讀取到兩個(gè)字節(jié)數(shù)據(jù)?
嵌入式接口通識(shí)知識(shí)之I2C接口
基于FPGA的USB數(shù)據(jù)傳輸
數(shù)據(jù)傳輸卡頓?工控一體機(jī)接口兼容性問(wèn)題與線纜選型聚徽全解析
Android14在BLE中,當(dāng)MTU超過(guò) 517時(shí),如何處理數(shù)據(jù)傳輸?
淺談I2C兼容接口讀取多字節(jié)數(shù)據(jù)時(shí)數(shù)據(jù)傳輸方法
評(píng)論