I2C 通讯协议-学习笔记


1、I2C 简介

​ I2C(芯片间)总线接口连接微控制器和串行 I2C 总线。它提供多主机功能,控制所有 I2C 总线特定的 时序协议仲裁定时

I2C 模块有多种用途,包括 CRC 码的生成和校验、SMBus(系统管理总线-System Management Bus)和 PMBus(电源管理总线-Power Management Bus)。

1.1、I2C 定义

  • I2C(Inter IC)总线:一个简单的双向两线总线,实现有效的IC之间控制,使硬件效益最大电路最简单。

  • I2C 属于串行半双工同步通信方式。

  • 只有两条总线线路:一条串行数据线(SDA)、一条串行时钟线(SCL)。

  • 每个连接到总线的器件可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址。

  • 多主机功能

  • 支持不同的通讯速度

1.2、使用I2C的好处

  1. 设计人员得益

    符合 I2C总线 的 IC(集成电路:Integrated Circuit)的特点:

    • 结构图的 功能模块实际的IC 对应。
    • 不需要设计总线接口,因为I2C总线接口已经集成在片上。
    • 集成的寻址数据传输协议 允许系统完全由软件定义。
    • 在系统中 增加或删除IC 不会影响总线的其它电路。
    • 故障诊断和调试都很简单:故障可被立即寻迹
    • 具有一个高度集成的软件模块库,充分减少软件开发时间。

    符合 I2C总线 的 CMOS IC 在可移植装置和电池供电系统方面提供特殊的功能:

    • 极低的电流消耗。
    • 抗高噪声干扰。
    • 电源电压范围宽。
    • 工作的温度范围广。
  2. 厂商得益

    ​ 符合 I2C总线 的 IC 不只是帮助了设计者,设备厂商也颇有受益,因为:

    • 简单的两线串行 I2C总线将互联减到了最小,因此 IC 的管脚更少而且 PCB 的线路也减少。结果使 PCB 更小和更便宜。
    • 完全完整的 I2C 总线协议不需要地址译码器和其它“胶合逻辑”。
    • I2C总线 的多主机功能允许通过外部连接到生产线快速测试和调整设备。
    • 符合 I2C总线的 IC 提供 SO(小型)、VSO(超小型)以及 DIL 封装,减少了 IC 的空间要求。

2、I2C 功能描述

​ 下面介绍 I2C 功能框图I2C 物理层 以及 I2C 协议层

2.1、STM32的 I2C 的架构剖析

在这里插入图片描述

  • 第一部分为 通讯引脚。分别为数据传输的串行数据线(SDA)、用于产生时钟信号的串行时钟线(SCL)、SMBA(SMBA 线用于 SMBUS 的
    警告信号。SMBUS 是 I2C 的一种特殊功能,I2C 通讯没有使用 )。
  • 第二部分为 时钟控制逻辑。SCL 线的时钟信号,由 I2C 接口根据时钟控制寄存器 (CCR) 控制,控制的参数主要为时钟频率
  • 第三部分为 数据控制逻辑。I2C 的 SDA 信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器 (DR)、地址寄存器 (OAR)、 PEC 寄存器(用于存储数据校验运算结果)以及 SDA 数据线。
  • 第四部分为 整体控制逻辑部分。整体控制逻辑负责协调整个 I2C 外设,控制逻辑的工作模式根据我们配置的“控制寄存器 (CR1/CR2)”的参数而改变。

2.2、I2C 物理层

​ I2C 通讯设备之间的常用连接方式(常见的 I2C 通讯系统)

在这里插入图片描述

  • 物理层具有如下特点
    1. “总线”指支持多个设备共用的信号线。即一个 I2C 通讯总线中,可连接多个 I2C 通讯设备。支持多个通讯主机及多个通讯从机
    2. 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA,用来传输数据),一条串行时钟线(SCL,用来数据收发同步)。
    3. 每个连接到总线的设备都有一个独立的地址。主机可利用这个地址进行不同设备之间的访问。
    4. 为了实现线与的特性,总线通过上拉电阻连接到电源。当 I2C 设备空闲时,会输出高阻态(实现线与的特性。电阻特别大相当于断开);当所有设备都空闲,即都为高阻态时,由上拉电阻把总线拉成高电平。
    5. 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
    6. 具有三种传输模式:标准模式传输速率 100kbit/s、快速模式传输速率 400kbit/s。高速模式传输速率 3.4Mbit/s。但目前大多 I2C 设备不支持高速模式。
    7. 连接到相同总线的 IC 数量只受到总线的最大电容400pF限制

​ 使用 I2C 外设通讯时,在通讯的不同阶段它会对“状态寄存器 (SR1 及 SR2)”的不同数据位写入参数,我们通过读取这些寄存器标志来了解通讯状态。

