ESP32S3学习Vol1:I2C协议与使用

ESP32S3学习——i2c,点亮0.96寸oled 阅读详情

一、背景与原理介绍

I2C本来的写法应该是  I^{2}C  ,一般口语称作:I方C。这么称呼是因为它的全称:Inter-Intergrated Circuit。它是一种简单、双向、二线制总线标准。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。主机启动总线,并产生时钟用于传送数据,此时任何接收数据的器件均被认为是从机。

IIC使用两根信号线通信,SCL和SDA,即时钟线和数据线。IIC将SCL处于高电平时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号;传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。

以上可以理解到,时钟的高电平才会让SDA的动作有意义。

二、物理层的特点

  • 一条总线上可以连接多个IIC通讯设备,支持多个通信主机及多个通信从机。
  • 一个 I2C 总线只使用两条总线线路,一条双向串行数据线 (SDA),一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
  • 不同于SPI使用SS来选择设备,IIC协议中每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
  • 总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
  • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
  • 三种传输模式:标准模式为100kbit/s ,快速模式为400kbit/s ,高速模式下可达3.4Mbit/s,但目前大多I2C 设备尚不支持高速模式。
  • 连接到相同总线的IC 数量受到总线的最大电容400pF 限制。

三、协议层机制

主机从机开始通信之前,两条线因为上拉电阻的缘故呈高电平,此时IIC空闲。开始数据传输的标志是:SCL高电平期间将SDA拉低,这将会产生一个开始信号。从机接收到这个开始信号后,就开始准备接收数据,SCL高电平期间将SDA拉高,这将会产生停止信号,就可以停止数据传输。不论哪种情况,必须是SDA的电平发生转换才可以,而不是保持某个电平状态。时序图如图所示:

在数据进入从机之前,开始信号已经发出,需要在开始信号发出后,在SCL的第一个低电平进行SDA的数据变更,之后将SDA拉高,这整个过程需要处于SCL的下一个高电平来到之前。之后下一个低电平到来,先拉低SDA并再次更改数据,再拉高,加粗字段都必须在下一个高电平到来之前。每次可以传输一位数据。

第 8 个时钟周期的SCL从高电平向低电平切换时,主机将会释放SDA 以使从机应答,在第 9 个时钟周期,从机需要将 SDA 拉低以完成应答;如果第 9 个时钟周期,SCL 为高电平时,SDA 未被检测到为低电,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。我们要注意的是数据以 8 bit 即一个字节为单位串行发出,其最先发送的是字节的最高位。

总结:传输数据、更改数据各自高低电平不同,但都需要保持;开始信号和停止信号需要在SCL高电平期间让SDA发生电平转换而不是保持高电平或低电平。

IIC空闲时、SCL高电平、SDA从高到低:开始信号

IIC应答后、SCL高电平、SDA从低到高:停止信号

SCL低电平、SDA切换:更改高低电平来切换这个位是0还是1

SCL高电平、SDA保持:传输数据

每8个时钟周期结束后、SDA保持低电平:从机应答

器件地址(也称从机地址,SLAVE ADDRESS):每个I2C 器件都有一个器件地址,有些 I2C 器件的器件地址是固定的,而有些 I2C 器件的器件地址由一个固定部分和一个可编程的部分构成。当主机想给某个器件发送数据时,只需向总线上发送接收器件的器件地址即可。 进行数据传输时,主机首先向总线上发出开始信号,对应开始位S,然后按照从高到低的位序发送器件地址,一般为 7bit,第 8bit 位为读写控制位R/W,该位为 0 时表示主机对从机进行写操作,当该位为1 时表示主机对从机进行读操作,然后接收从机响应。对于AT24C64 来说,其传输器件地址格式如下图所示。

发送完第一个字节(7 位器件地址和一位读写控制位)并收到从机正确的应答后就开始发送字地址(Word Address)。一般而言,每个兼容 I2C 协议的器件,内部总会有可供读写的寄存器或存储器,要在写入数据前先写入要写入的寄存器地址,然后再进行数据传输。

