文章目录
概述
本文将系统讲解 I2C 通信协议。大体上会讲解以下内容:
- I2C通信协议的基础约定。
- 引脚工作模式约定
- I2C总线设计原理。
- 主从设备,在通信中的引脚设置。
- SDA总线和SCL总线,在通信过程中的作用。
- I2C通信的时序结构,数据帧格式,也就是通信从开始到结束的流程。
I2C通信协议的基础约定
I2C总线的结构,如下图所示:

我们在上文中已经简略讲过这种总线设计了,现在我们详细讲解一下其中细节和约定。
了解这些细节和基础约定,是学习I2C通信协议,掌握I2C通信时序的前提。
引脚工作模式约定
I2C通信中,所有设备都需要基于两个引脚,将自身挂在两条总线上,即SCL引脚和SDA引脚。
那么这些引脚,应该设置为什么工作模式呢?
以单片机作为主机为例,在I2C通信中,单片机需要:
- 利用自身的SDA引脚,控制SDA总线的高低电平,从而控制将数据发送给从机。
- 利用自身的SCL引脚,控制SCL总线的高低电平,从而控制通信过程当中的时序。
很显然,这个过程中,SDA引脚和SCL引脚执行的都是输出向的操作。
那么选择开漏输出还是推挽输出呢?
可以看到总线电路上,设置了上拉电阻。
上拉电阻的作用是,在总线电路断路时,将总线电平上拉为高电平!
而引脚能够输出断路,高阻态的工作模式,就是开漏输出模式!
实际上:
I2C通信协议规定,所有接入I2C总线的设备,其SCL和SDA两个引脚,都必须设置为开漏输出模式!
这种引脚工作模式的设置,配合上拉电阻,能够带来什么效果呢?
主机在通信的过程中,如何发挥它的控制作用呢?
为了说清楚这些问题,我们需要先了解一个概念:逻辑线与。
逻辑线与(重点)
什么是"逻辑线与"呢?
逻辑线与指的是一种总线式的电路设计,需要所有设备都将自身引脚设置为开漏输出模式,再配合上拉电阻。
可以达成这样的效果:
- 总线的电平状态在某一时刻是固定、确定的,但需要所有设备的引脚输出来共同决定。
- 只有所有设备的引脚都输出1(高阻态)时,总线才表现为高电平!
- 任何一台设备的引脚输出0(低电平)时,总线就表现为低电平!
也就是说,如果SDA总线表现为高电平:
SDA总线上,所有设备的SDA引脚,都必须输出高阻态,此时配合SDA总线上的上拉电阻,SDA总线表现为高电平状态。
而如果SCL总线表现为低电平:
SCL总线上,只需要有1台设备的SCL引脚,输出低电平即可。
你搞懂了吗?
那么这种设计,为什么叫做"逻辑线与"呢?
回想一下,逻辑运算符当中的与运算符"&",它的特点是:
- "&"运算符连接的所有表达式,结果都是1时,整体结果才是1。
- "&"运算符连接的所有表达式,有任一表达式结果是0时,整体结果就是0!
I2C通信中,总线状态的结果值,和"&"运算符的效果完全一致,所以我们把这种总线机制称之为"逻辑线与"。
I2C通信当中的逻辑线与是通过设置引脚为开漏输出模式,配合上拉电阻来共同实现的,这是一种硬件实现的逻辑线与。
理解了逻辑线与,那么I2C两条总线的电平状态,就非常好理解了:

