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

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

3天内不再提示

IIC你吃透了吗?建议收藏

哈哈hfgfdf 来源:嵌入式学习资料 作者:嵌入式学习资料 2023-02-09 01:22 次阅读

1、概述

I2C总线是一种十分流行并且强大的总线,其多用于一个(或多个)主机与单个或多个从设备通讯的场景。图1表明了多种不同的外设可以共享这种只需要两根线便可以连接到处理器的总线,相对于其他接口来说,这也是I2C总线可以提供的最大优势之一。 这篇应用笔记的目标是帮助大家理解I2C总线是如何工作的。
图1展示了一个典型的用于嵌入式系统中的I2C总线,其上挂载了多种从设备。作为I2C主机的从微控制器控制着IO拓展、不同传感器、EEPROM、多个ADC/多个DAC、等等。所有这些设备只需要通过来自主机的两根引脚来控制。

1c451900-a7d5-11ed-92c9-dac502259ad0.png

1、电特性

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

1.1 用于双向通讯的开漏极

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

1c5573e0-a7d5-11ed-92c9-dac502259ad0.png

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

1.1.1 开漏极拉低

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

1c62d68e-a7d5-11ed-92c9-dac502259ad0.png

1.1.2 开漏极释放总线

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

1c705bce-a7d5-11ed-92c9-dac502259ad0.png

2、I2C接口

2.1 I2C的常用操作

I2C总线是一种双向接口,其使用被称为主机的控制器与从设备进行通讯。从机不会主动传输任何数据,除非其被主机寻址。每个处于I2C总线上的设备均有独有的设备地址,以用于与位于同一总线上的其他设备做区分。很多从机需要在启动后进行配置以设置设备行为。这通常在主机访问从机的内部寄存器映射时完成,这些寄存器均有独一无二的寄存器地址。单个设备可以具有一个或多个寄存器,这些寄存器可以用来存储或读写数据。
I2C总线的物理接口由串行时钟线(SCL)和串行数据线(SDA)组成。SCL和SDA均需要通过上拉电阻连接到Vcc。上拉电阻的大小由I2C线路上的等效电容大小决定(想要了解更多,可以参考I2C Pull-up Resistor Calculation这份文档,文档号:SLVA689)。数据传送只能在总线空闲时初始化。如果SDA和SCL在一个STOP标志后均处于高电平状态,这时可以认为总线处在空闲状态。
主机访问从机的大体流程如下所示:

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

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

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

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

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

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

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

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

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

2.1.1 START与STOP标志

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

1c839ed2-a7d5-11ed-92c9-dac502259ad0.png

2.1.2 重复的START标志

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

2.2 数据有效性与字节格式

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

1c9bed70-a7d5-11ed-92c9-dac502259ad0.png

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

数据的每一字节(包括地址字节)后总是伴随着来自接收方的1位ACK位。ACK位使得接收方可以告知发送方当前字节已成功接收,并且可以发送下一字节。
在接收方发送ACK位前,发送方必须释放总线。接收方通过在ACK/NACK时钟周期(第9时钟周期)的低电平相位拉低SDA线来发送一个ACK位,如此一来,SDA线将会在ACK/NACK时钟周期的高电平相位保持为低电平。设置与保持时间必须着重注意。
如果SDA线在ACK/NACK时钟周期保持为高电平,这将会被作为NACK。有好几种状态将会导致NACK的产生:

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

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

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

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

1cb833cc-a7d5-11ed-92c9-dac502259ad0.png

3、总线数据

数据可以写入/读自从机,但是这是通过读写从设备内部的寄存器完成的。
包含信息的寄存器处于从机的内存中,无论这些信息是配置信息还是一些需要回发给主机的采样数据。为了指示从机去执行某一任务,主机必须向这些寄存器内写入信息。
虽然通常来说I2C从机是具有多个寄存器的,但也需要注意并不是所有从机都是这样。对于一个只具有单个寄存器的简易从机来说,可以通过在从机地址后直接发送数据的方式来直接写这个单一的寄存器,而不需要再对寄存器进行寻址。一个通过I2C总线控制的8位I2C开关可以很好的作为单寄存器设备的例子。由于它通过1位来使能/失能一个通道,因此只需要1个寄存器,主机可以在从机地址后直接写入寄存器数据,跳过寄存器编码部分。

3.1 写位于I2C总线上的从机

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

1cd00740-a7d5-11ed-92c9-dac502259ad0.png

3.2 读位于I2C总线上的从机

