如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78738305

网上的资料很多,但是大多讲解的不太全面。如果只是单纯的讲一下I2C总线协议,那就没必要再写了。因为MPU6050 开发部分已经将 I2C 通信协议,讲的很清楚了。但是I2C设备驱动、上拉电阻取值、设备地址、电路设计、I2C仲裁、Linux下配置等都还没细讲。So,这篇文章的目的应该是讲一种方法,以后遇到I2C设备知道从哪入手。接下来主要以AT24C02、MT9P031、MPU6050 为例,展开对I2C最后的总攻。

一、概述

参看:I2C -- 维基百科

I2C(Inter-Integrated Circuit)字面上的意思是集成电路之间,它其实是I2C Bus简称,所以中文应该叫集成电路总线,它是一种串行通信总线(同步、半双工、非差分、低速率),使用多主从架构,由飞利浦(Philips)公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。I2C的正确读法为“I平方C”("I-squared-C"),而“I二C”("I-two-C")则是另一种错误但被广泛使用的读法。自2006年11月1日起,使用I2C协议已经不需要支付专利费,但制造商仍然需要付费以获取I2C从属设备地址。

(1)设计概述

I2C只使用两条双向漏极开路(Open Drain)(串行数据(SDA)及串行时钟频率(SCL))利用电阻将电位上拉。I2C允许相当大的工作电压范围,但典型的电压准位为+3.3V或+5v
I2C的参考设计使用一个7比特长度的地址空间但保留了16个地址,所以在一组总线最多可和112个节点通信[a]。常见的I2C总线依传输速率的不同而有不同的模式:标准模式(100 Kbit/s)、低速模式(10 Kbit/s),但时钟频率可被允许下降至零,这代表可以暂停通信。而新一代的I2C总线可以和更多的节点(支持10比特长度的地址空间)以更快的速率通信:快速模式(400 Kbit/s)、高速模式(3.4 Mbit/s)
虽然最大的节点数目是被地址空间所限制住,但实际上也会被总线上的总电容所限制住,一般而言为400 pF

(2)修订

原始的I²C系统是在1980年代所创建的一种简单的内部总线系统,当时主要的用途在于控制由飞利浦所生产的芯片。

  • 1992年完成了最初的标准版本发布,新增了传输速率为400 kbit/s的快速模式及长度为10比特的地址模式可容纳最多1008个节点。
  • 1998年发布了2.0版,新增了传输速率为3.4Mbit/s的高速模式并为了节省能源而减少了电压及电流的需求。
  • 2.1版则在2001年完成,这是一个对2.0版做一些小修正,
  • 3.0版于2007年发布。
  • 2012年2月13日发布Specification Rev. 新增 5-MHz的超快速模式(UFM)
  • 2012年,第4版增加5 MHz的超快速模式(UFM),使用推挽式逻辑没有上拉电阻新的USDA和USCS线,并增加了制造商指定的ID表。
  • 2012年,第5版修正错误。
  • 在2014年,第6版纠正了两个图。这是目前最新的标准。[1]

(3)应用

I²C被应用在简单且其制造成本较传输速度更为重要的外设上。一些常见的应用如下:

  • 为了保存用户的设置而访问NVRAM芯片。
  • 访问低速的数字类比转换器(DAC)。
  • 访问低速的类比数字转换器(ADC)。
  • 改变监视器的对比度、色调及色彩平衡设置(视频数据通道)。
  • 改变音量大小。
  • 获取硬件监视及诊断数据,例如中央处理器的温度及风扇转速。
  • 读取实时时钟(Real-time clock)。
  • 在系统设备中用来打开或关闭电源供应。

I²C的另一个强大用途在于微控制器的应用,利用两根通用的输入输出接脚及软件的规划,可以让微控制器控制一个小型网络。

外设可以在系统仍然在运作的同时加入或移出总线,这代表对于有热插拔需求的设备而言是个理想的总线。

像I²C这样的总线之所以流行起来,是因为计算机工程师发现到对于集成电路设计而言,许多的制造成本源自于封装尺寸及接脚数量。更小的包装通常能够减少重量及电源的消耗,这对于移动电话及手持式电脑而言格外重要。

二、I2C设备介绍

上面有提到 I2C 的一些常见应用,接下来主要以 AT24C02、MT9P031、MPU6050 为例,先介绍一下这三个设备。主要的目的是讲芯片手册都看些什么?

(1)AT24C02 介绍

1)简介

AT24C02 是 ATMEL 生产的串行电可擦写可编程只读存储器(EEPROM),其存储容量为256×8bit,适用电压范围为2~5V。封装如下:

关于芯片封装更多知识,参看:嵌入式基本知识必备

2)引脚

3)结构与设备寻址

AT24C02的存储容量为2K bit,内容分成32页,每页8Byte,共256Byte,操作时有两种寻址方式:芯片寻址和片内子地址寻址。
(1)芯片寻址:AT24C02的芯片地址为1010,其地址控制字格式为1010A2A1A0R/W。其中A2,A1,A0可编程地址选择位。A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。R/W为芯片读写控制位,该位为0,表示芯片进行写操作。由于A2A1A0共有 8 种组合,系统最多可外接 8 片AT24C02。

(2)片内子地址寻址:芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为00~FF,共256个寻址单位。

说明:

上面说的这些芯片手册上都有介绍的:

Pin Description(引脚描述)

Memory Organization(内存组织)

Device Address(设备地址)

4)写操作

字节写入方式:

页写入方式:

5)读操作

随机读方式:

连续读方式:

6)I2C协议

时钟和数据传输:

SDA引脚通常通过外部设备拉高。SDA引脚上的数据只能在SCL低电平期间改变,SCL高电平期间的数据变化将指示开始或停止。

起始位和停止位:

开始条件:SCL为高电平的SDA从高电平变为低电平是一个开始条件,这必须在任何其他命令之前。
停止条件:SCL为高电平的SDA从低到高跳变是停止条件。在读取序列之后,停止命令将把EEPROM置于备用电源。

应答:

所有地址和数据字串行传输EEPROM中的8位字。 EEPROM发送一个低电平来确认它有收到每一个字。这发生在第九个时钟周期。

7)时间

时间选择如下:

这里的时间也就是写I2C程序时候的延时时间:

AT24C02芯片手册,搞清楚这些基本上就可以上手来开发了。如果是硬件工程师的话可能还需要看看电压什么的。

(2)MT9P031介绍

1)简介

1 / 2.5英寸500万像素CMOS数码图像传感器,这个在DM368开发的时候用到过。

2)引脚

3)I2C协议

Serial Bus Description (串行总线描述)

通过双线串行接口总线向MT9P031写入和读取寄存器。 MT9P031是串行接口从机,由串行接口主机驱动的串行时钟(SCLK)控制。 通过串行数据(SDATA)线将数据传入和传出MT9P031。 SDATA线通过一个1.5kΩ的电阻上拉到VDD_IO片外。 从设备或主设备可以将SDATA线拉低 - 串行接口协议决定哪个设备可以在任何给定时间拉下SDATA线。

其中设备地址:

双线串行接口器件的8位地址由7位地址和1位方向组成。 地址的LSB(最低有效位)中的“0”表示写入模式(0xBA),“1”表示读取模式(0xBB)。

那么,设备地址应为 0101 1101 = 0x5d (去掉R/W位,高位补0)

4)写操作

5)读操作

6)其他

MT9P031手册除了看I2C部分,还有其他需要看的。这里就说一下,开发过程中遇到的两个硬件设计的问题。

问题一: 首先上手遇到的问题是MT9P031sensor板子没有波形

MT9P031第31引脚 EXTCLK 应外接24Mhz时钟。
该设计确接的是 c18 引脚

据查:C18引脚没有作为输出时钟的作用。只有可以作为晶振输出频率范围的的作用

而像CKLOUT才是 时钟输出引脚:

问题二:启动信息错误,无法检测到MT9P031芯片

mt9p031 1-005d: No MT9P031 chip detected, register read ffffff87
vpfe-capture vpfe-capture: v4l2 sub device mt9p031 register fails  

通过示波器测试,i2c 的有时钟信号,通过数据线波形可以看到写地址为 0xBA,但是没有应答 ACK。等待一段时间后再发,还是没有应答。 说明核心板有发送设备地址给 MT9P031 的,只不过没有应答。经查 MT9P031 小板,第13 引脚应为高电平才会回应设备 ID  0xBA。但是我们的硬件设计为低电平了。问题找到。

正确的内核启动信息:

mt9p031 1-005d: Detected a MT9P031 chip ID 1801
mt9p031 1-005d: mt9p031 1-005d decoder driver registered !!
vpfe-capture vpfe-capture: v4l2 sub device mt9p031 registered
vpfe_register_ccdc_device: DM365 ISIF
DM365 ISIF is registered with vpfe.  