主机发送完字地址,从机正确应答后就把内部的存储单元地址指针指向该单元。如果读写控制位 R/W位为“0”即写命令,从机就处于接收数据的状态,此时,主机就开始写数据了。写数据分为单次写(对于EEPROM 而言,称为字节写)和连续写(对于 EEPROM 而言,称为页写),两者的区别在于发送完一字节数据后,是发送结束信号还是继续发送下一字节数据,如果发送的是结束信号,就称为单次写,如果继续发送下一字节数据,就称为连续写。 

如果读写控制位R/W 位为“1”即读命令,主机就处于接收数据的状态,从机从该地址单元输出数据。读数据有三种方式:当前地址读、随机读和连续读。当前地址读是指在一次读或写操作后发起读操作。由于 I2C 器件在读写操作后,其内部的地址指针自动加一,因此当前地址读可以读取下一个字地址的数据。也就是说上次读或写操作的单元地址为 02 时,当前地址读的内容就是地址03 处的单元数据。

由于当前地址读极不方便读取任意的地址单元的数据,所以就有了随机读。发送完器件地址和字地址后,竟然又发送起始信号和器件地址,而且第一次发送器件地址时后面的读写控制位为“0”,也就是写命令,第二次发送器件地址时后面的读写控制位为“1”,也就是读。为什么会有这样奇怪的操作呢?这是因为我们需要使从机内的存储单元地址指针指向我们想要读取的存储单元地址处,所以首先发送了一次Dummy Write 也就是虚写操作,之所以称为虚写,是因为我们并不是真的要写数据,而是通过这种虚写操作使地址指针指向虚写操作中字地址的位置,等从机应答后,就可以以当前地址读的方式读数据了,如图 所示,随机地址读是没有发送数据的单次写操作和当前地址读操作的结合体。 

连续读,对应的是当前地址读和随机读都是一次读取一个字节而言的,它是将当前地址读或随机读的主机非应答改成应答,表示继续读取数据。

 图片皆源自参考文章。

参考文章:基础通信协议之 IIC详细讲解 - 知乎 (zhihu.com)

本人博客内容仅供交流学习用,如涉侵权联系本人侵删。 

I²C总线协议原理、硬件设计与ESP32-S3实战 I²C(Inter-Integrated Circuit)是一种广泛应用于嵌入式系统的双线制串行通信协议,其核心在于开漏结构、主从寻址与硬件级ACK/NACK应答机制。该协议通过SCL时钟同步与SDA数据线实现多设备共享总线,无需片选信号,显著降低引脚与布线资源消耗。技术价值体现在低功耗、高集成度与强抗干扰设计,适用于传感器网络、OLED显示、温度采集等典型场景。工程实践中需重点关注上拉电阻计算、总线电容限制、时序参数(如tSU:STA、tr)及主从仲裁逻辑。本文结合ESP32-S3硬件I²C控制器与Ard 阅读详情

相关推荐

第13章 实战派ESP32-S3蓝牙HID设备开发:打造触屏音量遥控器

本文详细介绍了基于ESP32-S3开发板打造触屏蓝牙音量遥控器的实战开发过程。通过解析蓝牙HID协议、LVGL图形库应用及代码改造,指导开发者从零构建一个可连接手机或电脑的实用蓝牙HID设备,实现通过触摸屏控制媒体音量。

weixin_42527589的博客 307

19-ESP32-S3外设IIC

IIC是一种串行、同步、多设备、半双工通信协议,允许同一总线上存在多个主设备和从设备。IIC使用两个双向开漏线:串行数据线(SDA)和串行时钟线(SCL),由电阻上拉。ESP32-S3有2个IIC控制器(也称为端口),负责处理I2C总线上的通信。每个控制器都可以设置为主机或从机。IIC 总线有如下特点总线由数据线 SDA 和时钟线 SCL 构成的串行总线,数据线用来传输数据,时钟线用来同步数据收发。总线上每一个器件都有一个唯一的地址识别,所以我们只需要知道器件的地址,根据时。

宁子希的博客 6732

