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

相关推荐
WWJA王文举10 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha131411 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
qq_4480111612 小时前
C语言中的动态内存分配
c语言·开发语言·php
动词ing13 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
汉字萌萌哒13 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter13 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
汉字萌萌哒14 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院14 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
小雨笙笙14 小时前
C语言:变量三属性——存储类型
c语言·开发语言
果果燕15 小时前
C++ 学习笔记(二):类与对象—— 构造函数与析构函数
开发语言·c++