(3)MPU6050介绍

MPU6050 三维角度传感器包含三轴加速度计电子陀螺仪,刚写完MPU6050开发,所以这里就不做介绍了。

主要阅读datasheet 第9章 Digital Interface

参看:MPU6050开发 -- 进阶之I2C/SPI通信协议

参看:MPU6050开发 -- 在 C52 单片机上测试

参看:MPU6050开发 -- 测试程序分析

上面这三篇文章,除了介绍MPU6050芯片手册里的I2C协议,其中的程序也可当做在单片机上I2C测试程序的示例。

(4)总结

AT24C02、MT9P031、MPU6050这三个设备已经介绍完了。可以发现,阅读芯片手册I2C通信主要分为下面几部分。

1、引脚 (pin)

得出 SDA和SCL在哪个引脚上

2、设备地址 (address)

得出写地址和读地址是什么

3、片内子地址寻址定义或寄存器定义(word address)

得出片内寄存器地址是什么

4、I2C通信协议 (bus)

通信协议是一致的。起始位(Start)、停止位(Stop)、应答(Acknowledge),需要知道它们的条件,还有延时时间。

三、电路设计

然后我们分别看一下AT24C02、MT9P031、MPU6050这三个设备的电路设计。

(1)AT24C02电路设计

(2)MT9P031电路设计

(3)MPU6050电路设计

那么问题来了,上拉电阻取值是如何选择的??

四、上拉电阻取值

I2C(Inter-Intergrated Circuit)总线是微电子通信控制领域中常用的一种总线标准,具有接线少,控制方式简单,通信速率高等优点。  分为标准模式(100 kbit/s)、快速模式(400 kbit/s)、快速模式Plus(Fm+)(1 Mbit/s)、高速模式(3.4 Mbit/s)、超快速模式(5 Mbit/s)。

I2C总线的内部结构图如下图所示,I2C器件连接到总线输出级必须是集电极开路或漏极开路形式才能实现线“与”的逻辑功能。输出端未接上拉电阻的时候只能输出低电平,所示保证I2C总线正常工作输出端必须接上拉电阻。

在I2C电路中常见的上拉电阻是1K,1.5K,2.2K,3.3K,4.7K,5.1K,10K等等,但选哪一个阻值更合适?

上图中除了一对提升电阻Rp之外,还有每个I2C设备依现况的需要可选择加装一对抗干扰用的电阻Rs(尤其是当SDA,SCL的布线绕经特殊干扰源时)。
应用 I2C 时,最麻烦的是计算Rp的阻值,及为各个晶片选择合适的 Rs 阻值。例如:现今的智慧型手机,汇流排上少说就有:罗盘(地磁仪,多轴),陀螺仪(多轴),加速计(多轴),高度计,温度计,湿度计,环境光线...等等 I2C 晶片。
Rs 需要依照各个晶片实际受干扰的情况选择,但阻值一般会限制在 ≦Rp / 10(或约330欧姆)。因为一但Rs不为0,晶片真正的Rp(总)会变成是Rp + Rs,选择太大的Rs会使Rp(Total)Rp太多,影响该晶片的运作。 Rp一般为2K~7K Ohm,Rp数值小传输的波形会比较接近方波,但比较耗电; Rp数值大虽然比较省电,但传输的波形就会比较容易受电路上电容充放电的影响而变了样。不过因为Rp的数值会影响整个汇流排是否可以顺畅工作,一般会需要依据I2C的规范来计算而不是用试误法去猜

下面列出了Rp的最大值和最小值公式  (依据NXP目前最新的I2C规范文件第55页)

Rp(max) = tr/(0.8473 x Cb)
    Rp(min) = (Vdd-VOL(max))/IOL

那这两个公式是如何得到的呢?来看一下:

(1)公式推导

1》 Rp(max) = tr/(0.8473 x Cb)

总线电容是导线,连接和引脚的总电容。 由于指定的上升时间,这个电容限制Rp的最大值。下图显示了Rp(max)作为总线电容的函数。

由于各种不同的技术设备(CMOS,NMOS,双极),可以连接到I2C总线,逻辑“0”(LOW)和“1”(HIGH)的电平不固定并取决于VDD的相关电平。输入参考电平设置为VDD的30%和70% VIL为 0.3VDD,VIH为 0.7VDD 一些传统器件的输入电平固定在VIL = 1.5 V和VIH = 3.0 V,但是所有新器件都需要这个30%/ 70%的规格。