I2C总线协议深度解析:从规范到实战应用指南

本文深度解析I2C总线协议,从基础规范到实战应用全面覆盖。详细讲解I2C的两线设计、主从架构、多控制器仲裁等核心机制,并提供STM32硬件配置、软件模拟实现等代码范例。针对常见故障给出专业排查指南,并探讨I2C在传感器网络等现代场景中的拓展应用,帮助开发者高效掌握这一经典总线协议。

weixin_33686714的博客 578

ESP32学习笔记(17)——I2C接口使用

一、I2C简介 I2C(Inter-Integrated Circuit ,内部集成电路) 总线是一种由飞利浦 Philip 公司开发的串行总线。是两条串行的总线,它由一根数据线(SDA)和一根 时钟线(SDL)组成。两条线都需要上拉电阻。I2C 总线上可以接多个 I2C 设备,每个器件都有一个唯一的地址识别。同一时间只能有一个主设备,其他为从设备。通常 MCU 作为主设备控制,外设作为从设备。 ESP32有两个I2C控制器(也称为端口),负责处理I2C总线上的通信。每个I2C控制器都可以作为主机或从机运

Leung的博客 2万+

ESP32驱动MAX30102血氧传感器,手指一碰就失联?一个硬件细节引发的I2C通讯故障排查实录

本文详细记录了ESP32驱动MAX30102血氧传感器时,因人体电容导致I2C通讯故障的排查与解决方案。通过硬件调优和软件容错设计,解决了手指接触引发的信号完整性问题,为类似硬件开发提供了实用指南。

weixin_42552716的博客 355

ESP32-S3 GPIO底层原理与LED控制全链路解析

GPIO(通用输入输出)是嵌入式系统最基础的硬件接口,其本质是MCU对引脚电平状态的可编程控制。理解其工作原理需深入时钟使能、寄存器映射、方向配置及电平驱动能力等底层机制。在ESP32-S3平台上,GPIO行为还受HAL层、Arduino抽象、MOSFET反相电路等多重因素影响,导致常见‘LED不亮’问题往往源于电平逻辑反转或引脚复用冲突。掌握GPIO寄存器级操作(如GPIO_OUT_W1TS_REG写1置位)和硬件电气约束(如VIH/VIL阈值、灌/拉电流限值),不仅能精准调试LED闪烁实验,更是实现可靠

weixin_35761094的博客 383

ESP32S3学习Vol2:SPI协议与使用

CPHA的不同参数则规定了数据采样是在SCK时钟的奇数边沿还是偶数边沿,CPHA = 0,数据采样是在SCK时钟的奇数边沿,CPHA = 1,数据采样是在SCK时钟的偶数边沿,这里不使用上升沿或下降沿表示,是因为不同模式下,奇数边沿或偶数边沿与上升沿或下降沿的对应不是固定的。数据更新在SCK时钟的偶数边沿,本模式中,偶数边沿为上升沿。CPOL:就是表示设备未被选中的空闲状态时,串行时钟SCK的电平状态,CPOL = 0,空闲状态时SCK为低电平,CPOL = 1,空闲状态时SCK为高电平;

qq_46025708的博客 2244

【雕爷学编程】MicroPython手册之 ESP32-S3 SoftI2C总线

需要注意的是,在实际应用中,我们需要根据具体的硬件设备和通信协议来调整通信参数和数据格式,以确保通信的正确性。需要注意的是,在实际应用中,我们需要根据具体的硬件设备和通信协议来调整通信参数和数据格式,以确保通信的正确性。具体来说,我们将使用softi2c.soft_i2c()函数创建SoftI2C对象,并使用softi2c.readfrom()函数从外部设备读取数据,使用softi2c.writeto()函数向外部设备发送数据。由于软件模拟的特性,SoftI2C总线的速度受限于处理器的处理能力和系统负载。

雕爷学编程 832

Proteus元器件选型:匹配ESP32-S3 GPIO电平逻辑