某条线上的高低电平状态(1/0) = 主机该端口输出(1 / 0) & 从机1该端口输出(0 / 1) &...
- 只要有任意一个设备的端口输出了0(低电平),那么这整条线就是低电平状态。
- 所有设备的此端口都输出了1(高阻态),那么整条线才是高电平状态。
了解了逻辑线与,那么剩下一系列I2C通信协议约定,就都很容易理解了。
I2C通信的空闲状态
在学习串口通信时,我们知道:
两条数据线只要都保持高电平状态,就表示通信处于空闲状态。
那么I2C通信,怎么表示通信的空闲状态呢?
I2C通信协议规定:
只有SCL和SDA总线,都处于高电平状态,通信才处于空闲状态。
只要任何一条总线拉低,就表示通信开始,或者通信正在进行。
我们把所有设备都接入总线,此时通信必然还未开始,处于空闲状态。
再结合前面讲到的 逻辑线与机制,我们可以自然地得到一个重要结论:
I2C通信中的所有设备,在将自身挂在总线上时,会默认将自身所有的引脚输出设置为1高阻态!
讲完了I2C通信的空闲状态,先不要着急学习通信如何开始,我们再来看最后一个概念:总线控制权!
总线控制权(重要)
首先,我们要解释一下,什么叫做"拥有总线控制权":
拥有总线控制权的设备,可以通过控制自身对应引脚的输出电平,从而拉高或拉低总线电平。
很明显:
- 一开始,所有设备所有引脚都输出高阻态。
- 拥有总线控制权的设备,可以通过拉低对应引脚输出,拉低对应总线电平。
- 拥有总线控制权的设备,只要继续保持对应引脚输出高阻态,那么总线电平就会继续保持高电平。
两条总线的控制权归属是不同的,我们要分开讲。
SCL总线控制权
SCL线的作用是控制通信时序,而控制通信时序是主机的权力,所以SCL线的控制权必然始终归属主机。
由于我们约定单片机始终作为主机不切合,所以SCL线的控制权始终归属单片机!
所有的从机都不具备SCL总线的控制权,所有从机的SCL引脚都始终保持高阻态输出状态!
主机发送时钟信号,也就是主机控制SCL总线,具体逻辑可以参考下图:

主机控制SCL总线状态的过程如下:
- 只要主机的SCL引脚写1,也就是主机SCL引脚进入高阻抗状态,那么SCL总线的时钟信号就是高电平。
- 只要主机的SCL引脚写0,也就是主机SCL引脚输出低电平,那么SCL总线的时钟信号就是低电平。
这就是主机发送时钟信号的原理,注意这个原理,我们后面要自己写代码实现它。
SDA总线控制权
I2C通信是半双工通信协议,主机可以发数据给从机,从机也可以在主机控制下发数据给主机。
数据通信是双向的,且只通过一条SDA总线完成。
同样的,所有设备的SDA引脚一开始也都输出高阻态,所以:
- SDA总线的控制权属于哪台设备,就表示该设备在发送数据。
- SDA总线的控制权属于主机,就表示主机发送数据给从机。
- SDA总线的控制权属于从机,就表示从机发送数据给主机。
- 拥有SDA总线控制权的设备,可以控制自身SDA引脚的输出0/1(低电平/高阻态),从而控制SDA总线的高低电平。
- 没有SDA总线控制权的设备,自身SDA引脚必须保持输出1高阻态。
对于I2C通信来说,任何通信总是由主机控制开始的,SDA总线的控制权在一开始必然归属主机!!!
主机控制SDA总线,主机向从机发数据,I2C的写模式,具体逻辑可以参考下图:

主机控制SDA总线状态的过程如下:
- 只要主机的SDA引脚写1,也就是主机SDA引脚进入高阻抗状态,那么SDA线就是高电平状态,主机发送数据1到从机。
- 只要主机的SDA引脚写0,也就是主机SDA引脚输出低电平,那么SDA线就是低电平状态,主机发送数据0到从机。
这就是主机发送数据到从机,也就是I2C写数据的实现原理,注意这个原理,我们后面要自己写代码实现它。
从机控制SDA总线,从机向主机发数据,I2C的读模式,具体逻辑可以参考下图:

SDA总线的控制权一开始归属主机,现在要把权力"让渡"给从机。
怎么实现这个权力"让渡"呢?
很简单,只需要主机将自身SDA引脚设置为1高阻态即可!
同样的,从机也有机会把SDA总线控制权"再还给"主机,应该怎么做呢?
也只需要从机将自身SDA引脚设置为1高阻态即可!
从机控制SDA总线状态的过程如下:
- 只要从机的SDA引脚写1,也就是从机SDA引脚进入高阻抗状态,那么SDA总线就是高电平状态,从机发送数据1到主机。
- 只要从机的SDA引脚写0,也就是从机SDA引脚输出低电平,那么SDA总线就是低电平状态,从机发送数据0到主机。
这就是从机发送数据到主机,也就是I2C读数据的实现原理,注意这个原理,我们后面要自己写代码实现它。
结合前面讲到的 逻辑线与 和 总线控制权 ,关于 SDA 总线的作用,我们已经可以得出一个非常清晰的结论:
谁控制了SDA总线,就是谁向对方发数据。
那么SCL总线的具体作用是什么呢?
我们讲过:SCL总线由主机全程控制,为总线上的设备提供统一时钟信号,从而控制整个通信的时序。
所以下面我们就重点来讲解一个问题:
SCL总线的电平状态,时钟信号,如何掌控通信时序?
SCL 总线对通信时序的控制(重点)
在I2C通信中,只有主机可以控制SCL时钟信号线,也就是只有单片机的SCL引脚可以切换0/1输出状态,从而控制SCL总线的高低电平。
主机控制SCL引脚改变SCL总线的高低电平,从而产生了一条高低电平切换的信号线图,这就是**"时钟信号线/时钟同步线"**。
如下图所示:

