背景

昨天出去了一趟,人问:你熟悉什么?答:软硬件。结果,好尴尬。
硬件一般都做什么内容?
答:电源设计。
能说下升压、降压电路是怎么实现的吗?
答:不能。(Ps:后续增加 电源设计原理)
通讯都用到什么接口?
答:UART、I2C、SPI。
然后我想,I2C 我研究了好久,我得把话题转到 I2C 上。
我说:我最近在做 I2C 的接口。
I2C 和 SPI 有什么区别?
答:I2C 总线只需要 2 根线, SPI 对于每个从设备都要外加一条 NSS。而且通讯速率相差甚异。I2C 最高通信频率只能到 4Mbit/s。SPI 能到 50Mbit/s,具体还取决于主从机的性能。
知道为什么 I2C 速度提不上去吗?
答:我猜是 阻容特性导致的,具体的不清楚

经过这次,我猜发现,我对 I2C 的了解程度并没有我想象中那么深入。
因此决定用篇文章专门研究 I2C 总线。

I2C 名称的由来

Ps:昨天和男票看《观复嘟嘟》,男票就提到,每次马老师讲一个事物时,总是会先长篇介绍这个事物名称的由来,实际上有助于帮助我们去了解。因此,首先,先介绍下 I2C 名称的由来。

I2C 是 Inter-Integrated Circuit 的简写,Inter-Intergrated Circuit 翻译过来,曰:内置集成电路。为什么 I2C 是内置集成电路?
I2C 总线是由飞利浦(Philips)半导体公司在 80 年代初设计出来的,为了让主板、嵌入式系统或手机用以连接低速周边装置而发展的。
从上面这段语句中,可以得知,I2C 是为了解决低速设备接入高速设备而存在的

I2C 可以写成 I²C、IIC。

  • I2C 读作: I - two - C
  • I²C 读作: I - squared - C
  • IIC 读作: I - I - C
  • 在中国,咱们读: I 方 C。这个读法,我想国外友人应该是没法听懂的。

I2C 概述

I2C 总线是一种简单、双向二线制同步串行总线。只需要 2 根线就可以和总线上的器件进行信息传递。

下图是一个典型的 I2C 总线连接示意图。

SDA 和 SCL

从硬件上来说, I2C 总线只有 2 根线,分别为 SDA 和 SCL,两者都是双向 I/O 线。总线接口已经集成在芯片内部,不需要特殊的接口电路。

  • SDA :是串行数据总线,负责数据信号的传输。
  • SCL:是串行时钟总线,负责时钟信号的传输。

电气特性

SDA 和 SCL 都是双向 I/O 线,接口电路为开漏输出(Open-drain),需要通过上拉电阻接电源 VCC。
这样,当总线空闲时,两根线都是 High

NOTE
I2C 总线器件均为 CMOS 器件,输出级均为开漏电路,因此,CMOS 器件在总线上消耗的电流很小。这样,就能保证 I2C 总线不需要太大的电流驱动能力,或者说,I2C 具有足够的驱动能力。
但是, I2C 总线扩展器件的数量并不是受限于电流驱动能力,而是受限于电容负载总量I2C 总线的电容负载能力为 400pF(通过驱动扩展可达到 4000pF)。每一个器件的输入端都相当于一个等效电容,由于 I2C 总线扩展器件的连接方式为并联,因此,I2C 总线的总等效电容等于每一个器件等效电容之和,等效电容的存在会造成传输信号波形的畸变。在超出范围时,会导致数据传输出错。

Master 和 Slave

从接入的设备来说,I2C 总线上连接着主设备(Master)和从设备(Slave)。

  • Master 用于启动数据传输,并产生时钟信号。
  • 任何被寻址的器件均是被认为是 Slave。

NOTE
Master 和 Slave 的关系不是恒定的,而是取决于此时数据传输的方向。

工作原理

Master 要发送数据给 Slave,则:

  • Master 首先寻址 Slave
  • Master 再主动发送数据给 Slave
  • 最后由 Master 终止数据传送

Master 要接收 Slave 的数据,则:

  • Master 首先寻址 Slave
  • Master 再主动接收 Slave 发送的数据
  • 最后由 Master 终止接收的过程

由此可见,无论是发送数据或者接收数据,都是由主机主动发起和终止数据传输过程。同时, Master 还负责在 SCL 上产生时钟。

