i2c协议分析

i2c简介

  I2C 总线是飞利浦在 80 年代初设计的,可让位于同一电路板上的组件之间轻松通信。飞利浦半导体于 2006 年迁移到 NXP。
I2C 这个名字翻译成“Inter IC”。有时总线称为 IIC 或 I²C 总线。
  
  I2C总线是一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

术语

术语描述
transmitter(发送方)向总线发送数据的设备
receiver(接收方)从总线接收数据的设备
master(主机)发起传输、产生时钟信号、终止传输的设备
slaver(从机)由主机编址的设备
multi-master (多主机)在同一时间可以被超过一个主机尝试控制总线,并且信息不被破坏
arbitration(仲裁)在流程上确保多个主机同时试图控制总线时,只有一个主机能被控制,并且信息不被破坏
synchronize(同步)在流程上同步两个或更多个设备的时钟信号

特性

  1、只需要两根总线:一根串行数据线,一根时钟线
  2、连接到总线上的每个设备都可以通过唯一的地址进行寻址;并且始终存在简单的主从关系;设备既可以做发射机也可以做 接收机
  3、i2c总线是一个真正的多主机总线,包含碰撞检测和仲裁来防止两个或更多主机同时发起数据传输造成的数据损坏
  4、串行,面向8bit传输,支持双向数据传输,在standard mode下最高可以达到100kbit/s, 在fast mode下最高可以达到  400kbit/s,在high-speed mode下最高可以达到3.4Mbit/s
  5、拥有片上滤波用于抑制数据总线上的峰值来保持数据的完整性
  6、可以连接在同一总线上的设备数量只受最大总线电容400pF的限制

协议格式

  想想开始学习的时候总有那么多为什么,但有些时候,没有为什么,问就是协议规定的;

数据有效性

数据有效性  要使数据传输有效,SDA线上的数据必须在时钟的HIGH周期内保持稳定。只有当SCL线上的时钟信号为LOW时,数据线的HIGH或LOW状态才允许改变

开始和停止条件

开始和停止条件  根据数据有效性, 在I2C总线的数据传输过程中总是低电平变换高电平保持。
  如果我们认为在SCL在低电平时SDA发生了变化,而这个动作除了数据变化还有其他的功能,我们能怎么认为呢,是数据还是其他功能?在复用的情况下是不好确定的,需要加许多的条件来佐证“猜测”,而在数据的传输过程中这种不确定性是不被允许的,所以开始和停止条件只能看其他的情况。
  i2c协议要求数据当SCL为高时在SDA上要保持,那么当保持的这个状态被破坏时,就不能认为是数据了,这就有了特殊的条件:
  当SCL 为HIGH时, SDA 从HIGH变为LOW,定义为START 条件
  当SCL 为HIGH时, SDA 从LOW变为HIGH,定义为STOP 条件
  START 和 STOP 由master产生,且在START后总线被认为是busy,RESTART 后同样认为是busy,STOP后的一段时间总线被认为是空闲

数据传输

数据传输
  SDA行上的每个字节必须是8位长的。每次传输可传输的字节数不受限制。每个字节后面必须跟一个确认位。数据首先由最高有效位(MSB)传输。如果一个从机正在执行一些程序,暂时不能接收或发送另一个完整的字节数据,例如服务内部中断,它可以保持时钟线SCL低,迫使主机进入一个等待状态,当从机准备好接收另一个字节的数据并释放时钟线SCL时,数据传输就会继续。

应答

在这里插入图片描述
  数据传输与确认是必须的。确认相关的时钟脉冲由主机产生。发射机在确认时钟脉冲期间释放SDA线(HIGH)。接收端必须在确认时钟脉冲期间拉下SDA线,以使其在时钟为HIGH时保持稳定的LOW。
  
  当产生一个not-ack,即在确认时钟为HIGH时由slaver保持;master可以产生一个STOP或repeated START来尝试新的传输。
协议标准中列举了几个例子,看起来有点拗口,想要表达的是接收方一定要给响应,可以接收给ACK,不能接收给NOT-ACK,开始可以接收,中间不能接收了还是要给NOT-ACK,不论是master还是slaver,只要作为接收方就需要给ACK;

同步

  在多主机系统下,时钟的同步是通过线与的方式实现的,对于最终表现出来的SCL来说是多个CLK相与之后的结果(这里的CLK指的是不同的master在SCL线上期望产生的时钟)