I2C规范将低于VIL或0.3VDD的电压定义为逻辑低电平,同样将高于VIH或0.7VDD的电压定义为逻辑高电平。然后考虑在VDD 的相关的输入阈VIH = 0.7VDD 和 VIL = 0.3VDD 为目的RC时间常数计算的。

那么 V(t) = VDD (1 - e-t / RC) ,其中 t 是从充电开始的时间,RC 是时间常数。

V(t1) = 0.3 × VDD = VDD (1 - e-t1 / RC);  那么 t1 = 0.3566749 × RC
    V(t2) = 0.7 × VDD = VDD (1 - e-t2 / RC);  那么 t2 = 1.2039729 × RC
    T = t2 - t1 = 0.8473 × RC

最后得出公式:Rp(max) = tr/(0.8473 x Cb)

其中最大Rp为标准模式、快速模式和快速模式Plus下的总线电容的函数。

对于每种模式,Rp(max)是下表中上升时间最大值(tr)和估算的总线电容(Cb)的函数:

注: (各种模式下的延时时间,你也需要搞清楚哦)

根据上表可以看出,由于不同模式下,上升沿的最大时间及总线负载最大容限要求不同,标准模式、快速模式、快速模式Plus分别是:1000ns/400pF、300ns/400pF、120ns/550pF。

将对应的数值代入式子中,我们很快就可以算出,采用快速模式的情况下:

Cb 为 50pF时  Rp(max) = 300/(0.8473 x 50) = 7.081K Ohm,

Cb 为 100pF时Rp(max) = 300/(0.8473 x 100) = 3.541K Ohm。

2》Rp(min) = (Vdd-VOL(max))/IOL

由于规定的最小值,电源电压限制了电阻Rp的最小值,标准模式和快速模式的灌电流为3 mA,快速模式的灌电流为20 mA。

允许总线电压拉低的最小上拉电阻公式:Rp(min) = (Vdd-VOL(max))/IOL 

得出,Rp(min)与VDD的关系如图下图所示:

各模式下,VOL 低电平输出电压、IOL低电平输出电流取值如下如表:

将对应的数值代入式子中,我们很快就可以算出,在采用标准模式和快速模式的情况下:

Vdd 为 5V时  Rp(min) = (5-0.4)/3= 1.533 K Ohm,

Vdd 为3.3V时 Rp(min) = (3.3-0.4)/3= 966 Ohm。

由上面的计算可得出快速模式下,Vdd 为 5V时,上拉电阻 Rp 可以取的范围是 1.53K~7K ,一般取 5.1K 。
同理到 3.3V VDD 低功耗设计中,通常选用 4.7K 牺牲速度换取电池使用时间,此阻值也是常规阻值。

关于 I2C 的上拉电阻,最好的方式是看官方给出的参考设计,如果走线长了或总线上有多从机,就相应把电阻改小一些, 如若参考设计没有就在计算范围内选用一个常规阻值。实际的时候我们没有去测量总线电容的问题,只能在选件、走线的时候给予些许关注。

那么问题又来了,标准模式、快速模式等的传输速率是知道,但是该如何判断I2C设备是什么模式下传输的呢?或者说I2C的传输速率由什么决定?

五、I2C传输速率

IIC的传输速率由“时钟线上(SCL)的时钟频率”决定。具体用哪一个模式,需要你根据硬件手册进行设定。手册上面会有标明最高速率,只要不超过最好速率都可以。单片机一般常用400kbit/s或以下。

为此我们再看一下 AT24C02、MT9P031、MPU6050 的芯片手册。

(1)AT24C02 手册

可以看出来,2.7V或5V时,SCL时钟频率最大值为 400KHz。

时钟频率单位(Hz) 和 时间单位(s)换算为:1 Hz = 1 /s

因此可以得出,AT24C02 的 I2C 数据传输速率应该是快速模式(400 Kbit/s) 

(2)MT9P031 手册

可以看出来,串行接口输入时钟频率最大值为 400KHz。

同上,得出 MT9P031 的 I2C 数据传输速率应该是快速模式(400 Kbit/s) 。

(3)MPU6050 手册

可以看出来,SCL 时钟频率最大值为 400KHz。

同上,得出 MPU6050 的 I2C 数据传输速率应该是快速模式(400 Kbit/s) 。

六、总结

结合三个I2C设备,大体介绍了一下关于芯片手册I2C部分,都应该看些什么,它的上拉电阻取值和传输速率模式选择

