您的位置:首页 > 编程语言

I2C协议学习笔记

2017-02-27 16:49 218 查看
I2C传输速率一般是100k,200k,400k,3.2Mbps

其时钟速率与可编程的时钟输出决定

I2C接口采用Open Drain机制, 器件本身不能输出高电平,只能输出低电平,需要外置上拉电阻(1k-10k)

外设数量限制:等效电<400pf

I2C起始信号与停止信号

SCL保持高电平 SDA从高拉低表示起始

SDA 从低位拉高表示停止位,

总线总是在收到起始位之后处于忙状态,直到停止位之后释放总线

I2C 传输

首字节是由地址位和传输方向位组成(7bit地址位+1bit读写位(0表示写,1表示读))之后会收到ACK(从设备将sda拉低)

然后进行数据操作传输大致可以分为三种操作

主设备写操作:

第一,主设备写数据,数据传输格式如下

S 从设备地址(7bit) W ACK 数据 ACK 数据 ACK P

第二,主设备读操作:

S 从设备地址(7bit) R ACK 数据 ACK 数据 NACK P

第三,主设备先写然后重启起始条件接着读操作,或者主设备先读然后重启起始条件接着写操作

S 从设备地址(7bit) R/W ACK 数据 ACK RS 从设备地址 R/W ACK 数据 ACK …

I2C总线竞争仲裁

总线上可能挂接多个器件,有时候会发生两个或多个主器件同时想占用总线的情况,这种情况就会出现总线仲裁

I2C协议规定,仲裁不能在下面的情况之间进行:

重复的起始条件和数据位

停止条件和数据位

重复的起始条件和停止条件

从机不被卷入冲裁过程

总线规范关于仲裁需要明白一些先决条件

(1)I2C总线的控制只由地址和主机码以及竞争主机发送的数据决定,没有中央主机,总线也没有任何定制的优先权

(2)主控只能在总线空闲的时候启动传送,两个或多个主机可能在起始条件的最小持续时间tHD;STA内产生一个起始条件,

结果在总线上产生一个规定的起始条件。

(3)当SCL线是高电平时,仲裁在SDA线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,

因为总线上的电平与它自己的电平不相同。

然后,获得进一步的判定条件:

(1)仲裁可以持续多位。首先是比较地址位。如果每个主机都试图寻址同一的器件,仲裁会继续比较数据位(假如主机是发送器),

或者比较响应位(假如主机是接收器)

(2)I2C总线的地址和数据信息由赢的仲裁的主机决定,在仲裁过程中不会丢失信息,

丢失仲裁的主机可以产生时钟脉冲直到丢失仲裁的该字节末尾

(3)在串行传输过程中时,一旦有重复的起始条件或者停止条件发送到i2C总线的时候,仲裁过程仍在进行。

如果可能产生这种情况,有关的主机必须在帧格式相同位置发送这个重复起始或停止条件。

(4)此外,如果主机也结合了从机功能,而且在寻址阶段丢失仲裁,它很有可能就是赢得仲裁的主机在寻址的器件,

那么,丢失的主机必须立即切换到它的从机模式

时钟同步:

时钟SCL同步是建立在总线具有线“与”的逻辑功能,即只要总线节点上有一个发送低电平,总线上就表现为低电平;

当所有节点都发送高电平时,才表现为高电平。正是由于线“与”的逻辑功能,当多个节点同时发送

时钟信号时,总线上表现的是统一的时钟信号。这就是SCL的同步原理

如有问题欢迎交流,后续有更新再补上,接下来会更新i2c子系统的学习,尽情期待
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程