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 个字节时,内部地址指针会指向最后写入字节的下一地址,直接读取的话会读到刚才写入的的最后一个字节的后面的内存数据

相关推荐
FuckPatience1 天前
Visual Studio C# 项目中文件后缀简介
开发语言·c#
014-code1 天前
订单超时取消与库存回滚的完整实现(延迟任务 + 状态机)
java·开发语言
lly2024061 天前
组合模式(Composite Pattern)
开发语言
游乐码1 天前
c#泛型约束
开发语言·c#
Dontla1 天前
go语言Windows安装教程(安装go安装Golang安装)(GOPATH、Go Modules)
开发语言·windows·golang
chushiyunen1 天前
python rest请求、requests
开发语言·python
铁东博客1 天前
Go实现周易大衍筮法三变取爻
开发语言·后端·golang
baidu_huihui1 天前
在 CentOS 9 上安装 pip(Python 的包管理工具)
开发语言·python·pip
南 阳1 天前
Python从入门到精通day63
开发语言·python
lbb 小魔仙1 天前
Python_RAG知识库问答系统实战指南
开发语言·python