从从机读取数据与写入数据类似,但是有一些额外的步骤。为了读取从机,主机必须先指示从机自己想要读取哪个寄存器。这一步通过执行与写操作类似的开始通讯步骤完成,发送读写位为0的设备地址(意味着一次写操作),紧跟着希望读的寄存器的地址。一旦从机应答了此地址,主机将会再一次发送START标志,并发送读写位为1的设备地址(意味着一次读操作)。这时,从机将会应答读请求,同时主机释放总线但是保持到从机的时钟供应。在通讯流程的这一部分,主机将会作为接收方主机,同时从机将会作为发送方从机。 主机将会继续发送时钟脉冲,但是会释放SDA线以便于从机传输数据。在每个字节数据的结尾,主机将会发送一个ACK到从机,让从机知道主机准备好接收更多的数据。一旦主机接收完成期待的字节数量,它将会发送一个NACK,通知从机终止通讯并要求从机释放总线。紧接着主机将会发送一个STOP标志结束通讯。
图9展示了从从机寄存器读取单个字节的例子。

1ce826ea-a7d5-11ed-92c9-dac502259ad0.png

这是对德州仪器的应用文档SLVA704的中文翻译,原文标题为:Understanding the I2C Bus。相比于飞利浦出品的几十页的I2C标准文档,此文档只有8页,但是对于想要了解标准I2C总线并应用的人来说,这个已经够用了。

审核编辑黄宇

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

    关注

    31

    文章

    5308

    浏览量

    119936
  • 总线
    +关注

    关注

    10

    文章

    2863

    浏览量

    87964
  • IIC
    IIC
    +关注

    关注

    11

    文章

    298

    浏览量

    38260
