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

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

    关注

    49

    文章

    8862

    浏览量

    165660
  • 寄存器
    +关注

    关注

    31

    文章

    5619

    浏览量

    130399
  • 模数转换器
    +关注

    关注

    26

    文章

    4104

    浏览量

    130258
  • 时钟系统
    +关注

    关注

    1

    文章

    133

    浏览量

    13012
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    量水堰计是如何实现数据传输和远程监控的?

    现代磁致式量水堰计依托成熟的物联网技术,已能够实现高效可靠的数据传输与远程监控。其核心架构通常分为现场数据采集、数据传输与云端管理三个层面,共同构成完整的远程监测系统。在数据采集端,量
    的头像 发表于 04-17 14:29 101次阅读
    量水堰计是如何实现<b class='flag-5'>数据传输</b>和远程监控的?

    天硕(TOPSSD)技术深解:TBW(总写入字节数)的工程实现

    在评估工业嵌入式存储设备能否胜任长达数年的持续运行任务时,TBW(总写入字节数)是比接口速度更为关键的量化指标。它直接回答了“这块硬盘在退役前,总共能安全写入多少数据?”这一根本问题。对于轨道交通日志记录、工业视频流存储等高写入
    的头像 发表于 02-10 14:49 288次阅读
    天硕(TOPSSD)技术深解:TBW(总写入<b class='flag-5'>字节数</b>)的工程实现

    I2C的总线协议

    决定数据通信的发端和收端,发端每发送 1 个字节数据,收端必须回应 1 个 ACK 应答信号。数据传输完成后,主机发送 STOP 信号结束本次通信。
    发表于 12-15 08:07

    CW32单片机I2C接口来读写EEPROM芯片

    。此后根据主机发送的第 1 字 节的 W/R 位来决定数据通信的发端和收端,发端每发送 1个字节数据,收端必须回应 1个ACK 应答信号。数据传输完成后,主机发送 STOP 信号结束本次通信。 2.
    发表于 12-09 07:43

    多通道数据传输终端 LoRa/LTE双模通信终端

    数据传输
    稳控自动化
    发布于 :2025年10月24日 13:57:21

    使用fal api 来读写1024 字节数据,需要需要考虑被高优先级线程打断吗?

    使用fal api 来读写1024 字节数据,需要需要考虑被高优先级线程打断吗?
    发表于 10-10 07:16

    为什么rt_device_read()只能读取到两个字节数据

    已经确定了设备每次会发送9字节数据,但是每次都只能读取到两字节数据,而且串口的配置都没问题 /* 接收数据回调函数 */ static rt_err_t uart_rx_ind
    发表于 09-17 06:24

    嵌入式接口通识知识之I2C接口

    时候SDA数据线才允许高电平或者低电平变化。每传送一个数据位产生一个时钟。在数据传输时,SDA线上面的每个字节数据长度必须是8位。每次传输
    发表于 08-14 14:46

    基于FPGA的USB数据传输

    你也许会有疑问,明明有这么多通信方式和数据传输(SPI、I2C、UART、以太网)为什么偏偏使用USB呢?
    的头像 发表于 08-06 14:47 5065次阅读
    基于FPGA的USB<b class='flag-5'>数据传输</b>

    数据传输卡顿?工控一体机接口兼容性问题与线缆选型聚徽全解析

    在工业自动化领域,工控一体机承担着数据采集、处理与传输的重要任务,其数据传输的流畅性直接关系到生产系统的稳定性与效率。然而,数据传输卡顿的现象却时常出现,这背后,
    的头像 发表于 07-02 10:30 1183次阅读

    Android14在BLE中,当MTU超过 517时,如何处理数据传输

    /behavior-changes-all#mtu-set-to-517 我们在应用更改后进行了测试,但遇到了无法传输超过 512 字节数据的问题。 由于客户的工作数据通常超过 512
    发表于 07-01 06:56

    像这样一款体积小巧的DTU数据传输终端你见过吗?

    数据传输
    才茂通信
    发布于 :2025年06月04日 14:33:29

    SPI数据传输缓慢问题求解

    我遇到了 SPI 数据传输速率问题。 尽管将 SPI 时钟频率设置为 20 MHz,但我只获得了 2 Kbps 的数据传输速率。 我正在以 115200 的波特率通过 UART 监控数据。 我正在 cyfxusbspidmamo
    发表于 05-15 08:29

    使用CyU3PDmaChannelCommitBuffer提交超过1024字节数据时usb包异常大怎么解决?

    你好,我正在尝试使用fx3实现USB3Vision设备,但是当我使用CyU3PDmaChannelCommitBuffer函数提交超过1024字节数据时,主机获取到的USB数据包变得非常大
    发表于 05-13 06:11

    【RA-Eco-RA4M2开发板评测】I2C读取EEPROM(一)

    限制。当主机希望停止接收数据时,就向从机返回一个非应答信号,则从机自动停止数据传输。 2 RA4M2 的I2C架构及特性 瑞萨 RA4M2有两个I2C通道,
    发表于 04-28 23:13