这条时钟信号线,其实就是SCL总线电平切换随时间改变的一个"时序图"。
主机和所有从机们收到和使用的都是同一条时钟信号线,就由这条时钟信号线控制整个通信的过程,也就是控制通信的"时序"。
具体来说:
I2C通信不是异步通信,它不依赖于数据帧中的特殊起始位、或结束位以及设定相同的数据传输速率来实现通信。
I2C通信,会根据时钟周期,来确定数据什么时候开始或结束传输,数据如何发送,以及如何接收等问题。
什么是时钟周期呢?
简单来说,一个时钟周期就是一个完整的"高电平 + 低电平"的组合。
于是在I2C通信中,一个时钟周期被分成了两个部分:
- 工作时间:一个时钟周期中的高电平部分属于工作时间。
- 通信中的任何重要节点,一定发生在工作时间内!
- 比如通信的开始和结束,必须发生在工作时间内!
- 比如通信的发送端发送数据,接收端采集接收数据,也必须发生在工作时间内!
- 休息时间:一个时钟周期中的低电平部分属于休息时间。
- 休息时间内,SDA总线无论是什么电平状态,都毫无意义!
- 休息时间也叫"准备时间",发送端可以趁休息时间,改变SDA总线电平,为下一个工作时间发送数据做准备!
如下图所示:

下面"时序图",描述了主机控制SDA总线,发送数据给从机:

