I2C协议简单总结

基础概念

总线、串行总线、串行总线的同步/异步模式、常见串行总线

任何一个微处理器都要与一定数量的部件和外围设备连接,但如果将各部件和每一种外围设备都分别用一组线路与CPU直接连接,那么连线将会错综复杂。为了简化硬件电路设计,常用一组线路,配置以适当的接口电路,与各部件和外围设备连接,这组共用的连接线路被称为总线。 采用总线结构便于部件和设备的扩充,尤其制定了统一的总线标准则容易使不同设备间实现互连。

典型通信方式可以分为并行通信和串行通信,相应的通信总线被称为并行总线和串行总线。 主要差异在 传输数据量,传输速度,接口线资源暂用,传输距离上。并行通信速度快、实时性好,占用的口线多,通信距离限制(线路成本高并且抗干扰能力差),不适于小型化产品;而串行通信速率虽低,但在数据通信吞吐量不是很大的微处理电路中则显得更加简易、方便、灵活。
在这里插入图片描述
串行通信可分为异步和同步
同步就是双方有一个共同的时钟,当发送时,接收方同时准备接收。(比如I2C、SPI);异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,结束时有停止位(如UART)。

常见的串行总线:
SPI - Serial Peripheral Interface(串行外设接口),有主(Master - 控制器)和从(Slave - 外设)之分,在总线中也就只有一个“主人”,其它都是处于服从的位置,也就是Slave,它是一种有时钟信号的同步串行总线,从器件的寻址是靠专用的片选信号线SS来实现的;
I2C - Inter-Integrated Circuits(集成电路之间的连接),没有主次,也就是所有挂在总线上的器件都是平等的,它也是一种有时钟信号的同步串行总线,每个器件都有自己的地址,两根信号线都需要通过电阻上拉;
UART - universal asynchronous receiver/transmitter(通用异步收/发),异步串行总线,传输的信号中没有专用的时钟信号线。

I2C—一种简单、双向二线制同步串行总线

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。
在这里插入图片描述
总线特点:
1、i2c管脚的输出驱动都为漏极开路结构,必须外接上拉电阻,经验值一般在4.7-100K之间,让总线空闲状态时保持着高电平
2、i2c支持多主机与多从机,从机具有唯一的地址(相同器件受器件地址位的限制)。
3、i2c总线上主机与从机以8bit为单位进行双向传输,准通信速率是100Kbps,快速模式是400Kbps,高速模式支持3.4Mbps
4:I2C总线上扩展的器件的数量主要由电容负载来决定,其负载能力为400pF

I2C 数据传输—主器件提供时钟并发起传输,通过寻址数据通知对应从片接受或发送数据

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。主从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱, I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。

I2C总线的协议相关概念

传输如何开始和结束?—起始信号(时钟SCL高 SDA下降沿) 和 终止信号(时钟SCL高 SDA上升沿)

数据传输的起始信号和结束信号都是 主机发起的。 起始信号产生后总线就处于被占用的状态,在终止信号产生后总线就空闲。
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
如果连接到总线的器件合并了I2C接口硬件 那么用它们检测起始和停止条件十分简便,但是没有这种接口的微控制器在每个时钟周期至少要采样 SDA 线两次来判别有没有发生电平切换。
在这里插入图片描述

何如有效读取到数据?—数据有效性,时钟SCL高电平 数据SDA读取有效

I2C总线进行数据传送时**,时钟信号为高电平期间,数据线上的数据必须保持稳定**,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
在这里插入图片描述

数据传输的基本格式什么?什么是应答位?—按 字节+应答位 传输,共9位

I2C数据传输每次都是1个字节(8位),先传送最高位,每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
由于连接到 I2C 总线的器件有不同种类的工艺 CMOS NMOS 双极性 逻辑 0 低 和 1 高 的电平不是固定的 它由 VDD 的相关电平决定。
在这里插入图片描述
应答位:用于表示接受数据成功的反馈,响应位置的时钟脉冲由主机产生。此时发送端需要释放SDA数据线。在响应的时钟脉冲期间 接收器必须将 SDA 线拉低,表示应答ACK,如果没有拉低 表示 非应答。如果从机作为接受方,应答表示接受成功,非应答表示接受失败。如果是主机作为接收方,应答表示接受成功,非应答表示数据传输结束。

如何找到指定从机?表示读写方向?— 寻址约定 和 读写方向标志

I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。
在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位, 用“0”表示主机发送数据(W),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。

器件处理速率不匹配怎么办?—时钟延长,接收器主动拉低SCL使主机等待,用于内部事件处理

接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。 直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。
i2c通信要想保证数据正常通信成功,一般必须打开时钟延长功能,时钟延长功能针对从机设置。如果静止,可能会出现:1、接受到一个字节,但是还没有被内部读出来,就有新的数据传入,发生过载错误。2、字节发送成功后,但是 DAT数据仍为空,发生欠载。
时钟延长对时钟同步影响:产生的同步SCL时钟的低电平周期由低电平周期最长的器件决,高电平周期由高电平时钟周期最短的器件决定。