在这里插入图片描述  既然是“与”,那么就遵循有低则低,全高才高这条原则。
这样再来看上面的图,开始时CLK都为高则SCL也为高,第一个冲突发生时CLK1变为低,而CLK2仍希望保持为高,按照线与原则最终SCL表现为低;到了第二个冲突时CLK2由高变低,而CLK1处于低状态,SCL 为低,counter reset我们下面再说;第三个冲突时CLK1期望拉高,CLK2处于低状态,SCL仍 为低,此时CLK1将处于等待状态,等待SCL线被释放(即SCL为高),注意这里说的是SCL线,而不仅仅是当前的CLK2;到了第四个冲突点,CLK2拉高,CLK1本就处于等待状态立即为高,SCL表现为高。这样整个同步过程就结束了。
  其实我们用图例来分析可以说是“线与”原则,在硬件层面上来看的话就是高拉低是很容易的,谁都可以拉,但为低(此时SCL接地,如下图)时其他“人”是没办法拉高的,I2C协议要求操作完成后要释放总线(为高)的原因就在这了。这样再去看图例,冲突3时不是单纯的软件说在等,而是硬件天然没办法达到拉高的要求必须等。
在这里插入图片描述  对于时钟同步过程协议规范中给出了结论:
  同步的SCL时钟产生时,其LOW周期由时钟LOW周期最长的设备决定,HIGH周期由时钟HIGH周期最短的设备决定。

仲裁

  I2C总线只有两根线,SCL上的冲突由同步解决,仲裁则用于解决SDA上的冲突竞争。和同步类似,仲裁采用的也是“线与”原则。
在这里插入图片描述
  在SCL为高时,DATA1和DATA2都产生了有效的START条件,根据“线与”原则,SDA上表现与最先产生START的DATA1一致;第一个周期DATA1和DATA2,SDA正常跟随;第二个低电平时,DATA1抢先拉低,SDA跟随DATA1;第三个低电平时情况发生了改变,DATA2期望保持低,而DATA1却想要拉高,再次根据“线与”原则,毫无疑问,SDA呈现低状态,此时master1上实际的状态与期望的状态不一致,那么本次数据就作废了,也就是仲裁失败了,之后的内容也就不关心了,当然尽管仲裁失败,它仍然可以产生时钟直到直接末尾;SDA跟随仲裁成功的DATA2走。
  和同步过程一样,看似是软件问题,其实硬件上早已给事情下了结论。由于同步和仲裁,i2c总线上的数据不会丢失
  有些人要问了,如果同步和仲裁同时发生,先管哪个? 事情并不复杂,SDA的发送需要依赖SCL,那么便是同步问题先得到解决。
  如果在串行传输过程中,当一个重复的START条件或STOP条件传输到i2c总线时,仲裁过程仍在进行中,则必须特别注意。如果有可能发生这样的情况,所涉及的主机必须在格式帧的相同位置发送重复的START或STOP条件。
换句话说,仲裁是不允许的:
     重复的START条件和数据位.
     停止条件和数据位
     重复起始条件和停止条件
  slave不参与仲裁程序。

利用同步的一种应用

  规范中提到了还是要说一下,这是一种利用同步的特性进行处理的方式;
  正常来说我们使用i2c协议是master发数据,发完之后等待ACK后下一个继续发送,那就存在一种情况,master是发了,但是slaver没处理完又要发了,怎么办?当然可以发NOT-ACK,那这笔数据是必须要发送的,但是slaver不应答,master怎么知道啥 时候slave能准备好呢,就算知道啥是准备好那是接着刚才的数据发送还是从头开始发送呢。
  利用同步的特性,slaveer在接收完第一笔数据时可以将SCL拉低,使master强行进入等待状态,等数据处理完再释放SCL,这样就能保证数据既能处理完又不会乱了。

i2c地址模式

  既然是主从模式,完整的数据传输应该要包含地址的,I2C协议发展到现在有两种地址模式7bit和10bit,其中10bit 地址模式在V1.0 1992年的标准中添加,10 bit address mode 支持1024个从机地址 。

7bit 模式

在这里插入图片描述
  数据传输遵循上图所示的格式。slaver address将在START条件产生后的第一个字节发送。
  在该模式下,1-7bit为address位;第8bit为R/W位(读写),为0表示写,为1表示读。
  标准传输如下图
在这里插入图片描述
  master发起传输(START)、产生时钟、终止传输(STOP)
  slaver 接收数据,产生应答
  有写就有读,读的时候数据发送者变成了slaver而应答者为接收数据的master