分析一下,主机向从机发送了什么数据?
很简单,只需要数时钟周期的工作时间,也就是高电平时间段即可。
图中一共8个高电平时间段,也就是有8个工作时间段,也就是主机向从机发送了8个bit数据。
然后,再看一下8个工作时间段的SDA总线电平状态,主机发给从机的8个bit,1个字节的数据是:
1 0 1 0 1 1 1 1
除此之外,我们还可以观察到一个非常重要的现象:
在 SCL 总线处于高电平(工作时间)时,SDA 总线的电平状态始终保持稳定不变。
这正是 I2C 通信协议中的一条核心时序约定:
如果 SDA 总线正在用于发送数据,那么 SDA 的电平状态,必须在整个工作时间内都保持稳定,不能发生改变。
也就是说,在数据传输阶段的工作时间内:
- 发送端(当前拥有 SDA 总线控制权的设备)必须在整个工作时间内,保持SDA电平稳定不变。
- 接收端,则在工作时间内采集SDA电平状态,高电平表示接收bit数据1,低电平表示接收bit数据0。
SCL时钟信号线
SCL线(Serial Clock Line),即串行时钟线。
作用:由 主设备(单片机) 产生时钟信号,控制数据传输的时序。
所谓控制时序,就指的是主机严格控制整个通信的流程。
比如什么时候开始传输数据,和哪个从机传输数据,是读数据还是写数据,什么结束数据传输等等。
在I2C通信中,由单片机产生的时钟信号,通过I2C总线中的SCL线发送到每一台从设备。
这就好比,主机作为"老大",它通过SCL线主动严格控制每一个"小弟"的工作节奏,并严格与主机保持一致。
在I2C通信中,SCL线的控制权始终在主机手中,从机无法掌控SCL线。
关于时钟信号线的作用,也就是主机究竟如何控制所谓的时序,待到下面我们再讲解。
SDA数据总线
SDA线(Serial Data Line,串行数据线)
作用:用于双向传输数据,主机和从机之间的数据交换全部是由这一条线完成的。
主机可以控制SDA线向从机发送数据,从机也可以控制SDA线向主机发送数据。
所以在I2C通信中,SDA总线的控制权可以在主机/从机之间转换,当然在通信一开始的时候,SDA总线的控制权属于主机。
I2C是一种串行、同步、半双工的通信方式,它的这些特点就可以通过它的接线方式来推导出来。比如:
- 串口是全双工的通信方式,是因为通信双方都各有一个发送端和接收端交叉连接,但I2C的数据通信显然不可能是全双工的:
- I2C通信中的主机和从机之间的数据交互都是一条SDA线完成的。
- 在同一时刻,SDA线的控制权只能是主机或者从机。
- 若主机向从机发送数据,即I2C的写操作。
- 若从机向主机发送数据,即I2C的读操作。
- I2C通信是一种半双工的通信方式,主机和从机不能同时发送和接收数据。
- I2C总线是一种串行通信总线,数据是一位一位地依次传输的,所以I2C通信自然就是串行通信手段。
- I2C通信中,由主机通过SCL线严格控制数据传输的时序,任何数据的交互都需要双方同时"在线",同时参与。
- 比如:主机想向从机发送数据了,就必须通过I2C总线通知从机,从机"回答"了,才能继续下一步。
- 所以I2C通信是一种同步的通信方式。
- 与之相对应的UART串口通信,它通过规定相同的波特率,使用特定格式的数据帧来保证发送端和接收端的数据同步。这样串口就实现了异步的通信,通信双方不需要保证时刻同时"在线"。
总结
到此为止,有关I2C通信硬件电路设计、以及一些相关的约定限制,我们就全部讲完结束了。
这里做一个要点总结:
- I2C 总线由 SDA(数据线)与 SCL(时钟线)组成,所有主从设备共享这两条线,形成"多设备挂载"的总线结构。
- 通信中所有设备的SDA和SCL引脚,都需要设置为开漏输出模式。
- 两条总线的电平状态,受所有设备引脚"逻辑线与"的共同决定------任一拉低(0)即为低电平,全部释放(1)才为高电平。
- SCL 总线由主机(单片机)独占控制,用于产生时钟信号,严格控制通信时序。
- SDA 总线控制权,在通信时根据发送端角色动态切换,主机写(主机发送)时主机控制SDA总线,主机读(从机发送)时从机控制SDA总线。
- 所谓总线控制权,指的是某一设备具有对总线电平的主动控制能力,即其对应引脚可以在 0 和 1(低电平与高阻态)之间切换,而其他设备必须将对应引脚置为高阻态(输出 1),以释放总线控制权。
- I2C通信把两条总线都为高电平状态,设置为通信的空闲状态。任一总线被拉低,表示通信已开始,或通信正在进行中。
- I2C 是同步通信协议,所有设备共享主机生成的时钟信号。
- 每个时钟周期(高电平 + 低电平)被划分为:
- 休息时间(SCL 低电平):为工作时间做准备,发送端控制拉高SDA总线(准备发1),也可以控制拉低SDA总线(准备发0);
- 工作时间(SCL 高电平):控制通信的关键节点。比如通信的开始与结束,数据发送与接收采集等重要节点,都必须在工作时间内发生。
- 如果是发送接收数据,SDA总线必须在整个工作时间内,保持电平状态不变。
下面,我们将从I2C通信时序、数据帧格式的角度,完整的走一遍I2C通信的整个流程。
I2C通信时序与数据帧格式
为了讲清楚I2C通信的时序和数据帧格式,我们就以**"主机向从机写数据"**这个最常见的场景为例子,描述一下I2C通信的过程。
所谓主机,即固定为单片机,不考虑主机切换。
I2C通信的比特序
2C和串口通信一样,都是串行通信方式,所以数据也是逐位发送的。
在串口通信中,数据逐位发送的顺序是从最低位发到最高位的,但I2C通信则完全与此相反!
注意:
在I2C通信中,数据是逐位从最高有效位发送到,最低有效位!
I2C通信的比特序是MSB First,优先发送数据最高有效位!
I2C写数据时的数据帧格式
I2C写数据帧时的数据帧格式:

