I2C的学习

I2C通信的基本概念

  1. 双线制:I2C通信采用两条线进行数据传输:

    • SDA(Serial Data Line):数据线,用于传输数据。
    • SCL(Serial Clock Line):时钟线,用于同步数据传输。
  2. 主从结构:I2C通信采用主从(Master-Slave)结构,其中:

    • 主设备:发起通信的设备,负责生成时钟信号并控制通信流程。
    • 从设备:被主设备控制的设备,响应主设备的命令。
  3. 地址:每个从设备在总线上都有一个唯一的地址(通常是7位或10位),主设备通过地址选择特定的从设备进行通信。

SCL线控制

  1. 主设备生成时钟信号

    • 在I2C协议中,主设备负责生成时钟信号,并控制SCL线的状态。主设备通过拉高和拉低SCL线来提供时钟信号,从而同步数据传输。
  2. 数据传输与时钟的关系

    • 在数据传输过程中,主设备在每发送一个数据字节后,会生成一定数量的时钟脉冲(通常是8个脉冲对应一个字节的数据)。从设备在每个时钟脉冲的上升沿或下降沿(通常是上升沿)接收数据。
    • 主设备还会在每个字节后等待从设备发送的应答信号(ACK),并生成相应的时钟信号来进行数据的确认。

SDA线的控制

  1. 主设备的角色

    • 在开始通信时,主设备会首先控制SDA线,发送从设备的地址以及读/写位(0表示写,1表示读)。
    • 当主设备需要发送数据时,它会将数据放置在SDA线上,并在SCL线的每个时钟脉冲上升沿时,驱动SDA线的状态。
    • 主设备在发送完一个字节后,会释放SDA线,以便从设备发送应答信号(ACK)。
  2. 从设备的角色

    • 从设备在接收到其地址后,如果被选中,它会控制SDA线来发送ACK信号,表示准备好进行通信。
    • 在读操作时,当主设备发出读命令后,从设备会将数据放在SDA线上,主设备通过时钟脉冲读取这些数据。
    • 从设备在每个字节后也会发送ACK或NACK(不应答)信号,告诉主设备它是否准备好接收更多数据。
  • SDA线的控制是主设备和从设备的协作结果:
  • 主设备在发送数据和地址时控制SDA线。
  • 从设备在应答和读取数据时控制SDA线。

I2C时序基本单元

起始条件:

SCL高电平期间,SDA从高电平切换到低电平

终止条件:

SCL高电平期间,SDA从低电平切换到高电平

发送一个字节:

SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化(在SCL低电平期间允许改变SDA的电平),依次循环上述过程8次,即可发送一个字节

接收一个字节:

SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA,交由从机控制)(虚线部分表示从机控制的电平)

发送应答:

主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

接收应答:

主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

I2C通信的基本步骤

发起通信的开始信号

主设备通过发送一个开始信号来初始化通信:

开始信号:主设备将SDA线从高电平拉低到低电平,同时保持SCL线为高电平。这标志着I2C通信的开始。

发送从设备地址

主设备在开始信号之后,发送从设备的地址加上读/写位:

地址是7位,读写位是1位,加起来就是一个字节8位

地址格式:从设备地址通常为7位或10位。主设备将地址放在SDA线上,并在SCL的上升沿时发送数据。

读/写位:0表示写(主设备将数据发送到从设备)。1表示读(从设备将数据发送给主设备)。

接收应答信号

从设备接收到地址后,会发送一个应答信号(ACK):

应答信号:在地址发送完成后,从设备将SDA线拉低,以表明它准备好进行数据交换。主设备在发送完地址后等待一个SCL时钟脉冲以接收ACK信号。

数据传输

数据的传输分为写操作和读操作,具体步骤如下:

写操作:

指定地址写 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

  • 主设备将要发送的数据放在SDA线上,并产生时钟脉冲。
  • 从设备在每个字节之后发送ACK信号,告知主设备它已成功接收到数据。
读操作:

指定地址写 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

  • 主设备发送读命令,并准备接收数据。
  • 从设备将数据放在SDA线上,主设备通过SCL时钟脉冲读取数据。
  • 在读取每个字节后,主设备需要发送ACK信号以继续读取下一个字节,或者发送NACK信号以结束读取。

指定读写标志位只能是跟着起始条件的第一个字节

发送停止信号

通信结束时,主设备发送停止信号,标志着I2C通信的结束:

停止信号 :主设备将SDA线从低电平拉高到高电平,同时保持SCL线为高电平。这表示总线空闲,可以进行下一次通信。

相关推荐
嵌入式牛马在努力帮老板娶老婆2 分钟前
十四、STM32-----低功耗
stm32·单片机·嵌入式硬件
yzx9910136 分钟前
图像去雾:从暗通道先验到可学习融合——一份可跑的 PyTorch 教程
人工智能·pytorch·学习
来生硬件工程师21 分钟前
【硬件笔记】负载是如何烧MOS的?
笔记·嵌入式硬件·硬件架构·硬件工程·硬件设计
少男的脸红藏不住心事33 分钟前
GD32入门到实战34--ARM启动流程
单片机·嵌入式硬件
日更嵌入式的打工仔1 小时前
PHY的自适应协商简析
网络·嵌入式硬件·自适应·phy
练习时长两年半的Java练习生(升级中)1 小时前
从0开始学习Java+AI知识点总结-30.前端web开发(JS+Vue+Ajax)
前端·javascript·vue.js·学习·web
Rhys..2 小时前
python + Flask模块学习 1 基础用法
python·学习·前端框架·flask
lingggggaaaa2 小时前
小迪安全v2023学习笔记(七十八讲)—— 数据库安全&Redis&CouchDB&H2database&未授权&CVE
redis·笔记·学习·算法·安全·网络安全·couchdb
CC呢2 小时前
基于单片机坐姿提醒系统/久坐提醒设计
stm32·单片机·嵌入式硬件·单片机设计·久坐提醒
曙曙学编程2 小时前
stm32——寄存器操作,蜂鸣器原理
c语言·c++·stm32·单片机·嵌入式硬件