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

相关推荐
寻星探路7 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
lly2024068 小时前
Bootstrap 警告框
开发语言
2601_949146539 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
曹牧9 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX9 小时前
服务异步通信
开发语言·后端·微服务·ruby
zmzb01039 小时前
C++课后习题训练记录Day98
开发语言·c++
猫头虎10 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
YUJIANYUE10 小时前
PHP纹路验证码
开发语言·php
仟濹11 小时前
【Java基础】多态 | 打卡day2
java·开发语言
孞㐑¥11 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法