实际上这个数据帧格式,也揭示了I2C通信发送数据的流程(以主机发送数据为例,从机发送数据原理完全一致):
- 主机发送起始信号,表示开始主机发送数据的过程。
- 主机发送设备地址 + 读/写标志位(寻址字节),表示主机寻址某台从机设备。若主机需要发送数据给从机,则需要使用"写"标志位。
- 主机每发送1个字节(8位)数据,从机都必须应答1位,以表示收到数据。这就是应答位,应答位只占1位。
- 再往后,就是主机继续1个字节1个字节的将数据逐位发出去。主机每发送1个字节,从机都需要回复一个应答位。
- ...
- 主机发送完毕所有数据,主机发送停止信号,表示结束主机发送数据的过程。
下面就针对这个过程,我们来逐一讲解一下每个过程是怎么做的。
起始位和停止位
起始位和停止位决定了主机发送数据的开始和结束,那么起始位和停止位的实现原理是什么样的呢?
I2C通信中所有设备都依据时钟周期中的工作时间来发送数据0和1,那么该如何传达开始传输数据和停止传输数据的信号呢?
再来回顾一下SDA线发送数据的方式:
SDA发送数据,一定是在时钟整个工作时间内都保持高低电平,才表示发送数据1和0。
那么在一个工作时间内,若SDA总线的高低电平不是始终保持不变,而是发生了改变:
- 由低电平变为高电平,即逻辑0变逻辑1。
- 由高电平变为低电平,即逻辑1变逻辑0。
这两种新出现的情况,不就恰好可以用于表示起始位和停止位嘛?
于是I2C通信协议规定:
- 在SCL高电平工作时间内,如果SDA总线从高电平变化为低电平,就表示主机发送起始信号,表示通信开始。
- 在SCL高电平工作时间内,如果SDA总线从低电平变化为高电平,就表示主机发送停止信号,表示通信结束。
下面我们不着急看寻址字节,我们先来看一下应答位。
应答位ACK
I2C通信是半双工的,意味着同一时刻下,数据只能沿一个方向传输。
在这种情况下,如果从机在整个数据传输过程中都不回应的话,那么主机就无法判断从机是否成功接收到数据。
于是I2C通信协议规定:
从机每接收主机发送的1个字节数据,在下一个工作时间内,就必须向主机回复一个应答位,以表示自己已收到传输数据。
那么应答位的格式是什么呢?从机是发送0还是发送1呢?
这里我们就要从新看一下主机发送数据的原理,如下图所示:

主机发送数据时,从机的SDA都只为1,SDA线的高低电平完全由主机控制。
每当主机发送完毕一个字节的数据后,主机就会将自身SDA引脚也置为1,将自己从SDA线上断开,放弃SDA线的控制权:
- 如果从机确定收到了正确的数据,那么从机应该在此时主动将自己的SDA引脚置为0。
- 如此从机在下个工作时间内,就实现了向主机发送0低电平的功能。
- 此时从机主动向主机发送了一个低电平0,这就是ACK(Acknowledge)确认应答。
- 只要主机收到了从机发送来的一个0,就表示这一个字节的数据传输工作完成了。
- 反之若从机认为自己没有收到数据,或者数据有误,那么从机将不会做任何事情,从机的SDA引脚也置1挂起。
- 于是整个SDA线的所有引脚都置为1(高阻态),依赖于上拉电阻,SDA表现为高电平。
- 此时相当于从机向主机发送了一个高电平1,这就是NACK(Not Acknowledge)非确认应答。
- 只要主机收到了从机发送来的一个1,就表示这一个字节的数据传输工作有问题。
如此结合起始位、停止位以及应答位,主机发送1个字节数据的时序图如下所示:

这张时序图,展示了随时间推进,SCL总线和SDA总线上,高低电平的变化情况。
下面这张图则更清晰的展示了"1个字节数据",从主机发送到从机的过程:

上面讲的是主机发送数据,也就是I2C写数据。主机接收数据,也就是I2C读数据,过程也完全类似。流程图如下所示:

特别需要注意的点是,I2C通信采用主从模式,即便是从机向主机发送数据,这个过程也是由主机"主动"发起的!!
通过这里的讲解,我们就发现了,在I2C通信的过程中,数据的流向是始终变化的,主机发一段,从机就要响应一下,反之亦然。
应答位,本质上是数据发送完后的,第9个时钟周期的发送数据,只不过这位数据的发送者是前面8位数据的接收者。
I2C读数据时的数据帧格式
I2C读数据时的数据帧格式,和写数据时没有本质区别。如下所示:

