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

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

3天内不再提示

I2C通信没反应怎么办?

硬件工程师炼成之路 来源:德州仪器 2023-05-04 11:30 次阅读

硬件我们经常会遇到各种各样的问题,一些通信接口也会出现,I2C自然也不例外。假如遇到I2C没反应,那么可能会出现这种情况:“软件工程师说,我软件都已经配好了,但是就是读写不到数据,是不是硬件有问题”。

这个时候,就需要我们了解I2C的通信时序,我们可以通过示波器抓取通信的波形,看是否满足通信时序要求,主机有没有发送数据?I2C通信地址对不对?如果主机有发送数据,从机是否有正常应答?通信信号质量是否OK?如此这般,一般是能够查到问题在哪里的。

基于上面的问题,这会要求我们掌握I2C的通信时序。毕竟,你只有知道它是长什么样子,你才能知道它对不对。下面就简单介绍下I2C的通信时序。

概述

I2C总线是一种十分流行并且强大的总线,其多用于一个主机(或多个)与单个或多个从设备通讯的场景。图1表明了多种不同的外设可以共享这种只需要两根线便可以连接到处理器的总线,相对于其他接口来说,这也是I2C总线可以提供的最大优势之一。

这篇应用笔记的目标是帮助用户理解I2C总线是如何工作的。

图1展示了一个典型的用于嵌入式系统中的I2C总线,其上挂载了多种从设备。作为I2C主机的从微控制器控制着IO拓展、不同传感器、EEPROM、多个ADC/多个DAC、等等。所有这些设备只需要通过来自主机的两根引脚来控制。

41592624-e645-11ed-ab56-dac502259ad0.png

1、电特性

I2C总线使用开漏输出控制器,在同一线路上带有一个输入缓冲器,这样便可以允许在单根数据线上实现双向数据流传输。

用于双向通讯的开漏极

开漏输出极允许将总线上的电压拉低(大多数情况下是到地),或释放总线以允许其被上拉电阻拉高。当总线被主机或从机释放,线上的上拉电阻负责将线上电压上拉到电源轨。由于并没有设备可以在总线上输出高电平,这也就意味着总线在通讯中,将不会碰到一个设备输出高,而另一个设备试图输出低所导致的短路问题(电源轨到地)。I2C总线要求处于多主机环境下的单个主机在输出高而读回的实际总线电平为低时(这意味着另一个设备拉低了它)中止通讯,因为另一个设备正在使用总线。采用推挽输出方式的接口就没有这么自由了,这也正是I2C总线的一个优势。

4168a644-e645-11ed-ab56-dac502259ad0.png

图2展示了位于SDA/SCL线上的主从设备的内部简化结构,其由一个用于读取数据的缓冲器,以及一个用于发送数据的下拉场效应管组成。一个设备只被允许拉低总线(规定为短路到地)或释放总线(对地呈现高阻态)以允许上拉电阻拉升总线电平。当处理I2C设备时,有一个重要的概念需要阐明:没有设备可以保持总线为高。这个特性使得双向通讯得以实现。

开漏极拉低

正如前面章节所述,开漏输出只能将总线拉低,或者释放总线然后依靠上拉电阻拉高总线。图3展示了总线拉低时的电流流向。当逻辑电路想要发送一个低电平时,其会使能下拉场效应管,场效应管会通过短路到地的方式拉低线路。

417400b6-e645-11ed-ab56-dac502259ad0.png

开漏极释放总线

当从机或主机想要传输一个逻辑电平高,它只能通过使能场效应管的方式释放总线。这将会使得总线处于浮空状态,同时上拉电阻将会将总线电平拉高到供电轨,此电平被当作高电平看待。图4展示了电流如何流过用于拉高总线的上拉电阻。

417b1b62-e645-11ed-ab56-dac502259ad0.png

2、I2C接口

I2C的常用操作

I2C总线是一种双向接口,其使用被称为主机的控制器与从设备进行通讯。从机不会主动传输任何数据,除非其被主机寻址。每个处于I2C总线上的设备均有独有的设备地址,以用于与位于同一总线上的其他设备做区分。很多从机需要在启动后进行配置以设置设备行为。这通常在主机访问从机的内部寄存器映射时完成,这些寄存器均有独一无二的寄存器地址。单个设备可以具有一个或多个寄存器,这些寄存器可以用来存储或读写数据。

I2C总线的物理接口由串行时钟线(SCL)和串行数据线(SDA)组成。SCL和SDA均需要通过上拉电阻连接到Vcc。上拉电阻的大小由I2C线路上的等效电容大小决定(想要了解更多,可以参考TI的I2CPull-up Resistor Calculation这份文档,文档号:SLVA689;也可以看我的笔记里面的文章《I2C上升沿过长与上拉电阻》)。数据传送只能在总线空闲时初始化。如果SDA和SCL在一个STOP标志后均处于高电平状态,这时可以认为总线处在空闲状态。

主机访问从机的大体流程如下所示:

1、假设一个主机想要向从机发送数据:

a、发送方主机发送一个START标志并且寻址接收方从机

b、发送方主机发送数据到接收方从机

c、发送方主机通过发送STOP标志结束传输

2、如果主机想要从从机接收/读取数据:

a、接收方主机发送START标志并寻址发送方从机

b、接收方主机发送需要读取的寄存器地址到发送方从机

c、接收方主机从发送方从机接收数据

d、接收方主机通过发送STOP标志结束通讯

START与STOP标志

主机可以通过发送START标志初始化与设备的I2C通讯,或者发送STOP标志结束通讯。当SCL处于高电平时,SDA上的下降沿意味着一个START标志,而SDA上的上升沿意味着一个STOP标志。

418595a6-e645-11ed-ab56-dac502259ad0.png

重复的START标志

重复的START标志与通常的START标志作用类似,其用于STOP标志后紧接START标志的情况时,用于代替这两者。它看上去与START标志一致,但是与START标志不同的是,重复的START标志在STOP标志之前出现(也就是总线不处于空闲状态时)。当主机希望开始一次新的通讯,但又不希望发送STOP标志使总线进入空闲状态时这会非常管用,这样可以防止当前主机的总线控制权被其他主机抢夺(当处于多主机环境下)。

数据有效性与字节格式

数据位伴随着SCL上的每一个时钟脉冲被传输。单个字节由SDA线上的8位数据组成,其可以是设备地址、寄存器地址或者读自/写入设备的数据。数据以大端在前(MSB)的方式传输。在START标志与STOP标志之间可以传输任意数量的数据字节。SDA线上的数据必须在时钟电平为高时保持稳定,因为SCL线为高时,SDA线上的变动将会被当作控制指令(START或STOP)。

41905cde-e645-11ed-ab56-dac502259ad0.png

应答(ACK)和非应答(NACK)

数据的每一字节(包括地址字节)后总是伴随着来自接收方的1位ACK位。ACK位使得接收方可以告知发送方当前字节已成功接收,并且可以发送下一字节。

在接收方发送ACK位前,发送方必须释放总线。接收方通过在ACK/NACK时钟周期(第9时钟周期)的低电平相位拉低SDA线来发送一个ACK位,如此一来,SDA线将会在ACK/NACK时钟周期的高电平相位保持为低电平。设置与保持时间必须着重注意。

如果SDA线在ACK/NACK时钟周期保持为高电平,这将会被作为NACK。有好几种状态将会导致NACK的产生:

1、接收方无法进行接收或发送,因为其正在执行一些实时性功能(real-time function),无法与主机进行通讯。

2、在发送期间,接收方收到了无法识别的数据或指令。

3、在发送期间,接收方无法接收更多数据字节(也就是缓冲区满了)。

4、作为接收方的主机完成了数据读取,因此通过发送一个NACK通知从机。

419a690e-e645-11ed-ab56-dac502259ad0.png

I2C总线数据

数据可以写入/读自从机,但是这是通过读写从设备内部的寄存器完成的。

包含信息的寄存器处于从机的内存中,无论这些信息是配置信息还是一些需要回发给主机的采样数据。为了指示从机去执行某一任务,主机必须向这些寄存器内写入信息。

虽然通常来说I2C从机是具有多个寄存器的,但也需要注意并不是所有从机都是这样。对于一个只具有单个寄存器的简易从机来说,可以通过在从机地址后直接发送数据的方式来直接写这个单一的寄存器,而不需要再对寄存器进行寻址。一个通过I2C总线控制的8位I2C开关可以很好的作为单寄存器设备的例子。由于它通过1位来使能/失能一个通道,因此只需要1个寄存器,主机可以在从机地址后直接写入寄存器数据,跳过寄存器编码部分。

写位于I2C总线上的从机

要在I2C总线上执行写操作,主机会发送一个START标志以及从机地址到总线上,并且将最后1位(读写位)设为0以表明这是写操作。当从机发送应答位之后,主机便发送希望写入的寄存器地址。从机再一次应答,通知主机从机已准备好。这之后,主机开始发送寄存器数据到从机。当主机发送完所有需要发送的数据(有时只是一个字节),其将会通过发送STOP标志结束通讯。

图8展示了一个写入单个字节到从机寄存器的例子。

41a775fe-e645-11ed-ab56-dac502259ad0.png

读位于I2C总线上的从机

从从机读取数据与写入数据类似,但是有一些额外的步骤。

为了读取从机,主机必须先指示从机自己想要读取哪个寄存器。这一步通过执行与写操作类似的开始通讯步骤完成,发送读写位为0的设备地址(意味着一次写操作),紧跟着希望读的寄存器的地址。一旦从机应答了此地址,主机将会再一次发送START标志,并发送读写位为1的设备地址(意味着一次读操作)。这时,从机将会应答读请求,同时主机释放总线但是保持到从机的时钟供应。在通讯流程的这一部分,主机将会作为接收方主机,同时从机将会作为发送方从机。

主机将会继续发送时钟脉冲,但是会释放SDA线以便于从机传输数据。在每个字节数据的结尾,主机将会发送一个ACK到从机,让从机知道主机准备好接收更多的数据。一旦主机接收完成期待的字节数量,它将会发送一个NACK,通知从机终止通讯并要求从机释放总线。紧接着主机将会发送一个STOP标志结束通讯。

图9展示了从从机寄存器读取单个字节的例子。

41b03b12-e645-11ed-ab56-dac502259ad0.png

这是对德州仪器的应用文档SLVA704的中文翻译,原文标题为:Understanding the I2C Bus。

审核编辑:汤梓红

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

    关注

    2549

    文章

    50817

    浏览量

    752410
  • 总线
    +关注

    关注

    10

    文章

    2871

    浏览量

    88010
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1482

    浏览量

    123430
  • I2C总线
    +关注

    关注

    8

    文章

    389

    浏览量

    60858
  • I2C通信
    +关注

    关注

    0

    文章

    22

    浏览量

    8813

原文标题:I2C通信没反应怎么办?

