【InterFace】I2C 总线详述
背景
昨天出去了一趟,人问:你熟悉什么?答:软硬件。结果,好尴尬。
硬件一般都做什么内容?
答:电源设计。
能说下升压、降压电路是怎么实现的吗?
答:不能。(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 总线详述相关推荐
- I2C总线时序以及ACK和NACK(NAK),SCL被从机拉低?
1.I2C协议详解及裸机程序分析 - 简书(通俗易懂) 根据上图,我们首先设置IICCON(来设置时钟),时钟源是PCLK(是50MHZ)太快了我们需要设置这个分频系数,把时钟降低,降低到我们想要的S ...
- omap3630 linux i2c总线驱动分析,OMAP3630 Linux I2C总线驱动分析
4 OMAP3630 I2C device驱动在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以xxxx项目 ...
- Linux设备驱动---OMAP3630 Linux I2C总线驱动分析(2)
4 OMAP3630 I2C device驱动 在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以x ...
- OMAP3630 Linux I2C总线驱动分析(2)
4 OMAP3630 I2C device驱动 在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以x ...
- SPI与I2C总线协议
目录: 一.SPI总线协议 1.什么是SPI 2.技术性能 3.接口定义与硬件连接 4.内部结构 5.传输时序 6.高速SPI 1)硬件电路 2)1MHz SPI传输问题 二.I2C总线协议 1. ...
- STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片)
STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片) 基于SSD1306驱动芯片的OLED模块有多种型号,有0.91英寸,0.96英寸等等.OLED采用单色显示方 ...
- OMAP3630 Linux I2C总线驱动分析(1)
1 Linux I2C驱动架构 Linux下I2C驱动的架构图如下: 图1.1 Linux下I2C驱动架构 如上图所示,每条I2C总线会对应一个adapter,而每条I2C总线上则可以有多个 clie ...
- Linux设备驱动---OMAP3630 Linux I2C总线驱动分析(1)
原文地址:http://blog.csdn.net/kellycan/article/details/6394737 1 Linux I2C驱动架构 Linux下I2C驱动的架构图如下: 图1.1 L ...
- OMAP3630 Linux I2C总线驱动分析
1 Linux I2C驱动架构 Linux下I2C驱动的架构图如下: 图1.1 Linux下I2C驱动架构 如上图所示,每条I2C总线会对应一个adapter,而每条I2C总线上则可以有多个 clie ...
最新文章
- python自动生成鸡汤文_20行python代码实现鸡汤智能生成器
- 转载-如何应对在线故障
- Base64编码算法
- 安装+wordpress+出现403+forbidden_教程篇 | WordPress网站搭建详细教程
- 大数据学习系列----基于Spark Streaming流式计算
- 深圳SQL数据库823报错修复
- word2vec相关资料
- java 打印 模板_Java输入输出模板
- 15 张图阅尽人工智能现状
- java中的构造方法与代码块
- 包学习(一款安卓端小学到高中全部课程精讲APP)
- android View 绘制完成监听
- Eclipse离线安装Emmet插件----web开发者绝对熟悉的插件之一
- 得力考勤机excel密码_可以修改原始考勤记录数据的是哪种人脸指纹考勤机?
- 【信号检测】基于隐马尔可夫模型HMM算法实现睡眠状态检测matlab代码
- PDF模板查找关键字坐标
- html表格边框去重复,css怎么解决表格边框线重复问题.
- 泛微oa明细表添加按钮_泛微OA系统表结构说明文档(20161121135308)
- sql日期中文大写显示
- Word文档中批量修改英文、中文或数字等的字体和格式的方法
热门文章
- Linux网络配置后无法正常上网
- ZYNQ - 无DDR固化程序(代码运行在OCM上)
- MACD指标在外汇交易中的另类运用方法
- 思科服务器怎么看型号,通过型号快速识别思科路由器,交换机,服务器等设备
- The Webpage might be temporarily down or it may have moved permanently to a new web address解决
- c语言record的作用,C语言基础 record 2-指针,结构体,链表,文件的输入输出
- 阿里云ECS服务器安装宝塔BT面板图文教程
- C 语言 rand() 和 srand() 使用方法
- 【Java面向对象编程——喂养三种宠物】
- Cannot resolve MVC View ‘XXX‘问题解决(路径跳转不过去)