0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈I²C兼容接口读取多字节数据时数据传输方法

电子设计 来源:eeweb 作者:Maxim 2021-04-21 13:46 次阅读

本应用笔记讨论了通过I²C兼容接口读取多字节数据时的注意事项。讨论了一次读取一个字节的陷阱,并给出了一些具体示例。本文还介绍了处理此类数据传输的正确方法。**

I2C嵌入式系统中使用的串行数据传输协议之一。它用于将低速外围设备连接到嵌入式微处理器。它还用于中低数据速率通信。EPROM实时时钟系统存储设备,远程温度传感器和I / O端口扩展器是慢速外围设备的一些示例。

兼容I²C的两线式接口是一种强大的机制,可用于将微控制器或微处理器与低速外围设备接口,例如具有集成模数转换器ADC)的外围设备。通过该总线进行通信的最基本形式(即一次向/从从寄存器写入/读取单个字节)非常简单。但是,为简单起见,将自己限制在这种方法上存在一些陷阱。

通过1字节通道传输2字节数据

与其他任何与外围设备(尤其是传感器)的数字接口一样,我们需要从设备的内部寄存器中读取正确的数据。当寄存器的数据在读取过程中发生变化时,这一点尤其重要。如果在数据传输时ADC运行其转换或更新寄存器,则数据可能会发生变化。许多设备具有内部缓冲区(通常不能从外部访问),该缓冲区包含转换的最新结果。当没有I²C活动时,设备使用新数据更新所谓的“客户可访问”寄存器。

I²C协议一次传输1个字节的数据。因此,如果感兴趣的总量数据长于8位并且传输处理不正确,则可能会出现问题。例如,MAX44000的环境光传感器(ALS)数据寄存器最多可包含14位数据(加上1位表示溢出,这意味着应增加计数/照度设置)。

我们无法直接通过I²C读取所有ALSDATA [13:0],因此我们必须首先读取寄存器0x04的内容,然后读取寄存器0x05的内容,并将数据连接到至少一个16位寄存器中。但是,我们必须注意如何读取此数据。可以简单地执行两个以STOP(P)条件终止的单次读取,如图1所示。

pIYBAGB_u9aAex7SAAAdMdS59uw910.png

这种方法有一个致命的缺陷。具体来说,发送STOP条件会向器件发出信号,要求其返回以更新“客户可见”寄存器。因此,从寄存器0x04获取数据后,实际上14位数据可以在读取寄存器0x05之前进行更新。在某些情况下,此缺陷可能会造成灾难性的后果。

一个例子是,如果光照水平在一定水平,MAX44000环境光传感器处于10位,12位或14位模式。假设电平徘徊在某个区域内,则寄存器0x04和0x05中的14位计数总计为255或256,这可能是由于光线缓慢增加或少量噪声引起的。考虑图2所示表中的三种情况。

o4YBAGB_u-KAberfAABWLVjuLOg334.png

单字节读取。

在最后两种情况下,我们读取0或511,而不是读取255或256。这是一个很大的问题。发生这种情况的原因是在发送STOP条件之后,在第一次读取和第二次读取之间更新了寄存器0x04和0x05中的数据。在第一种有问题的情况下,正确读取了第一个字节。但是到读取第二个字节时,数据读取的总数为256,其中最低字节为零。因此,我们从该设备获得零读数。在第二个有问题的情况下,数据也总计为256个计数。由于在发送STOP条件之后但在读取第二个字节之前数据减少了一个计数,因此该计数似乎变为511个计数。有关在多次读取中发生这种情况的次数的示例,请参见图3。

pIYBAGB_u_GAfbomAAAe7_MfcV4018.png

单字节的实际读数可读取许多样本。

如图4所示,通过一次读取2个字节可以轻松避免此问题,这是通过在读取第一个数据字节之后发送REPEATED START而不是STOP条件来完成的,并且非常容易实现。通过读取2个字节,即使我们在两个器件之间总体上发送了相同数量的位,也阻止了该部分执行更多的I²C寄存器更新。

o4YBAGB_u_6AbDSJAAAUjZ-GVh8882.png

2字节读取的插图。

上面的例子适用于MAX44000和MAX44009,它们在进行多次读取时不会自动递增寄存器指针。您的设备的行为可能有所不同,但是原理始终相同。这很容易扩展为读取N个字节。

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6786

    浏览量

    147562
  • 寄存器
    +关注

    关注

    30

    文章

    5020

    浏览量

    117619
  • 模数转换器
    +关注

    关注

    25

    文章

    2296

    浏览量

    125908
  • 时钟系统
    +关注

    关注

    1

    文章

    82

    浏览量

    11380
