I²C协议简介

I²C协议简介

I²C(Inter-Integrated Circuit) 是一种由 Philips 提出的 双线串行通信总线 ,广泛用于 MCU 与各种传感器、存储器、外设之间的短距离通信。 它具有硬件简单、扩展性好、协议轻量等优点,因此是嵌入式领域最常见的通信方式之一。

相比SPI协议,它本身的定义相对复杂一点,可以支持多主多从的半双工通信,但是优点是它仅占用2个单片机引脚就可以实现多从机的通信。

引脚定义

SCL :时钟线,由主机生成
SDL :数据线,主从共享

SCL 与 SDA 都是 开漏(Open-Drain)结构 ,需要使用上拉电阻。

因此总线空闲时两条线都是 高电平。

通信时序

主机SDL下降沿产生START信号,从机从机接收到开始监听,SCL拉低并且以实现约好的5种速率模式其一,产生脉冲时钟信号,SCL为高时,SDL保持稳定不变,SCL为低时可变化准备采样,SCL上升沿对SDL进行采样,连续采样8个完成一个字节数据的传输,紧接着SDL交给从机拉低SDA发送ACK,ACK后主机即可发送下一个字节。

START信号后的第一个字节都是"寻址(Address + R/W)字节",由7位的地址码和一位读写位组成,所有从机收到该寻址字节后,对比自身地址,由地址匹配的从机进行ACK。

EEPROM( 24C02)读写时序

EEPROM 的写时序一般分为三步:
START → 寻址 → 内部地址 → 数据 → STOP

具体流程如下:

复制代码
START
→ [0xA0] W   (ACK)
→ [0x10] addr(ACK)
→ [0x11] (ACK)
→ [0x22] (ACK)
→ [0x33] (ACK)
→ [0x44] (ACK)
→ [0x55] (ACK)
STOP

以上是主机对地址0xA0的EEPROM的地址0x10写入5个字节的流程

复制代码
START
→ [0xA0] W (ACK)
→ [0x10] 内部地址 (ACK)
REPEATED START
→ [0xA1] R (ACK)
← [0x11] (主机 ACK)
← [0x22] (ACK)
← [0x33] (ACK)
← [0x44] (ACK)
← [0x55] (主机 NACK)
STOP

以上是主机从地址0xA0的EEPROM的地址0x10读取5个字节的流程

这里要注意2点:

1、一次 START → STOP 的事务内不能同时完成写和读 (至少对于 EEPROM 这类 I²C 设备来说)

因为EEPROM 只有在 STOP 之后才会执行真实的写入操作,如果在写完 5 字节之后立即切换读模式而不发送 STOP,内部写周期还没完成,数据尚未写入 Flash。

2、读取数据时必须重新写一次地址,修改EPROM 的内部地址指针位置,因为写入 5 个字节时,内部地址指针会指向最后写入字节的下一地址,直接读取的话会读到刚才写入的的最后一个字节的后面的内存数据

相关推荐
晓蛋3 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿3 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy3 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
phltxy3 天前
C 语言中的数据存储:从类型到二进制位
c语言
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust