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

  • 微控制器
    +关注

    关注

    47

    文章

    5497

    浏览量

    146095
  • 寄存器
    +关注

    关注

    30

    文章

    3754

    浏览量

    115606
  • 模数转换器
    +关注

    关注

    25

    文章

    1886

    浏览量

    124357
  • 时钟系统
    +关注

    关注

    1

    文章

    46

    浏览量

    10987
收藏 人收藏

    评论

    相关推荐

    如何修改UDP读取的最大字节数

    读取的最大字节数只能为548,但是我写的网络是可以传输多字节数的,请问怎样才能修改该VI的最大字节接收数呢,就像TCP那样,每帧能接收1500字节左右
    发表于 05-30 09:16

    verilog 中多字节 的232 串口 数据传输问题

    字节数据后一直没有返回。各位大哥能不能看下程序哪里的问题这个是232 接受的程序module my_uart_rx(clk,rst_n,rs232_rx,clk_bps,bps_start,rx_data
    发表于 07-04 22:04

    关于TCP数据传输的问题

    数据,在读取TCP数据函数的读取字节设置了传输字节,我设置为500多万但数据传上来最多才接受了1024个字节,这个是最大接收字节数吗?如果要接收大量数据该怎么解决,求大神帮忙。
    发表于 12-12 14:18

    请问有单片机串口多字节数据发送的源程序吗?

    多字节数据,并且上位机在发送数据的时候,以Enter键结束发送。
    发表于 02-28 01:12

    OD2101 IIC转UART芯片收数据,只能读取到64字节数据

    字节数据(od2101缓冲区最多只能缓存64字节数据),I2C从这个芯片却只能读取到64字节数据,有什么办法能够读到100
    发表于 03-05 19:56

    DSP28035的485通信如何发送和接收多字节数据

    多字节数据?有没有用过的大神?如果有例程万分感谢
    发表于 05-15 10:01

    USART数据传输模型怎么理解

    传输数据。与逐字节数据传输模型不同,读/写数据模型可以处理数据块;c)使用缓冲队列传输模型——允许客户端对数据传输进行队列处理。考虑到前面提到的每个模型的最佳应用是什么?在第一种方法中,我尝试使用第一个
    发表于 04-23 13:56

    USB虚拟串口如何实现多字节数据接收?

    多字节数据接收?
    发表于 12-07 07:39

    HT56R678使用I2C进行数据传输方法

    I2C进行数据传输方法 HT56R678 内建有SIM 功能,其中包括了SPI 和
    发表于 03-27 09:25 16次下载

    单片机串口接收多字节数据

    发表于 11-17 09:51 40次下载
    单片机串口接收<b>多字节数据</b>

    通过I2C兼容接口读取ADC数据

    I2C兼容接口读取多字节数据时需要特别注意的地方。介绍了每次读取一个字节时容易出现的问题,并给出了几个具体示例。本文也描述了进行数据传输的正确
    发表于 08-26 22:13 771次阅读
    通过<b>I2C</b><b>兼容</b><b>接口</b><b>读取</b>ADC<b>数据</b>

    关于从I²C接口上的ADC读取数据及处理方法

    I²C兼容接口读取多字节数据时需要注意的问题。讨论了一次读取一个字节的陷阱,并提供了一些具体示例。本文还介绍了处理此类数据传输的正确方法
    的头像 发表于 01-29 15:53 542次阅读
    关于从<b>I</b>²<b>C</b><b>接口</b>上的ADC<b>读取</b><b>数据</b>及处理<b>方法</b>

    关于从I²C接口上的ADC读取数据

    I²C兼容接口读取多字节数据时需要注意的问题。讨论了一次读取一个字节的陷阱,并提供了一些具体示例。本文还介绍了处理此类数据传输
    的头像 发表于 04-04 10:59 197次阅读
    关于从<b>I</b>²<b>C</b><b>接口</b>上的ADC<b>读取</b><b>数据</b>

    下载硬声App