在这里插入图片描述
  复合模式下,先读再写,或先写再读,master可以在字节发送之后进行re-start,传输方向改变的时候起始条件和地址都会被重复,典型应用如eeprom
在这里插入图片描述

10bit 模式

  10bit address mode 支持1024个子设备,并且使用了保留位11110,当然正常情况下我们也用不上,另外条件允许的话推荐7bit的设备。
  传输协议如下,需要注意的是10bit mode和7bit mode混用的情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

i2c传输模式

  我这之前使用I2C都是运行在比较低的速率下,再加上本着能用就行的心态,就没去特别详细去了解过I2C的传输速率,这就造成了我一直认为i2c协议就是一个低速协议,但其实这玩意有好几种速度模式,standard mode、fast mode、high-speed mode、ultra-fast mode。奥创模式最高甚至能干到5Mb/s,简直难以置信,虽然那严格来说已经算不上i2c了。

standard mode

标准模式支持速率:0-100Kb/s

fast mode

  fast 模式支持速率:0-400Kb/s,这个模式还有一个plus版本即fast mode plus可以支持:0-1000Kb/s的传输速率
在V1.0 1992年的标准中添加,并且增加了斜波控制和输入滤波用以改善支持fast mode 的设备的EMC性能
fast mode向下兼容standard 模式,支持使用fast mode器件同样支持standard mode
  与标准模式相比,快速模式i2c总线具有以下额外特性:最大比特率提高到400kbit /s。串行数据(SDA)和串行时钟(SCL)信号的时间进行了调整。不需要与其他总线系统(如CBUS)兼容,因为它们无法在增加的比特率下运行。
  快速模式器件的输入在SDA和SCL输入处包括峰值抑制和施密特触发器。快速模式设备的输出缓冲器包含了SDA和SCL信号下降沿的斜率控制。如果快速模式设备的电源被关闭,SDA和SCL的I/O引脚必须是浮动的,这样它们就不会阻塞总线。连接到母线的外部上拉装置必须适应快速模式i2c母线较短的最大允许上升时间。对于负载高达200pf的母线,每条母线的上拉装置可以是一个电阻;对于200pf到400pf之间的总线负载,上拉设备可以作为电流源(最大3ma)或开关电阻电路

high speed mode

hs模式支持速率:0-3.4Mb/s
  在V2.0 1998年的标准中添加,为啥增加这么个模式呢,大抵是协议好用,用的人多了,被玩出花了,现在的速度不够用了这么些个理由,顺便再把功耗降低,就更好用(nb)了,百公里加速3.5,油耗仅需半个纳智捷谁不爱呢(手动狗头)
  Hs mode同样向下兼容fast mode和standard mode
  有一点 hs mode在传输过程中不执行同步和仲裁
   hs 模式较为特殊,一般用不到,后续补充说明,想知道的可以自行了解

保持时间

协议格式晓得了,切记准守保持时间 如下:
在这里插入图片描述
在这里插入图片描述

最后

  还有一些东西,有时间再加了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dsp中使用i2c协议来存储eeprom是一种常见的应用场景,下面我将通过一个实例来详细介绍这个过程。 首先,i2c是一种串行通信协议,用于在主设备和从设备之间进行数据传输。而eeprom是一种电子可擦写可编程只读存储器,可以在电源关闭的情况下持久保存数据。 在dsp中,使用i2c协议访问eeprom通常需要按照以下步骤进行: 1. 初始化i2c总线:在使用i2c之前,需要初始化i2c总线,设置控制寄存器和时钟等参数。这些参数通常根据eeprom的规格手册来配置。 2. 设置从设备地址:根据eeprom的规格手册,设置该eeprom的从设备地址。在i2c总线上,每个从设备都有一个唯一的地址,通过这个地址可以识别和访问该设备。 3. 写入数据:使用i2c协议,发送写入命令和数据到eeprom,将要保存的数据写入到eeprom的存储区域。 4. 读取数据:使用i2c协议,发送读取命令到eeprom,并从eeprom的存储区域读取数据。可以通过读取指定地址或者连续读取多个地址的方式获取需要的数据。 5. 关闭i2c总线:在完成数据读写操作后,关闭和释放i2c总线资源。 总结起来,dsp中使用i2c存储eeprom的实例分析主要涉及初始化i2c总线、设置从设备地址、写入数据、读取数据以及关闭i2c总线等过程。这些步骤可以根据具体的dsp和eeprom的规格手册进行具体的实现和调试。通过使用i2c协议来存储eeprom,可以实现dsp与外部存储器之间的数据交互,扩展dsp系统的存储容量和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值