​ 其通讯过程可分为以下主发送器、主接收器两种过程。

2.2.1、主发送器(!!!)

​ 下图为“主发送器”流程。即作为 I2C 通讯的主机端时,向外发送数据时的过程。

在这里插入图片描述

  1. 控制产生起始信号 (S),当发生起始信号后,它产生事件“EV5”,并会对 SR1 寄存器的“SB”位置 1,表示起始信号已经发送
  2. 紧接着发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6” 及“EV8”,这时 SR1 寄存器的“ADDR”位及“TXE”位被置 1。 ADDR 为 1 表示地址已经发送, TXE 为 1 表示数据寄存器为空
  3. 以上步骤正常执行并对 ADDR 位清零后,往 I2C 的“数据寄存器 DR”写入要发送的数据,这时 TXE 位会被重置 0,表示数据寄存器非空。 I2C 外设通过 SDA 信号线一位位把数据发送出去后,又会产生“EV8”事件,即 TXE 位被置 1。重复这个过程,就可以发送多个字节数据了;
  4. 当我们发送数据完成后,控制 I2C 设备产生一个停止信号 §,这个时候会产生 EV8_2 事件,SR1 的 TXE 位及 BTF 位都被置 1,表示通讯结束。

​ 假如我们使能了 I2C 中断,以上所有事件产生时,都会产生 I2C 中断信号,进入同一个中断服务函数,到 I2C 中断服务程序后,再通过检查寄存器位来判断是哪一个事件。

2.2.2、主接收器(!!!)

​ 主接收器过程,即作为 I2C 通讯的主机端时,从外部接收数据的过程,见下图主接收器过程 。

