好记性不如铅笔头

网络通讯

I2C简单笔记

CONTENTS

参考链接

https://zhuanlan.zhihu.com/p/26579936
https://zhuanlan.zhihu.com/p/137568249
https://blog.csdn.net/zhengqijun_/article/details/52217101
https://blog.csdn.net/qq_29344757/article/details/76520378
http://www.wangdali.net/i2c/

2C(Inter-Integrated Circuit)是一个能够支持多个设备的总线,包含一条双向串行数据线SDA,一条串行时钟线SCL。每个连接到总线的设备都有一个独立的地址,主机可以通过该地址来访问不同设备。主机通过SDA线发送设备地址(SLAVE_ADDRESS)查找从机,SLAVE_ADDRESS可以是7位或10位,紧跟着SLAVE_ADDRESS的一个数据位用来表示数据传输方向,即第8位或11位。为0时表示写数据,为1时表示读数据。主机和从机的区别在于对SCL的发送权,只有主机才能发送SCL

实现I2C需要两根信号线完成信息交换,SCL时钟信号线,SDA数据输入/输出线。它属于同步通信,由于输入输出数据均使用一根线,因此通信方向为半双工
I2C最少只需要两根线,和异步串口类似,但可以支持多个slave设备。一个I2C理论上最多可挂载127个设备,但除去保留地址,最多可挂载112个设备
和SPI不同的是,I2C可以支持multi-master系统,允许有多个master并且每个master都可以与所有的slaves通信(master之间不可通过I2C通信,并且每个master只能轮流使用I2C总线)。

I2C物理层

I2C协议层

以主机向从机写数据为例,其基本结构如图所示,依次为:
起始信号——从机地址——读写信号——数据位——应答位——… … ——停止位,如下图:

数据有效性

SDA 线上的数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。
换言之,SCL为高电平时表示有效数据,SDA为高电平表示“1”,低电平表示“0”SCL为低电平时表示无效数据,此时SDA会进行电平切换,为下次数据表示做准备。如下图:

起始条件S和停止条件P

起始条件S:当SCL高电平时,SDA由高电平向低电平转换;
停止条件P:当SCL高电平时,SDA由低电平向高电平转换。
起始和停止条件一般由主机产生。总线在起始条件后处于busy的状态,在停止条件的某段时间后,总线才再次处于空闲状态。下图为起始和停止条件的信号产生时序图。

数据传输格式

传输的每个字节必须为8位,而总字节数不受限制。每个字节后必须跟一个响应位。首先开始传输的是数据最高位,即MSB位。如果此时从机正忙于其他功能,如正在中断服务程序,则需要使SCL线保持低电平迫使主机进入等待状态,直到从机准备完成。数据接收方收到传输的一个字节数据后,需要给出响应,此时处在第九个时钟,发送端释放SDA线控制权,将SDA电平拉高,由接收方控制。作为数据接收端时,当设备(无论主从机)接收到I2C传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,即SDA为低电平,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,即SDA为高电平,发送方接收到该信号后会产生一个停止信号,结束信号传输。

发表评论

1 × 4 =

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据