收藏 人收藏

    评论

    相关推荐

    10种精密全波整流电路吃透了吗

    图1是最经典的电路,优点是可以在电阻R5上并联滤波电容。
    发表于 04-03 11:08 4204次阅读
    10种精密全波整流电路<b class='flag-5'>你</b>都<b class='flag-5'>吃透了吗</b>?

    收藏建议

    不知道是不是我没发现我觉得需要增加一个收藏功能,也就是看到好的帖子,可以收藏下来,想看时就不用找那么久。看了那么久只看到收藏本版的功能!!!{:45:}{:45:}{:45:}真的是我没发现么呵呵
    发表于 11-10 19:40

    小小的电阻,您真的吃透了它的用法吗

    小小的电阻,您真的吃透了它的用法吗
    发表于 05-28 22:39

    关于“收藏”设置的建议

    在论坛里会看到很精彩的文章,就会收藏保存,以后从新温习,,但是收藏不能分组,所有的收藏文件都挤在一起,所以实在是太乱了,找到哪一个文件的话,非常的不方便,,,建议能够进行分组归类,,这
    发表于 06-12 10:02

    树莓派3了吗

    随着国内第一批树莓派3的到货,某宝上预售曾经短暂的改变过状态,不过随后就恢复了原装,询问多家都是无货状态。树莓派3了吗
    发表于 03-17 13:26

    真的吃透了电阻的用法?

    电阻作为一种最基本电子元器件,广泛运用在各种电路中,通常我们也认为电阻是用法最简单的一种电子元器件,除了功率外,没有过多的讲究。如果今天我说就这个小小的电阻,许多资深电子工程师都不一定真正懂得如何用,您相信吗?在选用电阻的时候,如果避除高频电路的特殊应用,一般我们只考虑电阻的功率,对于普通工程师,只要能通过流过电阻的电流选择合适的功率,就可算做合格,如果能考虑到瞬时功率,就可以算做不错的工程师。但要能真正正确使用电阻,只有做到这两点还不够,看了下面的文字您就会明白,原来用电阻还有这么多讲究。注:后面内容是我个人对一些实际应用做出的理解,不一定完全正确,只做参考。先看一个简单的电路图,是通过采样电阻R1和R2对流过LED灯的电流采样,然后调整PWM输出,以保证不同电压下流过LED灯的电流恒定。 这个电路图有一个让人纳闷的地方,为什么采样电阻要用两个?两个3.9欧的电阻,好像用一个2欧的电阻也没什么问题啊?就算是电流比较大,我们可以选用更大功率的电阻来解决,装一个电阻比装两个电阻要简单方便,这样的电路着实让人有点迷糊。 以我个人的理解,这种电路形式有以下优点: 1. 多个电阻更利于散热,两个1W的2欧电阻并联使用和一个2W的1欧电阻单独使用,流过同样的电流,大多数时候两个电阻并联使用温升要小,电阻在温度高(比如高于70摄氏度)的条件下可以承受的功率会明显下降,这样两个电阻并联的电路效果会更好。 2.多个电阻可以通过电阻的组合得出更理想的电阻值,比如实际应用中1.95欧电阻比2欧电阻更合适,如果想直接买一个1.95欧的电阻肯定没有两个3.9欧的电阻方便,因为3.9欧是标准阻值,而1.95欧不是。 再看一个电源类产品中常见的电路,这个电路就更加“古怪”,图中是R4和R5串联、R6和R7串联、R8和R9串联。这个电路中R4和R5的阻值之和通常为1M~1.5M,也就是说只要这两个电阻的阻值和在这个范围内都可以接受,对电路功能没有明显影响。于是这里就引出一个疑问,为什么这里要用两个电阻串联呢? 如果是功率原因,就算是230V的交流,一个1M的电阻承受的功率会符合此公式:P=(230*1.414)*(230****=0.105625W,只要选用一个1/8的电阻就够用了,用功率来解释说不通。 这种电路涉及到电阻两个容易被大家忽略的参数“最大耐压值”和“最大工作电压”,电阻除了阻值、额定功率外,还有两个重要参数是最大耐压值和最大工作电压,比如常见的1/4W插件电阻,通常最大耐压值是500V、最大工作电压为250V。 再来看上面的电路,如果我们把R4和R5合并成一个1/4W 1M的插件电路,功率上讲是没有问题的,但是230V交流通过整流桥后可以产生最高325V的直流电压,这样就会让这个电阻长时间工作在300V左右的电压下,时间一长,就会损坏这个电阻,但如果是用两个510K的电阻串联,每个电阻只分到大约150V的电压,就可以保证电路长时间稳定工作。
    发表于 03-26 08:22

    电功率理解透了吗?怎么算功率因数?

    原标题:电功率理解透了吗?怎么算功率因数?1度电是多少?1.电功率电功率即电流在单位时间内所做的功,也就是说电流在1S内做的功。在交流电路中,电功率分为视在功率、有功功率和无功功率。 1.1有功
    发表于 07-09 07:09

    基于由入门到精通吃透PID

    基于由入门到精通吃透PID
    发表于 10-15 10:34 9次下载
    基于由入门到精通<b class='flag-5'>吃透</b>PID

    10种精密全波整流电路吃透了吗

    精密全波电路还有一些没有录入,比如高阻抗型还有一种把A2的同相输入端接到A1的反相输入端的,其实和这个高阻抗型的原理一样,就没有专门收录,其它采用A1的输出只接一个二极管的也没有收录,因为在这个二极管截止时,A1处于开环状态。
    的头像 发表于 03-26 15:59 3.8w次阅读
    10种精密全波整流电路<b class='flag-5'>你</b>都<b class='flag-5'>吃透了吗</b>?

    阻抗的概念,真的懂了吗

    阻抗的概念,真的懂了吗
    的头像 发表于 07-02 11:40 1.5w次阅读

    【CC2530授课笔记】课程列表汇总 【超级干货】【建议收藏

    【CC2530授课笔记】课程列表汇总 【超级干货】【建议收藏
    发表于 11-29 19:36 0次下载
    【CC2530授课笔记】课程列表汇总 【超级干货】【<b class='flag-5'>建议</b><b class='flag-5'>收藏</b>】

    AUTOSAR中的IIC如何实现和配置

    也许会很好奇,为啥?MCAL和CDD有啥不一样?如果是初学者,建议先把这问题放一放,看我下面的讲解。 2. IIC的MCAL实现方式
    的头像 发表于 12-12 09:25 5588次阅读

    年度爆款技术好文Top 10,建议收藏

    点击蓝字 关注我们 点个 星标 ,茫茫人海也能一眼看到我 赞 一个呗,让大家知道 在看 点击" 阅读原文 ",同步 领取福利 原文标题:年度爆款技术好文Top 10,建议收藏! 文章出处:【微信公众号:安森美】欢迎添加关注!文
    的头像 发表于 01-19 19:25 681次阅读

    Linux 命令大全建议收藏

    本文为 Linux 命令大全,从 A 到 Z 都有总结,建议大家收藏以便查用,或者查漏补缺!
    的头像 发表于 05-12 10:53 843次阅读

    建议收藏)使用示波器必懂的基础知识汇总

    ,想要加群学习讨论/领取文档资料的同学都可以扫描图中运营二维码一键加入哦~  (广告、同行勿入 原文标题:(建议收藏)使用示波器必懂的基础知识汇总 文章出处:【微信公众号:张飞实战电子】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 07-10 19:40 719次阅读
    (<b class='flag-5'>建议</b><b class='flag-5'>收藏</b>)使用示波器必懂的基础知识汇总