当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]通过I2C兼容接口读取ADC数据

本应用笔记讨论了通过I2C兼容接口读取多字节数据时需要特别注意的地方。介绍了每次读取一个字节时容易出现的问题,并给出了几个具体示例。本文也描述了进行数据传输的正确方法。

概述

I²C兼容2线接口是功能强大的总线机制,用于连接微控制器或微处理器与低速外设,例如:集成了模/数转换器(ADC)的外设。基于该总线的最基本的通信方式(即,写入/读取从机寄存器的一个字节)非常直观。但是,如果因为这种方法简单而掉以轻心,则会导致严重的系统错误。

 

单字节通道传送2字节数据

任何连接外设(尤其是传感器)的数字接口,都需要确保从器件的内部寄存器正确读取数据,尤其是在读取寄存器的过程中数据发生变化的情况下。数据传输过程中,如果ADC执行转换操作并更新寄存器的内容,数据则会发生改变。许多器件带有内部缓存器(通常不能从外部访问),用来存放最新转换结果。当I²C总线处于空闲状态时,更新所谓的“用户可访问”寄存器内容。

I²C协议每次只传送1个字节的数据。因此,如果有效数据字长超过8位,并且没有合理处置传输操作,则会引发问题。比如,MAX44000环境光传感器(ALS)的数据寄存器具有多达14位的数据(另有1位作为溢出标志,表示需要增加计数/亮度设置)。

表1. MAX44000 ALS数据寄存器

REGISTER B7 B6 B5 B4 B3 B2 B1 B0 REGISTER ADDRESS
ADC High Byte (ALS)   OFL
ALSDATA[13:8]
0x04
ADC Low Byte (ALS)
ALSDATA[7:0]
0x05

我们不能通过I²C直接读取所有数据ALSDATA[13:0],需要首先读取寄存器0x04的内容,然后读取寄存器0x05的内容,再把这些数据合并到一个至少16位的寄存器内。因此,在读取这些数据时需要特别谨慎。通过两次简单的单字节读操作(利用STOP (P)条件终止)完成数据读取,如图1所示。


图1. 单字节读操作

这种方法存在致命缺陷,确切地说,向器件发送STOP条件,返回“用户可见”的寄存器内容。由此,从寄存器0x04读取数据后,实际的14位数据可能在读取0x05寄存器之前已经更新。几种情形下,这种缺陷可能导致严重错误。

例如,当MAX44000环境光传感器处于10位、12位或14位模式时,亮度处于相对稳定状态,假设亮度在小范围波动,或许亮度正在缓慢上升,或周围存在少量噪声,使得0x04和0x05寄存器的14位数据计数值为255或256,考虑表2中的三种情形。

表2. 误差图示说明

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

在后两种情形下,我们可能读到0或511,而不是读255或256,这是一个很严重的错误。发生这已错误的原因在于,第一次和第二次读操作之间,发出STOP状态后,寄存器0x04和0x05中的数据被更新。第一种出现问题情形下,第一个字节可以正确读出,但在读第二个字节时,总数为256的数据对应的最低位为零,因而,我们从器件中得到读数0;第二种出现问题的情形下,数据总计数值为256,由于在STOP状态发出后,第二个字节的数据在读取之前减少了1,所以显示为511,图2给出了多次读取数据时,这种故障的抽样情况。


图2. 多次采样时,实际读取单字节的数值

这个问题很容易通过一次读取2字节数据来避免,如图3所示。具体操作是,读取第一个数据字节后,发送REPEATED START (而不是STOP)进行操作,操作非常简单。通过读取2个字节,尽管在两个器件之间发送完全相同的位数,却可避免器件不恰当地更新I²C寄存器的内容。


图3. 2字节读操作示意图

上述示例适用于MAX44000和MAX44009,进行多次读操作时不会自动递增寄存器指针。器件功能各有差异,但工作原理相同。也可以将其很容易地扩展到N字节读取操作。应用笔记AN3588:“MAXQ2000微控制器软件I²C驱动”一文给出了几个C程序示例。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