数据传输

下图为 I2C Bus的数据传输示意图。

数据有效性

SDA 上的数据必须:

  • 在 SCL 为 High 时,保持不变
  • 在 SCL 为 Low 时,进行电平转换

起始信号和停止信号

每次 Master 发起通讯时, Master 必须产生起始信号(Start)。
在每次通讯结束时,Master 必须产生停止信号(Stop)。

  • Start 信号:SCL 为 High 时,SDA 由 High 变 Low ,产生下降沿。
  • Stop 信号:SCL 为 High时, SDA 由 Low 变 High,产生上升沿。

Byte 格式

  • 发送到 SDA 线上的每个数据长度必须为 1 Byte(8 bits)
  • 每次传输可以发送的字节数量不受限制
  • 每个字节后必须跟一个响应位(Ack)
  • 首先传输的是数据的最高位(MSB)

应答响应

I2C 总线共有 2 种应答。当生产 Ack ,认为数据通讯正常,主机可继续通讯。当产生 NAck,认为数据通讯异常,主机可产生停止信号(P)结束通讯。

  • Ack : 第 9 个 SCL 脉冲时,SDA 为 Low
  • NAck : 第 9 个 SCL 脉冲, SDA 为 High

NOTE
当为 I2C 读时序时, 最后一个 Byte 均产生 NAck,为正常情况。
当为 I2C 写时序是,最后一个 Byte 均产生 Ack,为正常情况。

I2C 总线共有 2 种情况,需产生应答:

  • Slave Address + W/R 响应。Master 发送 Slave Address + W/R 后,必须由被寻址的 Slave 产生 Ack,若不存在对应地址的 Slave,主机将接收到 NAck,产生停止信号(P)以终止数据传输。

  • 数据响应。在每 Byte 数据后的第 9 个 SCL 脉冲,必须由 Receiver 产生 Ack,以响应 Transmitter 数据通讯正常,若 Receiver 正在进行其他操作而无法响应 Transmitter时,需产生 NAck 以终止数据传输。

NOTE

  • 地址应答必须由 Slave 应答
  • 数据应答不区分 Master 和 Slave ,仅区分 Transmitter 和 Receiver。

时钟扩展

在数据传输过程中,如果 Slave 要完成一些其他功能后,才能接受或发送下一个完成的数据字节,可以使 SCL 保持 LOW,迫使 Master 进入等待状态,当 Slave 准备好接收下一个数据字节并释放 SCL 后,数据传输继续。
###Slave Address 和 R/W
在 Master 发起通讯时,在产生 Start 信号后,Master 发送 Slave Address 和 R/W。

Salve Address 为 7 bits。实际可用地址为:(0x07, 0x78)
以下为特殊用途的 Slave Address:

R/W:

  • R/W = 0 时,表示 Write
  • R/W = 1 时,表示 Read

Software Reset

若在 General Call(0000 0000h)后,主机发送 0x06(0000 0110),将产生软件复位。
#I2C 总线速率

I2C 共有 5 种通讯速率,分为双向(Bidirectional Bus)和单向(Unidirectional Bus)。

  • 双向(Bidirectional Bus):
  • Standard-mode(Sm):up to 100 kbit/s
  • Fast-mode(Fm):up to 400 kbit/s
  • Fast-mode Plus(Fm+):up to 1 Mbit/s
  • High-speed mode(Hs-mode):up to 3.4 Mbit/s
  • 单向(Unidirectional Bus):
  • Ulrta Fast-mode(UFm):up to 5 Mbit/s

总线电气特性计算

上拉电阻 Rp 阻值计算


供电电压 VDD 和最大输出低电平,决定上拉电阻 Rp 的阻值。
Example

VDD = 5 V ± 10%, Vol(max) = 0.4 V at 3 mA
Rp(min) = (5 + 5*10% - 0.4)/0.003 = 1.7 kOhm

#总线最大容值计算
随着总线上的设备不断的增多,总线上的容值也随之增大。设备接入总线,相当于电容的并联,电容并联公式:

C = C1 + C2 + C3 + ...

在不考虑上拉和 MOS 驱动电路,仅从电容充放电的角度看,当 R 和 C 越大,电平变换时间越大。