文章出处:【微信号:gh_3a15b8772f73,微信公众号:硬件工程师炼成之路】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如果芯片不具有硬件I2C模块怎么办

    这样做的好处是可以突破硬件上的限制,例如芯片不具有硬件 I2C 模块,或者硬件 I2C 模块损坏,又或者使用硬件 I2C 模块时布线非常麻烦。坏处是需要写代码模拟时序,根据不同的硬件平台和不同的时钟频率,代码中的部分参数是不一样
    的头像 发表于 10-30 15:59 4839次阅读
    如果芯片不具有硬件<b class='flag-5'>I2C</b>模块<b class='flag-5'>怎么办</b>?

    I2C通信介绍及软测方法

    本文主要讲解I2C通信介绍以及如何使用软件工具抓取通信波形,帮助开发人员更好的去理解I2C通信
    的头像 发表于 04-17 16:35 2806次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>通信</b>介绍及软测方法

    点击绑定微信没反应怎么办

    请问点击绑定微信没反应怎么办
    发表于 02-03 18:18

    电脑usb接口不能用没反应怎么办

    我们在使用电脑时有时会遇到电脑usb接口不能用或是电脑USB没反应,可能很大部份人都遇到过这样的情况。下面是小编整理的电脑usb接口不能用没反应的解决方法。希望对大家能有所帮
    发表于 11-05 18:11 10.8w次阅读

    labview与i2c通信的编程问题

    labview与i2c通信的编程问题,适合新手看看
    发表于 12-09 15:49 205次下载

    i2c

    单片机i2c总线操作;单片机i2c总线操作;单片机i2c总线操作;
    发表于 05-17 11:09 35次下载

    STM32F2通信接口I2C

    STM32F2通信接口I2C
    发表于 09-03 11:24 31次下载
    STM32F<b class='flag-5'>2</b>—<b class='flag-5'>通信</b>接口<b class='flag-5'>I2C</b>

    防盗门指纹门锁失灵没反应的解决方法

    指纹开不了锁是怎么回事?指纹锁没反应怎么办?防盗门指纹锁失灵没反应怎么解决?指纹门锁是日常使用中比较常见的锁具类型,通过手指轻点即可实现解锁过程,十分轻松简单,也解决了忘带钥匙的烦恼,但在日常使用中,由于使用环境、操作不当、使用
    发表于 05-19 16:22 7.3w次阅读

    i2c通信的详细讲解

    I2C属于串行通信,所有的数据以位为单位在SDA上串行传输
    发表于 11-24 14:09 1.9w次阅读
    <b class='flag-5'>i2c</b><b class='flag-5'>通信</b>的详细讲解

    I2C通信的详细讲解

    I2C属于串行通信,所有的数据以位为单位在SDA线上串行传输。
    的头像 发表于 06-25 17:19 13.6w次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>通信</b>的详细讲解

    I2C总线的基本通信总结

    在电子设计开发中I2C大家已经很熟悉了,每一种电子产品小到电子开关,大到卫星通信都会利用的I2C总线。据统计I2C在电子产品中占据了93%的份额,几乎任何一种电路都要使用。
    的头像 发表于 08-26 14:08 1.8w次阅读
    <b class='flag-5'>I2C</b>总线的基本<b class='flag-5'>通信</b>总结

    I2C”的那些坑

    ,核查设备的数据手册,甚至发送和接收的每一条命令与数据都知道是什么意思,仍然无法解决问题,那该怎么办呢? 本文主要针对 i2c 设备,讲解如何解决 i2c 设备主机与从机直接无法正常数据交互
    发表于 11-06 10:05 8次下载
    “<b class='flag-5'>I2C</b>”的那些坑

    硬件I2C与模拟I2C

    硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但
    发表于 12-28 19:14 81次下载
    硬件<b class='flag-5'>I2C</b>与模拟<b class='flag-5'>I2C</b>

    I2C通信协议:了解I2C Primer、 PMBus和SMBus

    I2C,即Inter-Integrated Circuit,是一种常用的串行通信协议,用于在器件之间——特别是两个或两个以上不同电路之间建立通信I2C Primer是最常用的
    的头像 发表于 06-15 15:29 5533次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>通信</b>协议:了解<b class='flag-5'>I2C</b> Primer、 PMBus和SMBus

    I2C接口进入Busy状态不能退出怎么办

    电子发烧友网站提供《I2C接口进入Busy状态不能退出怎么办.pdf》资料免费下载
    发表于 08-02 10:03 3次下载
    <b class='flag-5'>I2C</b>接口进入Busy状态不能退出<b class='flag-5'>怎么办</b>