当存在多个主机同时请求总线控制怎么办?—仲裁,谁先拉低SDA谁掌握总线控制权

各个主控制器没有对总线实施控制的优先级别,都是由仲裁决定的。**总线控制随即而定且逐位进行,他们 遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权。**在每一位的仲裁期间,当 SCL 为高时,每个主机都检查自己的 SDA 电平是否和自己发送的相同。理论上讲,如果两个主机所传输的内容 完全相同,那么他们能够成功传输而不出现错误。如果一个主机发送高电平但检测到 SDA 电平为低,则认 为自己仲裁失败并关闭自己的 SDA 输出驱动,而另一个主机则继续完成自己的传输。

I2C总线的协议层

主机往从机写入操作—主机只写(不带子地址 / 带子地址)

1、主机产生S起始信号,表示起始传输。
2、主机发送一个从机器地址(7位)+ 读写位(0表示写),表示是访问哪个从机和读写方向为写,然后等待从机应答A;
3、从机应答后,主机开始发送数据,每次发送1字节然后等待应答,从机应答后 主机循环继续发送数据并等待应答。
4、主机发送完全部数据后 发送 停止信号S,表示停止传输。
备注:部分从机设备,存在子地址的概念,比如存储器里面还包含地址信息,这个时候发送完从机地址后,数据发送需要先发送被访问的子地址(可能需要多个数据发送多次),然后才开始发送真正的读写数据

不带子地址:
在这里插入图片描述
包含子地址:
在这里插入图片描述

主机从从机读取的操作—主机只读(不带子地址)/ 主机先写再读(带子地址)

主机读取的时候,分是否需要写入子地址的情况,这种情况 主机必须要先写地址给从机表示读取哪一块,然后再读取,此时由于先写再读取,主机存在读写转换,需要分两次S起始信号,第一次先发送从机地址,用写的方式 写入需要访问的子地址(这一次也成为 哑写),然后第二次S起始信号 再发送一次从机地址,用读的方式开始读取数据。具体如下:

不带子地址:
1、主机产生S起始信号,表示起始传输。
2、主机发送一个从机器地址(7位)+ 读写位(1表示读),表示是访问哪个从机和读写方向为读,然后等待从机应答A;
3、从机应答后,主机开始读取数据,每次读取一个字节后主机发生一次应答,从机接受到应答后继续发送数据,当主机接受到最后一个字节时,发送一次非应答信号表示读取结束。
4、主机发送发送 停止信号S,表示停止传输。
在这里插入图片描述
带子地址:
1、主机产生S起始信号,表示起始传输。
2、主机发送一个从机器地址(7位)+ 读写位(0表示写),然后等待从机应答A,从机响应后开始发送子地址,表示指定从机并告知子地址;
3、主机再产生S起始信号。
3、主机发送从机器地址(7位)+ 读写位(1表示读),然后等待从机应答A;
4、从机应答后,主机开始读取数据,每次读取一个字节后主机发生一次应答,从机接受到应答后继续发送数据,当主机接受到最后一个字节时,发送一次非应答信号表示读取结束。
4、主机发送发送 停止信号S,表示停止传输。
在这里插入图片描述

典型波形时序信号

在这里插入图片描述

I2C控制器

如果没有I2C控制器,全部的读写操作需要通过GPIO来模拟,一个GPIO表示SCL一个表示SDA,非常复杂。当前大部分soc或者mcu都具备I2C控制器,通过配置I2C控制器大大简化了我们的I2C操作。

s3c2440 I2C控制寄存器举例介绍

s3c2440的I2C控制寄存器框图如下,包含4个寄存器;
总线控制寄存器,IICCON:应答是能、时钟信号选择、中断使能、中断挂起状态(写零清除)、发送时钟分频。
总线控制/状态寄存器,IICSTAT : 主/从 收/发 模式选择,起始/结束 信号,数据输出使能,仲裁状态,从地址匹配,响应状态;
总线 Tx/Rx 数据移位寄存器,IICDS :移位数据;
总线地址寄存器,IICADD :总写地址寄存器,从I2C总线锁存7位地址;
在这里插入图片描述
主机发送流程示意图举例:
在这里插入图片描述
伪代码流程:
1、I2C 初始化函数:
配置GPIO引脚格式、配置时钟大小、注册中断函数;
2、I2C 传输函数:
写:设置读写模式,设置ACK响应,写从地址到IICDS,使能发送(中断会响应),循环等待发完size或者异常退出;
读:设置读写模式,设置ACK响应、写从地址到IICDS,使能发送(中断会响应),循环等待收完size或者异常退出;
3、I2C 中断函数:
判断第一次有无ACK响应(无就异常退出)
如果写入:继续IICDS发送下一个数据,最后size完成发送结束信号,清除中断。
如果读取:读取IICDS数据到buf;非最后数据 设ACK回应使能,最后数据不回应ACK且发送结束信号,清除中断;

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值