I2C(Inter-Integrated Circuit)总线是由飞利浦半导体(现恩智浦半导体)于 1982 年研发的两线式串行通信标准,其发明源于当时电子设备的通信痛点,后续凭借独特优势逐步成为电子领域的重要通信协议。其两根通信线为SCL和SDA
- I2C电路规范
- 所有I2C设备的SCL通信线连在一起,SDA连在一起
- 设备的SCL和SDA均要配置成开漏输出模式
- SCL和SDA个添加一个上来电阻,组值一般为4.7kΩ
- 开漏输出和上拉电阻的共同作用实现了“线与的功能”,此设计主要是为了解决多机通信互相干扰的问题
- 开漏输出模式原理图
当输出1时,三极管断开,引脚浮空
当输出0时,三极管闭合,引脚接地
- I2C的时序结构
- 起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
如上图所示,虚线框内即为重要部分左侧示意图记为S(START),右侧示意图记为P(PAUSE)
- 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环该过程8次即可发送一个字节。
虚线框处为重要部分,记为S:(SEND BYTE)
SCL在B7高电平阶段即为读取数据阶段,需要注意的是示意图中SDA处两条线并非同时存在,在一个时间节点只有存在一个进程,示意图表示的是两种不同的情况,由低电平转为高电平即为发送1,由高电平转为低电平即为发送0
2.接收一个字节:SCL低电平期间,从机将数据位一次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次即可接收一个字节(主机在接收之前,需要释放SDA)
将该部分记为R(RECIEVE BYTE)
示意图表示的是两种不同的情况,由低电平转为高电平即为接收1,由高电平转为低电平即为接收0
3. 发送应答:在接收一个字节后,主机在在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:在发送一个字节后,主机在在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
左侧部分为发送应答原理,记为SA(SEND ANSWER)
右侧部分为接收应答原理,记为RA(RECIEVE ANSWER)
了解了以上时序结构,我们就可以把他们当做不同的模块,通过这些模块以不同方式组合,就构成了数据帧
在通信协议(包括I2C)中,数据帧是指按固定格式组织的,用于依次完整数据传输的最小单元,简单说就是通信双方 “约定好的数据包格式”—— 发送方按这个格式打包数据,接收方按同一个格式解析数据,才能保证通信准确无误。
- 数据帧
- 1.发送一帧数据
完成任务:向谁发送什么
其中SLAVE ADDRESS为从机,W表示写
S表示发送信号,RA表示接受信号后给出应答。类似于点名时点名者点名,被点名者答到
2.接收一帧数据
完成任务:向谁接受什么
其中从机后的R表示读
紫色的R表示接收信号,SA表示接受信号后给出应答。类似于点名时被点名者答到后,点名者收到信息对其进行回应表示已经收到被点名者的信息。
3.先发送再接收数据帧(复合格式)
完成任务:向谁收指定的什么
发送和接收配合使用,才能达到I2C通信的目的。