在这里插入图片描述

  1. 同主发送流程,起始信号 (S) 是由主机端产生的。控制发生起始信号后,它产生事件“EV5”,并会对 SR1 寄存器的“SB”位置 1,表示起始信号已经发送;
  2. 紧接着发送设备地址并等待应答信号,若有从机应答,则产生件“EV6”这时 SR1 寄存器的“ADDR”位被置 1,表示地址已经发送。
  3. 从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件, SR1 寄存器的 RXNE 被置 1,表示接收数据寄存器非空,我们读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时我们可以控制 I2C 发送应答信号 (ACK) 或非应答信号 (NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;
  4. 发送非应答信号后,产生停止信号 §,结束传输。

2.3、I2C 协议层

​ I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

  • I2C 总线协议-通信时序图

在这里插入图片描述

  • 主模式时

    • I2C 接口启动数据传输并产生时钟信号
    • 串行数据传输总是以起始条件开始并以停止条件结束
    • 起始条件和停止条件都是在主模式下由软件控制产生。
  • 从模式时

    • I2C 接口能识别它自己的地址(7位或10位)和 广播呼叫地址
    • 软件控制地址识别:软件能够开启或禁止广播呼叫地址识别。
  • MSB:数据和地址按 8 位/字节进行传输,高位在前。(上面时序图中 SDA 总线上,显示 MSB 表示先传输高位数据)

    • 地址只在主模式发送
    • 跟在起始条件后的1或2个字节是地址。(7 位模式为 1个字节,10 位模式为 2个字节)
  • ACK:在一个字节传输的 8个时钟后的第9个时钟期间,接收器必须回答一个应答位(ACK)给发送器。

2.3.1、I2C 基本读写过程

​ I2C 通讯过程有三种:

  • 主机写数据到从机 过程。
  • 主机由从机中读数据 过程。
  • I2C 通讯复合模式。

下面的三个图,表示主机和从机通讯时,SDA 线的数据包序列。

  1. 主机写数据到从机

在这里插入图片描述

​ 此时,配置的方向传输位为“写数据”方向。当主机广播完地址后,接收到应答信号后,主机开始正式向从机传输数据(DATA),数据包的大小为 8 位。主机每发送完一个字节数据,都要等待从机的应答信号(ACK)。重复这个过程,可以向从机传输 N 个数据,这个 N 没有大小限制。当数据传输结束时,主机向从机发送一个停止传输信号(P),表示不再传输数据。

  1. 从机中读数据

在这里插入图片描述

​ 此时,配置的方向传输位为“读数据”方向。当主机广播完地址后,接收到应答信号后,从机开始向主机返回数据(DATA),数据包大小也为 8 位。从机每发送完一个字节数据,都要等待从机的应答信号(ACK)。重复这个过程,可以向从机传输 N 个数据,这个 N 没有大小限制。当主机希望停止接收数据时,就向从机返回一个非应答信号(NACK),则从机自动停止数据传输。

  1. I2C 通讯复合模式

在这里插入图片描述

​ 除了基本的读写,I2C 通讯更常用的时复合格式。该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过从机地址信号(SLAVE ADDRESS)寻找到从机设备后,发送一段“数据”。这段数据通常用于表示设备内部的寄存器或存储器地址(注意区分,第一个SLAVE ADDRESS为从机地址;紧随其后的数据(DATA)为从机设备内部的寄存器或存储器地址。一定要注意!!!)。 第二次传输中,对该地址的内容进行 读/写 数据。也就是说,第一次通讯是告诉从机读/写地址,第二次则是读写的实际内容。

​ 下面介绍上面数据包序列 中相应位的表示:

  • S 信号位:表示主机的 I2C 接口产生的传输起始信号(S),这时连接到 I2C 总线上的所有从机都会接收到这个信号。
  • SLAVE ADDRESS:从机地址信号。起始信号(S)产生后,所有从机就开始等待主机随后广播的从机地址信号(SLAVE ADDRESS)
    • 在 I2C 总线上,每个设备的地址都是唯一的。
    • 当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备就会忽略之后的数据信号(即上面提到的,未被选中的设备就变为高阻态。不再接收 I2C 上的数据信号)。
    • 这个从机地址可以是 7位/10位
  • R/W:传输方向选择位(其中W上有一横,代表低电平写入W,高电平读取 R)。
    • 该位为 0 时:表示主机向从机写入数据。
    • 该位为 1 时:表示主机从从机中读取数据。
  • ACK(NACK):应答(非应答)信号。
    • 从机接收到匹配的地址后,从机会返回一个应答(ACK)或 非应答(NACK)信号。
    • 只有接收到应答信号后,主机才能继续发送或接收数据。

2.3.2、通讯的起始和停止信号

​ 上一小节提到的 起始(S)和 停止(P)信号是两种特殊的状态。其通讯时序图如下

在这里插入图片描述

  • 起始和停止信号一般由主机产生。

​ 当 SCL 线是高电平时,SDA 线从高电平向低电平切换(下降沿有效),表示通讯的起始。

​ 当 SCL 线是高电平时,SDA 线从低电平向高电平切换(上升沿有效),表示通讯的停止。

2.3.3、数据有效性

​ I2C 使用 SDA 信号线来传输数据,使用 SCL 信号线进行数据同步。其数据有效性的时序图如下:

在这里插入图片描述

​ SDA 数据线在 SCL 的每个时钟周期(SCL 线上 相邻高电平+低电平时间为一个周期)传输一位数据。传输时,每次数据传输都以字节为单位,每次传输的字节数不受限制。

  • SCL 为高电平的时候 ,SDA 表示的数据有效。即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。
  • SCL 为低电平的时候 ,SDA 的数据无效。一般在这个时候 SDA进行电平切换,为下一次表示数据做准备。

2.3.4、地址及数据方向

​ I2C 总线上,每个设备都有自己的独立地址。主机发起通讯时,通过 SDA 信号线发送设备地址(SLAVE ADDRESS)来查找从机。I2C 协议规定设备地址可以是 7/10位,实际中 7位的地址应用比较广泛。见下图为设备地址即数据传输方向位

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​ 紧跟设备地址的一个数据位用来表示数据传输方向,即数据方向位(R/W,位于第8位或第11位)。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。

​ 注:读数据方向时,主机会释放对 SDA 信号线的控制,由从机控制 SDA 信号线,主机接收信号。写数据方向时,SDA 由主机控制,从机接收信号。

2.3.5、响应

​ I2C 的数据和地址传输都带响应。响应包括 “应答(ACK)”和“非应答(NACK)”两种信号。下图为响应与非响应信号时序图

在这里插入图片描述

​ 作为数据接收端时,当设备(无论主从机)接收到 I2C 传输的一个字节数据或地址后。若希望对方继续发送数据,则需要对方发送“应答(ACK)”信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。

​ 传输时主机产生时钟,在第9个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制 SDA。若 SDA 为高电平,表示“非应答(NACK)”信号,若 SDA 为低电平,表示“应答(ACK)”信号。

2.4、I2C 协议的实现方式

  • 软件模拟协议

​ 由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为 “软件模拟协议” 方式。

​ 如果我们直接控制 STM32 的两个 GPIO 引脚,分别用作 SCL 及 SDA。按照上述信号的时序要求,直接像控制 LED 灯那样控制引脚的输出 (若是接收数据时则读取 SDA 电平),就可以实现 I2C 通讯。同样,假如我们按照 USART 的要求去控制引脚,也能实现 USART 通讯。

​ 所以只要遵守协议,就是标准的通讯,不管您如何实现它,不管是 ST 生产的控制器还是 ATMEL 生产的存储器,都能按通讯标准交互。

  • 硬件协议

​ STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议。只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来。CPU 只要检测该
外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C 协议的方式减轻了 CPU 的工作,且使软件设计更加简单。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅尝写博客的爽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值