收藏 人收藏

    评论

    相关推荐

    串口数据传输共用体与结构体之间的转换技巧

    如果我们从串口接收到4个字节数据{0x43,0x67,0x80,0x00},如何把这4个字节数据转换为float型呢?
    的头像 发表于 03-22 12:28 304次阅读
    串口<b class='flag-5'>数据传输</b>共用体与结构体之间的转换技巧

    can总线的数据帧中数据长度码和数据字节数的关系?

    can总线的数据帧中数据长度码和数据字节数的关系? CAN总线是一种常用于数据通信的协议,它使用数据帧来
    的头像 发表于 01-31 11:31 404次阅读

    使用ADXL345的FIFO采集数据,读上来的数据不正确怎么解决?

    是正确的,后面的数据都基本为0x00。 我使用的是4线SPI协议,读取算法如下,请指教。 1、ADXL345片选设为0 2、发送0xF2,多字节读取+data0地址 3、
    发表于 12-25 08:28

    AXI数据传输读写数据结构

    )等问题。 (1)窄位宽数据传输 当本次传输数据位宽小于通道本身的数据位宽时,称为窄位宽数据传输,或者直接翻译成窄
    的头像 发表于 10-31 16:17 614次阅读
    AXI<b class='flag-5'>数据传输</b>读写<b class='flag-5'>数据</b>结构

    K210使用串口发送字节数据该怎么组装?

    求教,K210使用串口发送字节数据该怎么组装
    发表于 09-13 07:57

    如何控制USB HID连接到EEPROM设备上来控制NUC240的I2C数据传输

    控制NUC240的I2C数据传输。 您可以在下列时间下载样本代码http://www.nuvoton.com/resources-downlo. 1227151637。 nuvoton 核
    发表于 08-30 06:47

     什么叫传输速率 串口传输速率范围是多少

    对于数字数据传输传输速率表示每秒钟传输的比特数或字节数。例如,一个传输速率为1 Mbps的网络连接,表示每秒钟可以
    的头像 发表于 08-24 15:21 6140次阅读

    如何将USB HID连接到EEPROM设备控制NUC240的I2C数据传输

    控制NUC240的I2C数据传输。 您可以在下列时间下载样本代码http://www.nuvoton.com/resources-downlo. 1227151637。 nuvoton 核
    发表于 08-22 08:08

    基于 FPGA 的模拟 I2C协议系统设计

    中。 9)位传输控制模块 位传输控制模块以位为单位进行 I2C 总线的数据传输和产生各个 I2C 协议命令(如开始、停止、重复开始等)。
    发表于 08-14 18:21

    ST25DV04无法读取后256个字节数据的问题

    当前正在开发安卓APP,碰到无法读取后256个字节数据的问题, 手机端发送命令如下 0x02, 0x23, 0x40, 0x7fST25DV04回复 0x01,0x0f可以看到是读取失败了,请问一下应该如何
    发表于 08-07 15:08

    SPI数据传输有哪些方式

    SPI 数据传输可以有两种方式:同步方式和异步方式。 同步方式:数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到
    的头像 发表于 07-25 10:54 3263次阅读
    SPI<b class='flag-5'>数据传输</b>有哪些方式

    I2C数据传输的三个主要API

    I2C Data Transfer I2C 数据传输主要有三个 API int i2c_master_send(const struct i2c_client *client,const char
    的头像 发表于 07-22 15:04 793次阅读
    I2C<b class='flag-5'>数据传输</b>的三个主要API

    EIM和内存问题之间的SDMA传输传输完后查看rbuf中的数据读取数据错误的原因?

    32字节数据有一个间隔。 不管我配置burst length为4/8/16/32 words,都是间隔erery 32-byte传输。对于我的配置,32字节是16个字(DSZ=001,1个字是2个
    发表于 05-29 06:00

    DMA进行数据传输和CPU进行数据传输的疑问

    求大佬解答,本人正在学习STM32单片机中DMA直接数据存储部分的内容 看了DMA简介后,也上手过实例代码,但是没有实际的项目经验,所以有以下疑问: DMA外设在进行数据传输的操作,是否也是需要经过
    发表于 05-25 17:18

    如何测量ESP8266的数据传输速度?

    AP 的问候”。 现在我想测量数据从 AP 传输到客户端的数据传输速率/速度(不是波特率)。请注意,我使用的是 AT 命令来配置模块,我不是在谈论波特率。 有什么方法可以测量从一个模
    发表于 05-22 06:38