然后电阻、晶振还有一些小知识点之前讲过的可以看一下。

参看:Hi3516A开发--电阻分压阻值计算

参看:Hi3516A开发--RTC电路

最后提供一下,参看的相关手册:

下载:相关手册

参看博文:

参看:I2C bus 簡介 (Inter-Integrated Circuit Bus)

参看:I2C Bus 提升電阻之計算

参看:I2C – What’s That?

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78738305

S5PV210开发 -- I2C 你知道多少?(一)相关推荐

  1. S5PV210开发 -- I2C 你知道多少?(三)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78835639 I2C部分已经接近尾声了,接下来我们回过头来看一下剩下的一些小 ...

  2. S5PV210开发 -- I2C 你知道多少?(二)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78782558 上一篇主要是介绍了下芯片手册 I2C 部分,都应该看些什么,以 ...

  3. S5PV210开发 -- 前言

    这段时间终于把图像和流媒体部分的内容如 FFmpeg.MP4V2.LIVE555.RTSP.H.264 等过了一遍,然后做了一个PM2.5采集项目,学习了MQTT. 接下来我们会以基于 210v3开发 ...

  4. S5PV210开发 -- 串口驱动开发

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78579074 上篇文章讲的 UART,更多的是硬件相关的知识.接下来进入正题 ...

  5. S5PV210开发 -- QT4.8 移植

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78498784 今天应网友要求给他,生成一下nand平台的根文件系统.由此简单 ...

  6. S5PV210开发 -- 启动流程

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78433564 讲完启动模式.烧写更新,接下来我们看一下启动流程. 参看:S5 ...

  7. S5PV210开发 -- 通过 DNW、fastboot 烧写

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78364548 这个烧写过程真是一波三折啊,足足搞了两天才实现  通过 DNW ...

  8. 三星官方smdkv210 uboot移植到我的s5pv210开发板

    北京 2020-7-26 19:44 周日 昨天外面闷热 今日凉快.空调一开啥事没有!O(∩_∩)O 用了差不多两个周末蹲家里移植的.进度比较慢,算是把uboot相关的一些东西基本了解了. uboot ...

  9. S5PV210开发 -- TTL和CMOS电平

    接着 S5PV210开发 -- UART 详解 来讲,里面提到 TTL和RS232电平. RS232 电平 逻辑1:-3V~-15V 逻辑0:+3V~+15V TTL 电平 逻辑1:+2V~+5V 逻 ...

最新文章

  1. Spring MVC环境中的文件上传功能实现
  2. 路径规划(Path Planning)与运动规划(Motion Planning)
  3. 机器学习与推荐系统实践
  4. 解决SQL Server管理器无法连接远程数据库Error: 1326错误
  5. 2019-06-26 某小型支付公司面试经历
  6. Mysql 多表联合查询效率分析及优化
  7. 美团广告实时索引的设计与实现
  8. oneproxy mysql_在OneProxy的基础上实行MySQL读写分离与负载均衡
  9. java怎么确定数据在区间内_电脑数据怎么恢复详细篇,我们该如何确定故障如何进行数据恢复!...
  10. python replace函数后面的数字的含义
  11. 精于图片处理的10款jQuery插件
  12. 带接口的webservice方式发布
  13. ASCII码表 256位
  14. 做产品路线图规划用什么工具?
  15. excel单元格下拉选项怎么设置_单元格下拉效果怎么实现?
  16. USB SS-PHY Tuning
  17. 7-17 最长对称子串
  18. 为什么我魅族m2显示无服务器,魅族m2升级刷机flyme4.0教程及注意事项.doc
  19. python3or5的值_详解python中and和or的返回值
  20. Oracle 数据库创建数据库和表

热门文章

  1. 数据结构课程设计报告 单位员工通讯录管理系统(线性表的应用)
  2. zookeeper:[WorkerSender[myid=2]:QuorumCnxManager@584] - Cannot open channel to 3 at election address
  3. MySQL8从入门到精通学习笔记
  4. 飞机大战的部分思路框架及其代码实现
  5. Java利用多线程编程实现一个正在旋转的地球
  6. 遥感IDL二次开发(辐射定标)
  7. 生鲜配送系统有哪些功能?搭建生鲜配送系统有什么优势?
  8. 最新云海授权系统源码绿色版+UI非常好看
  9. 线性不定方程与线性同余方程
  10. GD32F103C读写flash