总之,在I2C通信时,总是主从机交替发送数据的,要搞清楚到底是谁在发,谁在接,不要弄混淆了。
寻址字节
寻址字节始终是 I2C 通信中发送的第一个字节,任何I2C通信总是从主机寻址开始的。
这也是前面讲的,SDA总线的控制权在一开始必然属于主机,这是因为主机需要发送寻址字节!
寻址字节数据相对比较复杂,因为它兼顾两个作用:
- 前7位是接收数据的从机地址,唯一指示某个从机与主机进行通信。
- 第8位是读写标志位。I2C通信协议规定:
- 读写标志位是0时,表示主机向从机写数据。
- 读写标志位是1时,表示从机发送数据到主机,也就是主机读从机数据。
也就是说,只要知道了7位从机地址,然后再配合1位读写标志,我们就能够知道I2C通信中,数据帧的第一个字节应该如何发送了。
到此为止,关于I2C软件通信协议部分,就全部结束了。
下面我们就以一款支持I2C通信协议的设备**"SSD1306 OLED显示屏"**为例子,来讲讲该硬件的使用。随后完成单片机与这款屏幕的I2C通信。
采样和采样时机
对于采样和采样时机这两个概念,我们在讲解串口通信时其实已经接触过了。
简单来说:
- 采样:接收端在某个时刻,采集电平高低,确定接收数据bit1还是bit0。
- 采样时机:接收端究竟在什么时刻进行数据采样。
在串口通信中,接收端的采样过程具有以下特点:
- 串口通信的接收端,以起始信号为时间基准起点。
- 用约定好的波特率确定1个bit所需时间。
- 最终在每个bit数据的附近进行多次采样,然后投票判决最终结果。
注意串口通信是异步串行通信,所以:
- 必须约定波特率才能够确定时间,从而进行采样。
- 由于没有严格时钟信号控制时序,所以必须采样多次,投票判决结果。
但I2C通信与串口通信不同,它属于拥有统一时钟信号的、同步串行通信方式。
所以:
- I2C通信不需要通过约定波特率来对齐时间,I2C通信时序已经被SCL时钟信号线固定了。
- 既然有时钟信号严格约定时序,在进行数据采样时,每1bit数据就不需要采样多次了,I2C在进行数据采样时,只需要采样一次就可以了。
经过上面I2C通信协议的学习,我们已经知道I2C通信的核心规则:
- 对于发送端而言,当 SCL 为高电平工作时间时,SDA 必须保持稳定表示发送数据。
- 对于接收端而言,当 SCL 为高电平工作时间时,需要读取 SDA 总线上的电平状态,以确定接收到的数据。
也就是说,对于接收端而言,SCL为高电平的工作时间内,都是可供采样的有效时间。
那么I2C 通信中,具体在 SCL 高电平的哪个位置进行数据采样呢?
实际上,I2C通信协议,并没有明确规定必须在 SCL 高电平的哪一个具体时刻进行采样。
但从实际的应用出发,接收端通常都会在 SCL 高电平的中间点附近 对 SDA 进行一次采样。
当然,这里的"中点采样"和串口通信是完全不同的概念。
串口通信可以通过约定好的波特率,相对精确得计算半个 bit 时间。
而 I2C 并不是通过计算精确时间来得到中点,而是通过固定延时落在一个安全窗口内。
具体来说是这样的:
- 接收端设备在芯片设计阶段:
- 会根据 I2C 规范中常见的通信速率以及协议规定的最小高电平持续时间
- 预设一个固定延时参数,并写死在芯片内部逻辑中。
- 每当接收端检测到 SCL 的上升沿时:
- 确认进入高电平工作时间后,就会通过内部时钟延时一个固定时间。
- 这样就大体上可以确保,在SCL高电平工作时间的靠中点位置进行数据采样。
- 这样采样的数据会更加稳定和准确。
注意:在整个 SCL 高电平工作时间内,采样只会发生一次,而不是连续或重复采样。
所以可以这么理解:
- I2C通信协议没有说必须在工作时间的具体时刻进行采样。
- 接收端可以自由实现采样时机,依靠自身的内部芯片中存储的程序。
- 但为了避开时钟翻转瞬间的抖动,提高采样的可靠性,接收端大多都会在工作时间的靠中点进行仅一次的数据采样。
所以I2C通信的采样和采样时机没有过多需要讲解的,大家了解即可。