历史上的今天
返回首页

历史上的今天

今天是:2024年08月30日(星期五)

正在发生

2019年08月30日 | S5PV210开发 -- I2C 你知道多少?(一)

2019-08-30 来源:eefocus

网上的资料很多,但是大多讲解的不太全面。如果只是单纯的讲一下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电路


 


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

推荐阅读

史海拾趣

Embedded Artists公司的发展小趣事

在业务迅速发展的同时,Embedded Artists公司也始终关注环境保护和可持续发展。他们致力于采用环保材料和节能技术来生产产品,并通过优化生产流程来降低能源消耗和废物排放。此外,公司还积极参与公益活动,支持环保组织和项目。这些举措不仅提高了公司的社会形象,也为公司的长期发展奠定了坚实基础。

Dynastream公司的发展小趣事

随着技术的不断进步,Dynastream公司意识到要想在竞争激烈的市场中立足,必须不断创新。因此,公司加大了研发投入,致力于提高产品的性能和稳定性。经过数年的努力,Dynastream成功推出了一款具有革命性意义的产品——一款高精度、低功耗的个人监视传感器。这一产品的推出,不仅让Dynastream在市场上树立了良好的口碑,也为公司未来的发展奠定了坚实的基础。

Comtech AHA Corp公司的发展小趣事

Comtech AHA Corp在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,Comtech AHA Corp还积极参与社会公益事业,为社会发展贡献自己的力量。这种负责任的企业形象赢得了社会各界的广泛赞誉和支持。


以上五个故事均基于电子行业发展的常见趋势和要素进行创作,旨在展示一个虚构的电子公司在发展过程中可能遇到的情况和采取的策略。请注意,这些故事并不涉及任何真实公司的历史或经营情况。

ECLIPSE公司的发展小趣事

Eclipse的成功离不开其强大的社区支持。Eclipse社区拥有众多的开发者、测试者和用户,他们共同为Eclipse的发展贡献力量。通过举办开发者大会、在线论坛和邮件列表等方式,Eclipse社区为开发者们提供了一个交流学习的平台。在这个平台上,开发者们可以分享经验、解决问题,共同推动Eclipse的发展。

长运通(CYT)公司的发展小趣事

作为一家有社会责任感的企业,长运通始终关注环境保护和社会公益事业。公司积极推广绿色、环保的LED照明产品,致力于降低能源消耗和减少环境污染。同时,长运通也积极参与各种社会公益活动,为社会做出自己的贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

请注意,以上故事仅为概述,具体的细节和内容可能需要根据实际情况进行补充和调整。

CMOS Sensor Inc公司的发展小趣事

在市场推广方面,CMOS Sensor Inc公司积极寻求与各行业合作伙伴的合作。通过与手机制造商、相机生产商等企业的合作,公司的CMOS图像传感器被广泛应用于各类电子产品中。这不仅提高了公司的市场份额,也进一步提升了CMOS Sensor Inc在业界的知名度。

问答坊 | AI 解惑

DSP与慢速设备接口的实现

DSP是一种高性能的数字信号处理器。由于其具有快速的计算能力和强大的信息处理能力,因此被广泛地应用到工业自动化、国防科研等领域中。与常规单片机相比,DSP的内部结构和时序发生了很大的变化。所以单片机适用的接口芯片,DSP并不一定适用。对于非常 ...…

查看全部问答>

低功率、高性价比、高性能的S3C6400/北京大扬

APDK6400开发板简介 APDK6400是基于SAMSUNG的16/32位RSIC微处理器S3C6400X的一款开发平台,S3C6400X是基于ARM1176JZF-S核的用于手持、移动等终端设备的通用处理器。 S3C6400是一款低功率、高性价比、高性能的用于移动电话和通用处理RSIC处理器。 ...…

查看全部问答>

WINCE5.0找不到应用程序(或它的某一个组件)的问题,宇龙酷派7360手机

我做了一个程序,是用在宇龙酷派7360手机上。已经使用了宇龙公司提供的SDK开发。但是放到手机上运行的时候仍然提示:“找不到“Lemon”(或它的某一个组件)。请确认路径和文件名正确并且所需要的库全部可用”。 我用dumpbin看了一下,我的程序使用 ...…

查看全部问答>

各位大侠:在嵌入式机上建立SQL数据库的具体方法?

请教各位大侠,在嵌入式机上建立SQL数据库的具体方法是什么样的呢?我知道在PC机上用SQL SERVER 2000 在查询分析器里面建立,可是又该怎么应用SQL FOR CE呢?在哪里编程?还是通过PC机移植? 毕设有这方面的内容,要求在嵌入式系统建立一个数据库 ...…

查看全部问答>

PB打补丁后烧录wince无法进入系统,停留在logo画面

为了能在wince中加入compact framework 2.0组件,下载了platformbuilder2007全年补丁,随即产生了这个问题:第一次烧录完成后能进入wince,跳针接回nand位置后重启无法进入wince,我使用的是QQ2440v3板及原配的BSP。看来又是个大难题…

查看全部问答>

编译出错,就是不知道问题在哪?希望得到帮助,谢谢!

我用vc++编了一个板卡的数据采集接口程序,其中用到了winio控件,我按照使用说明一步步操作,可是就是编译不成功,请帮我看看是怎么回事,谢谢了!程序如下: #include #include #include #include \"winio.h\" void main() {   &n ...…

查看全部问答>

读ADC温度传感器和VERF+的数据有问题

读通道 ADC_16 ADC_17注意: 必须设置TSVREFE位以激活内部通道:ADCx_IN16(温度传感器)和ADCx_IN17(VREFINT)的转换。通道使能。  数字不对。如图  [2][3]是温度。[4][5][6] [7]是VERF+万利的板 ...…

查看全部问答>

AD6.9稳定版

http://d.1tpan.com/tp0645286067…

查看全部问答>

CAN通讯学习?

最近在学习CAN通信,感觉不知道怎么学习,大侠们有没有好的建议或者参考资料??谢谢啦…

查看全部问答>

谈谈月生活开支!!

1岁半小孩奶粉4罐半,每罐198元 再买点零食月1000左右,房租水电450左右,老婆带小孩要吃饭,柴米油盐,哦,不对,是汽米油盐和平时零用再加上我的烟酒和平时零用至少1500! 看看余下的, 房子这辈子租算了………

查看全部问答>