起源:
由飞利浦公司在1980年代初开发的一种简单、双线双向的同步串行总线,它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。
特点:
- 只需要SDA、SCL两条总线;
- 支持总线挂载多设备(一主多从、多主多从)。连接到总线的每个设备均可通过唯一地址进行软件寻址;
- 可提供仲裁和冲突检测;
- 同步,半双工
- SCL只能主机控制,SDA看情况控制
传输速度:
- 标准模式(Standard Mode):100 Kbps
- 快速模式(Fast Mode):400 Kbps
- 高速模式(High speed mode):3.4 Mbps
- 超快速模式(Ultra fast mode):5 Mbps
通讯协议
一个完整的I2C通信过程包括以下 6 部分:
- 起始条件
- 地址传送
- 应答位
- 数据传送
- 应答位
- 终止条件
当总线上的主机都不驱动总线,总线进入空闲状态, SCL 和 SDA 都为高电平。总线空闲状态下总线上设备都可以通过发送开始条件启动通信。
起始条件:
拉低SDA启动通信,SCL高电平期间,SDA从高电平切换到低电平
终止条件:
SCL高电平期间,SDA从低电平切换到高电平
字节传输:
SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
主机发送数据,主机控制SCL ,主机控制SDA,从机读。
主机接收数据,主机控制SCL ,从机控制SDA,主机读。
应答位
- 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
- 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
地址传送
I2C通讯支持:7 位寻址和10 位寻址两种模式。
7 位寻址模式:
地址帧(8bit)的高 7 位为从机地址(注意:从机地址高四位固定,低三位是可以自己配置的)
地址帧第 8 位来决定数据帧传送的方向
7 位从机地址 + 1位 读/写位,读/写位控制从机的数据传输方向(0:写; 1:读)
10 位寻址模式:
10位地址(那就两个字节)两个字节16位 — 1位读写位 = 15位。15位前5位固定11110(头序列),以此表示是10位寻址模式 。
主机发送帧,第一帧 发送头序列(11110XX0,其中 XX 表示 10 位地址的 高 两位),然后第二帧发送低八位从机地址。
主机接收帧 ,第一帧发送头序列(11110XX0,其中 XX 表示 10 位地址的高两位),然后第二帧发送低八位从机地址。
接下来会发送一个重新开始条件,然后再发送一帧头序列(11110XX1 ,其中 XX 表示 10 位地址的高两位)
I2C时序详解
指定地址写
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
当前地址读
对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
注意:
主机控制SDA线 指定设备后,应答位之后变成 从机控制SDA线,且当发完一个字节不想再发时,应答位应该置1,这样表示主机接收字节但不回复,从机没有收到回复就会放开SDA线的控制权,如果主机回复,那么从机接收应答便会接着发送字节。
指定地址读
对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)
将指定地址写前部分(指定设备+寻址)+ 当前地址读 (全部)= 指定 地址 读
第一步做好其实指针已经指向指定地址了,第二步在当前读,就可以实现指定地址读。
参考博文 :一文搞懂I2C通信总线
江科大STM32视频