IC,  IP

说说I2C那些事儿

Contents

I2C 总线介绍

I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时串行总线,常用于微控制器与外设之间的连接。要想了解详细I2C协议,目前最新的I2C标准协议是2014年第6版本,如下:
I2C-Bus Standards Specification

I2C总线物理连接

I2C 总线2条双向串行线。分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。
在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。I2C仅需两根线就可以支持一主多从或者多主连接


I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,RS-485也为半双工,SPI和uart为双工。

上拉电阻计算

I2C-上拉电阻计算

AppNotes

传输速率

双向传输总线
– 标准模式(Standard-mode):速率高达100kbit/s
– 快速模式(Fast-mode):速率高达400kbit/s
– 快速模式+(Fast-mode Plus):速率高达1Mbit/s。
– 高速模式(High-speed mode):速率高达3.4Mbit/s

单向传输总线
– 超快速模式(Ultra Fast-mode):速率高达5Mbit/s

I2C 总线特征

  • I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(地址通过物理接地或者拉高,可以从I2C器件的数据手册得知,如TVP5158芯片,7位地址依次bit6~bit0:x101 1xxx, 最低三位可配,如果全部物理接地,则该设备地址为0x58, 而之所以7bit因为1个bit要代表方向,主向从和从向主),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。
  • 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.
  • I2C总线上可挂接的设备数量受总线的最大电容400pF 限制,如果所挂接的是相同型号的器件,则还受器件地址位的限制。
  • SDA传输数据是大端传输,每次传输8bit,即一字节:2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。
  • 支持多主控(multimastering),任何时间点只能有一个主控。

I2C 总线协议

起始条件

  • I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生(意味着从设备不可以主动通信?所有的通信都是主设备发起的,主可以发出询问的command,然后等待从设备的通信)
  • 起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。
  • 起始和终止条件都是由主机(master)发起产生。总线在起始条件之后处于忙碌状态,在停止条件之后又处于空闲状态。
    • 起始条件:SCL线是高电平时,SDA线从高电平向低电平切换
    • 停止条件:SCL线是高电平时,SDA线从低电平向高电平切换。

完整的一帧I2C数据:

数据格式

SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。首先传输的数据是最高位(MSB),SDA上的数据必须在SCL高电平周期时保持稳定,数据的高低电平翻转变化发生在SCL低电平时期。

响应ACK(Acknowledge)和非响应NACK(Not Acknowledge)

每个字节传输必须带响应位,相关的响应时钟也由主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。
当在SCL第9位时钟高电平信号期间,SDA仍然保持高电平,这种情况定义为NACK非响应位。这种情况下,主机可以直接产生STOP条件终止以后的传输或者继续重新START开始一个新的传输。

7-bit 地址格式和读写位

一个7-bit的地址是从最高位(MSB) 开始发送的,这个地址后面会紧跟1-bit(R/W)的操作符,1表示读操作,0表示写操作。 接下来的一个bit是NACK/ACK,当这个帧中前面8 bit发送完后,接收端的设备获得SDA控制权,此时接收设备应该在第9个时钟脉冲之前回复一个ACK(将SDA拉低)以表示接收正常,如果接收设备没有将SDA拉低,则说明接收设备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,则由master来决定如何处理(stop或repeated start condition)。

I2C 总线操作

对I2C总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操作情况:

  • 主设备往从设备中写数据。写通讯过程:
        1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
        2. 发送一个地址字节(包括7位地址码和一位R/W);
        3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
        4. 主控收到ACK后开始发送第一个数据字节;
        5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;
        6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;

  • 主设备从从设备中读数据。数据传输格式如下:
        1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
        2. 发送一个地址字节(包括7位地址码和一位R/W);
        3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
        4. 主控收到ACK后释放数据总线,开始接收第一个数据字节;
        5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束;
        6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;

  • 主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。数据传输格式如下:

第三种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率。

Q&A

I2C 死锁

在I2C发送数据的过程中,I2C总线异常等待ACK发生死锁。在这种情况下,TI的处理器一般可以设置发送9个clock 将剩余的数据发送出去。使总线恢复。

参考

  1. https://blog.csdn.net/qq_42384937/article/details/83625887
  2. https://blog.csdn.net/xialianggang1314/article/details/51279307?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm=1001.2101.3001.4242
  3. star https://blog.csdn.net/sternlycore/article/details/85600668
  4. understand I2C bus https://www.ti.com/lit/an/slva704/slva704.pdf?ts=1623115509162

发表评论

您的电子邮箱地址不会被公开。