【InterFace】I2C 总线详述相关推荐

  1. I2C总线时序以及ACK和NACK(NAK),SCL被从机拉低?

    1.I2C协议详解及裸机程序分析 - 简书(通俗易懂) 根据上图,我们首先设置IICCON(来设置时钟),时钟源是PCLK(是50MHZ)太快了我们需要设置这个分频系数,把时钟降低,降低到我们想要的S ...

  2. omap3630 linux i2c总线驱动分析,OMAP3630 Linux I2C总线驱动分析

    4 OMAP3630 I2C device驱动在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以xxxx项目 ...

  3. Linux设备驱动---OMAP3630 Linux I2C总线驱动分析(2)

    4 OMAP3630 I2C device驱动     在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以x ...

  4. OMAP3630 Linux I2C总线驱动分析(2)

    4 OMAP3630 I2C device驱动     在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以x ...

  5. SPI与I2C总线协议

    目录: 一.SPI总线协议 1.什么是SPI 2.技术性能 3.接口定义与硬件连接 4.内部结构 5.传输时序 6.高速SPI 1)硬件电路   2)1MHz SPI传输问题 二.I2C总线协议 1. ...

  6. STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片)

    STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片) 基于SSD1306驱动芯片的OLED模块有多种型号,有0.91英寸,0.96英寸等等.OLED采用单色显示方 ...

  7. OMAP3630 Linux I2C总线驱动分析(1)

    1 Linux I2C驱动架构 Linux下I2C驱动的架构图如下: 图1.1 Linux下I2C驱动架构 如上图所示,每条I2C总线会对应一个adapter,而每条I2C总线上则可以有多个 clie ...

  8. Linux设备驱动---OMAP3630 Linux I2C总线驱动分析(1)

    原文地址:http://blog.csdn.net/kellycan/article/details/6394737 1 Linux I2C驱动架构 Linux下I2C驱动的架构图如下: 图1.1 L ...

  9. OMAP3630 Linux I2C总线驱动分析

    1 Linux I2C驱动架构 Linux下I2C驱动的架构图如下: 图1.1 Linux下I2C驱动架构 如上图所示,每条I2C总线会对应一个adapter,而每条I2C总线上则可以有多个 clie ...

最新文章

  1. python自动生成鸡汤文_20行python代码实现鸡汤智能生成器
  2. 转载-如何应对在线故障
  3. Base64编码算法
  4. 安装+wordpress+出现403+forbidden_教程篇 | WordPress网站搭建详细教程
  5. 大数据学习系列----基于Spark Streaming流式计算
  6. 深圳SQL数据库823报错修复
  7. word2vec相关资料
  8. java 打印 模板_Java输入输出模板
  9. 15 张图阅尽人工智能现状
  10. java中的构造方法与代码块
  11. 包学习(一款安卓端小学到高中全部课程精讲APP)
  12. android View 绘制完成监听
  13. Eclipse离线安装Emmet插件----web开发者绝对熟悉的插件之一
  14. 得力考勤机excel密码_可以修改原始考勤记录数据的是哪种人脸指纹考勤机?
  15. 【信号检测】基于隐马尔可夫模型HMM算法实现睡眠状态检测matlab代码
  16. PDF模板查找关键字坐标
  17. html表格边框去重复,css怎么解决表格边框线重复问题.
  18. 泛微oa明细表添加按钮_泛微OA系统表结构说明文档(20161121135308)
  19. sql日期中文大写显示
  20. Word文档中批量修改英文、中文或数字等的字体和格式的方法

热门文章

  1. Linux网络配置后无法正常上网
  2. ZYNQ - 无DDR固化程序(代码运行在OCM上)
  3. MACD指标在外汇交易中的另类运用方法
  4. 思科服务器怎么看型号,通过型号快速识别思科路由器,交换机,服务器等设备
  5. The Webpage might be temporarily down or it may have moved permanently to a new web address解决
  6. c语言record的作用,C语言基础 record 2-指针,结构体,链表,文件的输入输出
  7. 阿里云ECS服务器安装宝塔BT面板图文教程
  8. C 语言 rand() 和 srand() 使用方法
  9. 【Java面向对象编程——喂养三种宠物】
  10. Cannot resolve MVC View ‘XXX‘问题解决(路径跳转不过去)