本文深入解析ESP32-S3的GPIO电平特性,探讨3.3V逻辑与5V系统的兼容问题,指导如何在Proteus中构建高保真仿真模型,验证电平匹配、噪声容限和驱动能力,并通过典型故障复现建立‘仿真-选型-验证’闭环流程,提升嵌入式系统设计可靠性。

net55的博客 1450

【雕爷学编程】MicroPython手册之 ESP32-S3 Hardware I2C bus

在主循环中,我们首先同时向RGB LED的R、G、B三个通道发送控制指令,将它们的颜色设置为红色、绿色和蓝色,以实现RGB LED发出彩色的效果。需要注意的是,在实际应用中,我们需要根据具体的硬件设备和通信协议来调整通信参数和数据格式,以确保通信的正确性。需要注意的是,在实际应用中,我们需要根据具体的硬件设备和通信协议来调整通信参数和数据格式,以确保通信的正确性。在设计和实现I2C通信时,需要确保时钟线和数据线的时序满足设备的要求,以保证通信的可靠性和正确性。

雕爷学编程 494

ESP32-S3模组上跑通ES8388(7)

ESP32-S3模组上跑通ES8388(7)

phmatthaus的专栏 1831

乐鑫ESP32-S3-Korvo-2开发板:面向多媒体应用的AIoT解决方案

ESP32-S3-Korvo-2是乐鑫推出的多媒体开发板,基于ESP32-S3芯片,集成双麦克风阵列、LCD接口、摄像头接口和microSD卡槽。核心采用ESP32-S3-WROOM-1模组,支持AIoT应用。配备专业音频芯片ES7210、ES8311和NS4150,实现高质量音频处理。提供丰富外设接口和独立供电设计,降低噪声干扰。兼容ESP-ADF开发框架,支持快速开发智能家居、语音控制等音视频应用,搭配LCD扩展板可增强显示交互功能。

m0_59195407的博客 961

ESP32-S3模组上跑通ES8388(8)

ESP32-S3模组上跑通ES8388(8)

phmatthaus的专栏 1013

I2C通信的隐形陷阱:ESP32开发中那些容易被忽略的时序与电气特性

本文深入探讨ESP32开发中I2C通信的隐藏挑战,重点解析信号完整性、时序要求、电源噪声等关键电气特性。通过实际上拉电阻计算、时序参数调整和噪声抑制方案,帮助开发者规避常见陷阱,提升I2C外设开发稳定性与可靠性。

root9的博客 161

【AI Infra】【RLHF框架】VeRL中WorkerGroup与Ray资源调度的协同机制剖析

本文深入剖析了VeRL框架中WorkerGroup与Ray资源调度的协同机制。通过解析Ray Placement Group的资源抽象和VeRL的RayResourcePool封装,详细阐述了WorkerGroup如何与底层资源精确绑定,并实现RLHF训练中异构、多阶段任务的灵活资源分配与动态调整,为大规模分布式强化学习训练提供了高效解决方案。

weixin_29204205的博客 391

【信号与系统实战解析】—— 拉普拉斯变换在电路分析中的关键应用

本文深入解析了拉普拉斯变换在电路分析中的关键应用。通过将时域微分方程转换为复频域的代数方程,系统化处理初始条件,并利用零极点图分析电路稳定性与频率响应。文章以RLC串联电路为例,详细演示了s域建模、性质运用及综合分析方法,为工程师提供了分析动态电路的强大工具与清晰视角。

weixin_29093017的博客 174

ESP32-S3-ESP-IDF-正点

123。

2401_84041215的博客 314

【入门篇】第五章 第一次与 AI Agent 交互

本文介绍了OpenClaw中最基本的用户与AI Agent交互方式,剖析了Agent和Gateway两个核心组件的作用,通过简单示例展示了从用户请求到结果返回的完整执行流程,说明了最小交互过程对验证系统可用性的重要意义,为后续学习复杂任务执行机制奠定基础。

lanyv的博客 512

I²C总线协议原理与硬件设计要点解析

