文章目录

  • 为什么采用漏极开路?
  • 为什么要加上拉电阻?
  • 为什么要线与?
  • 总结全文

系列文章: 《I2C总线(1)–数据传输格式与7位地址读写》; 《I2C总线(2)–10位地址读写》; 《I2C总线(3)–时钟同步和仲裁》; 《I2C总线(4)–高速模式》; 《I2C总线(6)–START BYTE》

为什么采用漏极开路?

首先,连接到 I2C 上的设备是开漏输出的。以漏极开漏输出(OD)为例,是指将输出级电路结构改为一个漏极开路输出的 MOS 管。这样做的好处在于:

  • 防止短路
  • 可以实现“线与”逻辑,可以减少一个与门的使用,简化电路。

结论:I2C支持多个主设备与多个从设备连接在同一根总线上,如果不开漏输出,会出现短路现象。

为什么要加上拉电阻?

但是,采用开漏输出时,如果没有上拉电阻的存在,只能输出低电位,无法输出高点位

结论:连接上拉电阻后,才可以输出高电位

在验证 I2C 接口时,我们同样要对上拉电阻做处理。如下:以从端驱动 SDA 和 SCL 为例

从端对SDA/SCL线的驱动:

assign SCL = scl_slave === 0 ? 1'b0 : 1'bz ;
assign SDA = sda_slave === 0 ? 1'b0 : 1'bz ;

也就是说:

  • 当从端驱动 SDA/SCL 为低(0)时,从端会直接给 SDA/SCL 一个0值;
  • 如果从端驱动 SDA/SCL 不为低(0)时,从端会给 SDA/SCL 一个高阻态值。

为什么是高阻态?而不是直接给高电位(1)呢?

因为高阻态是一个无效驱动,而高电位(1)是一个有效驱动,如果置为1会跟其他的驱动源造成多驱动冲突。为了避免多重驱动的问题,当 Slave 或者 Master 不打算驱动任何一根线时(SDA/SCL),那必须把 SDA/SCL 给一个高阻态(z)值。

经过上拉处理:

如果在整个总线上,master 和 slave 都没有给 SDA/SCL 一个有效驱动(即低电位),会通过上拉电阻将 SCL/SDA置为高电位(1)。

注意:这个给的高电位(1)是一个弱信号,可以防止形成多驱动源造成冲突。

assign (week0,week1) SCL = enable_pullup_registor ? 1: 0;
assign (week0,week1) SDA = enable_pullup_registor ? 1: 0;

举个例子:

I2C支持多主设备与多个从设备,下面 master1 给 slave1 发送一个从地址(0110 011),master2 给 slave2 发送一个从地址(0110 001),

解释上图中的例子:

  • 当 master1 发送最后一个R/W位 = 0 时,此时,会直接将SDA线拉低,slave1 可以看到SDA线为低。
  • 当 master2 发送最后一个R/W位 = 1 时,此时,master2 会给 SDA一个高阻值(Z),表明 master1 不对总线SDA做驱动,此时上拉电阻会将SDA信号线置为1(弱信号),slave2 看到的是SDA为高。

为什么要线与?

现在,我们已经知道了 I2C 为什么要漏极开路和添加上拉电阻的目的了,那么又为什么要线与?I2C 支持多个主设备与多个从设备连接在同一根总线上,如果多个设备同时占用总线,怎么判断谁先占用总线呢?所以就需要一种仲裁机制。I2C 没有 Arbiter 直接的来处理仲裁,而是通过线与的逻辑实现仲裁

仲裁过程:当主设备A准备占用I2C时,需要在SCL为高时,将SDA拉高,再拉低,满足一个启动条件。当主设备A将SDA拉高后,需要检查SDA的电平:

  • 如果此时SDA电平为高,说明主设备可以占用总线,然后主设备A会将SDA拉低,一次满足启动条件,开始传输;
  • 如果此时SDA电平为低,说明总线已经被其他设备占用,主设备A会退出。

为什么SDA为低,就是被其他设备占用了呢?
因为线与逻辑的存在。只有总线上有其他的设备将SDA置为0,线与后,SDA线的电平为0。主设备A检查SDA线的电平时,会发现为低电平。所以仲裁时,哪个设备更早地将SDA线拉低,谁就抢占了优先权。

总结全文

  • 漏极开路是为了防止I2C上连接多个主设备与多个从设备时出现短路;
  • 上拉电阻的存在是为了在使用漏极开路之后,可以输出高电平;
  • “线与”是为了在多个主设备同时占用总线时,具有仲裁的能力。

