上一篇 下一篇
ADC 使用过程中遇到的问题


IIC

IIC:Inter Integrated Circuit,集成电路总线

1)IIC 总线结构和协议

总线:硬件层传输数据通道

协议:传输数据的规则

  • 串行、同步、半双工
  • 主要用于近距离、低速的芯片之间的通信。
  • IIC 总线有两根双向的信号线,一根是数据线 SDA ,用于收发数据;一根时钟线 SCL ,用于通信双方时钟的同步。

1.1)总线结构图

在这里插入图片描述

  • 由时钟线 SCL 和数据线 SDA 组成,并且都接上拉电阻,确保 总线空闲状态为高电平
  • 总线支持多设备连接,设备分为主机和从机,允许多主机存在每个设备都有一个唯一的地址
    • 一般情况下,设备通讯地址 = 设备地址(7位) + 读写位(1位:0为写,1为读),在物理传输时是 8 位(1 字节);
    • 主机通常是“大脑”——如 MCU 或处理器(也可以作为从机);
    • 从机通常是“感官或四肢”——如传感器、存储器、外设芯片。
  • 连接到总线上的设备数目受总线的最大电容 400pf 限制(挂载的设备都有自身的电容)
  • 数据传输速率标准模式 100k bit/s 、快速模式 400k bit/s 、高速模式3.4Mbit/s

1.2)协议/时序

IIC 协议可以概括为三个信号、数据、两个状态:

在这里插入图片描述

① 时序

在这里插入图片描述

在这里插入图片描述


  • 数据及数据发送:
    • 数据传输单位是 1 字节(8 位,占 8 个时钟周期)
    • 高位先发(比如 0x80=10000000,第一个有效时钟周期先发 1 ,然后以此类推)
    • SCL 线处于高电平时,接收器读取数据(在起始信号之后的 SCL 高电平期间,发送器将 SDA 线拉高或拉低并保持稳定,接收器会在此期间读取 SDA 线上的电平作为数据)
    • 发送器在发送完数据之后要释放 SDA 线(拉高 SDA 线),然后等待接收器发送应答信号

  • 起始信号: 当 SCL 为高电平时,SDA 从高电平变为低电平(主机发出)
    • 起始信号发出后,IIC 总线就处于忙碌状态,其他主机就不能连接

  • 时钟信号:
    • 硬件 I²C:由 MCU 内置 I²C 控制器实现,SCL 通过内部分频器对系统时钟(如 APB1)分频自动生成,严格符合协议时序,支持中断/DMA,CPU 开销小(这种情况下:SCL 是由 IIC 控制器自动产生的固定时序信号,无需(也不应)手动干预)。
      • 在 SDA 线被拉低后,硬件会自动拉低 SCL,然后按照固定频率变化电平
    • 软件模拟 I²C: 用两个 GPIO 模拟 SCL/SDA,靠 CPU 控制引脚电平 + 精确延时(如微秒级循环)来生成时钟,无专用硬件,时序依赖主频,不支持可靠时钟延展(这种情况下:时钟信号不是固定周期的自动高低电平,而是需要的时候手动拉高或拉低)。
      • 主机首先在 SCL 为高时将 SDA 拉低(产生启动条件);然后主机会立即拉低 SCL——这是时钟的第一个下降沿;然后SDA电平更新并稳定后,主机将 SCL 释放——这是时钟的第一个上升沿;然后手动循环

  • 停止信号: 当 SCL 为高电平时,SDA 从低电平变为高电平(主机发出)
    • 停止信号发出后,IIC 总线就处于空闲状态,其他主机可以连接

  • 应答信号: 上拉电阻影响下 SDA 默认为高,而 接收器 在第 9 个时钟脉冲的高电平期间拉低 SDA 就是确认收到数据,即为 ACK,否则为 NACK。不论是主机还是从机,都可以是接收器,在收到数据后都要发送应答信息
    • 从机发 ACK :比如说主机发从机收,主机在 SDA 线上给从机发送了 8 位数据,然后从机收到后,赶在第 9 个时钟周期内拉低 SDA 线,此时主机检测到了 SDA 线处于低电平状态,则认为接收到了从机的应答信号。
    • 主机发 ACK :和上面的类似,从机发主机收,那么主机就要在第 9 个时钟周期内拉低 SDA 线,以此来告诉从机收到数据了。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