I²C(Inter-Integrated Circuit)是一种广泛应用于嵌入式系统的板级串行通信协议,其核心特征为双线制(SDA/SCL)、开漏输出与上拉电阻驱动、多主多从寻址机制。该协议基于硬件电气约束(如总线电容、灌电流能力)定义时序边界,通过START/STOP条件、ACK/NACK应答及地址仲裁实现可靠字节传输。在GPIO资源受限、外设数量较多且数据速率要求不高(≤400 kbps)的场景下,I²C展现出显著的引脚经济性与系统集成优势。典型应用涵盖温湿度传感器(BME280)、OLED显示屏(SS

java5的博客 1112

几何修复_ANSYS流体分析:几何前处理

建模及几何处理工具非常多,选择起来让人眼花缭乱。对于仿真而言,高效的对几何进行清理及生成符合仿真要求的几何至关重要。ANSYS SpaceClaim Direct Modeler是基于直接建模思想的新一代3D高效率建模和几何编辑修补软件。SCDM提供了当今最快速、最富有创意的直接建模解决方案。由于它的直接建模能力即使对于导入的其它3D模型(如catia、proe、solid works创建的几何)...

weixin_35778830的博客 2418

基于深度学习 YOLOv11 的快递包裹检测系统(Python + PySide6 界面 + 训练代码)

成为亟需优化的重要环节。随着电子商务的快速发展,物流行业面临着越来越大的压力,为了解决这些问题,我们提出了一种。目标检测算法,实现快递包裹的。的界面,供用户进行实时监控。本项目的主要目标是利用。

斌擎科技 763

I2C总线协议详解:从原理到实战的嵌入式通信指南

在嵌入式系统和物联网设备开发中,芯片间通信是构建功能模块的基础。串行通信总线因其连线少、成本低的优势,成为连接微控制器与各类传感器、存储器的首选方案。其中,I2C(Inter-Integrated Circuit)总线以其极简的二线制(SDA数据线和SCL时钟线)和同步通信机制,在简洁性、可扩展性与成本之间取得了卓越平衡。其核心原理在于通过时钟线同步时序,并利用7位地址机制实现多主多从设备的高效寻址,这解决了并行总线线多、面积大以及异步串口点对点扩展麻烦的痛点。该技术的价值在于为空间和成本敏感的嵌入式设备提

weixin_34189116的博客 414

搞定最强大模型Gemini学生订阅,白嫖一年,包教包会

白嫖现在最强大模型

BUG猿的博客 2万+

别再死记硬背了!用Arduino和ESP32的I2C实战,彻底搞懂开漏输出和上拉电阻

本文通过Arduino和ESP32的I2C实战,深入解析开漏输出和上拉电阻的物理本质。从实验准备到波形分析,详细展示了开漏输出的工作原理及上拉电阻的选择方法,帮助开发者彻底理解I2C总线的底层机制。

weixin_30790841的博客 388

在hyper-v管理器中修改WSL虚拟交换机后,打开wsl闪退

此次是因为修改了WSL虚拟交换机造成的wsl打不开或闪退,还有一种可能是关闭了hyper-v造成了wsl。

DN金猿的博客 1173

uniapp(微信小程序) - 实现uniapp小程序电子签名板,横屏手写姓名签名专用写字画板,客户专用签字板,手写签名签字画板组件,手写签名,(详细运行示例,一键复制开箱即用)

uniapp实现微信小程序的电子签名效果,uniapp微信小程序 电子签名 写字板,用uniapp实现微信小程序的电子签名,uniapp微信小程序canvans实现手写签名,记录一个uniapp写的小程序的手写板,横屏,用于签名,unniapp实现电子签名,uniapp怎么做横屏的手写签名,uniapp如何实现签字板,uniapp小程序平台下怎么做电子签名板组件,uniapp电子签名插件,uniapp最好用的电子写字板插件组件源码,实现uniapp 手写签名功能,手写板、签字板,uni-app插件市场最好的

✅ 精选推荐文章 1万+
上一篇: C++学习Vol1:vector的用法
下一篇: ESP32S3学习Vol2:SPI协议与使用
Kroto x
博客等级 码龄7年 1粉丝 4原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值