I2C中为什么线与?为什么要有上拉电阻?相关推荐

  1. I2C走线技巧、及上拉电阻、电源电压、总线电容三者间的函数关系

    目录 I2C总线PCB布线注意事项: 博客其他文档可以学习:https://www.cnblogs.com/zhiqiang_zhang/ I2C总线线路的走线方式 I2C器件与I2C总线的接线方式 ...

  2. I2C总线为什么要接上拉电阻

    I2C总线为什么要接上拉电阻 1.根据I2C总线规范,总线空闲时两根线都必须为高: 这是规定,动不了的,不然什么叫标准呢?其实所谓的这个神圣的标准也并不是多么邪乎,你想啊,只有是高的才能拉成低的,难道 ...

  3. I2C上拉电阻取值问题

    漏极开路上拉电阻取值为何不能很大或很小? 如果上拉电阻值过小,Vcc灌入端口的电流(Ic)将较大,这样会导致MOS管V2(三极管)不完全导通(Ib*β<Ic),有饱和状态变成放大状态,这样端口输 ...

  4. I2C上拉电阻到底多大

    I2C上啦电阻到底多大 1. I2C出现的问题 最近群里,由于大部分人都玩摄像头,在摄像头初始化,即I2C接口的初始化中,前前后后出现了很多问题,包括我自己.不能理解..如下部分群聊记录: 我在当时在 ...

  5. 上拉电阻大小对i2c总线的影响

    原文地址:http://blog.csdn.net/tianshiyalin/article/details/24504539 asw1: 这个就要看你使用的单片机是否有标准的IIC标准接口了,如果你 ...

  6. i2c的IOL及上拉电阻

    1.拉电流与灌电流 拉电流(pull current)是指PAD输出为逻辑1时,对外提供的电流,相当于电流是被拉出,所以叫拉电流.灌电流(sink current)是指端口输出为逻辑0时,对外提供的电 ...

  7. MCU上拉电阻一般接1K~10K,在1K,4.7K,5.4K,10K这四个电阻中你会选哪个?

    上下拉电阻用多大的,需要看场合. 如果在手持设备或电池供电的应用中,可能上下拉电阻会更大一些,比如50K. 一般应用中上下拉电阻,10K.4.7K.5.1K都用,不过有时候还得对照外部器件手册来确定. ...

  8. I2C使用上拉电阻详解

    SDA使用上拉电阻? 设备的SDA中有一个三极管,使用开极/开漏电路(三极管是开极,CMOS管是开漏,作用一样),如下图: 真值表如下: 从真值表和电路图我们可以知道: 当某一个芯片不想影响SDA线时 ...

  9. USB 中的DM,DP上拉电阻分析

    DM,DP上拉电阻分析: usb有主从设备之分,主设备有:pc, 现在市面上的那些插u-disk即可播放mp3的"mp3"之类的. usb 信号是差分信号,信号线为D+, D-,. ...

最新文章

  1. 使用EntityFramework6连接MySql数据库(db first方式)
  2. 地区省份城市sql信息
  3. 迪普工业以太网交换机产品线
  4. python数据分析基础教程考试试卷_Python数据分析-自测试卷5
  5. OpenTelemetry-可观察性的新时代
  6. 电赛总结(二)——AD芯片总结之AD7715
  7. 杜绝网上压根没测过就乱写之 《oracle mybatis 返回自增主键 》
  8. 每日学习之 2016.07.27
  9. Java程序的运行机制和JVM
  10. Python爬虫爬取豆瓣图书的信息和封面,放入MySQL数据库中。
  11. 使用nssm注册 windows服务
  12. c语言八大排序算法详细版
  13. matlab图像拼接 设计,MATLAB图像拼接算法及实现.doc
  14. pytorch制作数据集
  15. html制作快闪,怎么制作快闪文字视频?朋友圈很火的文字快闪视频如何制作?快闪文字视频制作方法...
  16. Codeforces 1077E Thematic Contests(二分)
  17. OEE(设备综合效率)
  18. 实战篇:VMware Workstation 虚拟机安装 Linux 系统
  19. vue怎么设置封面_微信朋友圈封面视频如何制作?微信朋友圈封面视频制作软件VUE功能介绍...
  20. linux创建磁盘的命令,linux中创建磁盘分区的命令是什么

热门文章

  1. type-c转HDMI+PD+USB3.0多合一拓展转换芯片
  2. freeCAD - Qt开发的工业设计软件
  3. jQuery Sizzle
  4. JavaScript写时间倒计时
  5. 记:关于TJA1041的网络唤醒策略
  6. Android算法学习——打表法的概念
  7. 大量更换amd平台,使用后发现其稳定性不佳
  8. arduino使用SPIFlash库 读写Flash芯片
  9. python植物大战僵尸代码例_用Python实现植物大战僵尸游戏,很酷
  10. oracle ebs版本查看,怎么查看oracle ebs的系统版本号以及各模块的版本号 | 码农网...