当前位置: 首页 > article >正文

硬件I2C和软件I2C的区别

硬件I2C和软件I2C的区别

一、硬件I2C

1、硬件I²C的局限性及学习意义

尽管硬件I²C外设在STM32等微控制器中提供了标准化的通信支持,但在实际应用中,其稳定性可能存在问题。例如,某些情况下外设会因事件检测异常而进入死锁状态,仅能通过断电复位恢复。尽管如此,掌握硬件I²C的实现方法仍具有重要价值,不仅有助于理解I²C协议本身,还能为后续学习其他通信协议奠定基础。

硬件I²C的工作原理

硬件I²C通过微控制器内置的专用外设实现,其功能类似于USART串口模块。用户仅需配置相关寄存器,外设即可自动生成符合I²C标准的时序信号。与软件模拟不同,硬件I²C无需CPU直接干预引脚电平变化,而是通过寄存器操作控制外设完成通信流程。

软件模拟I²C的实现方式

软件模拟I²C依赖CPU通过GPIO手动模拟协议时序。例如,生成起始信号时,需先将SCL引脚置为高电平,随后在SDA引脚上产生由高到低的跳变,最后拉低SCL电平。这一系列操作完全由程序控制,严格遵循I²C协议的时序要求。

硬件与软件方案的对比

硬件I²C的优势在于降低CPU负载,但其引脚分配通常受限于芯片设计,仅能使用特定功能引脚。相比之下,软件模拟I²C具有更高的灵活性,允许任意GPIO充当SCL和SDA信号线,但会占用更多CPU资源。

2、I2C外设功能框图

3、通信引脚

STM32中有两个I2C外设,硬件I2C必须要使用这些引脚,因为这些引脚才连接到I2C引脚,就比如说PB6与PB7引脚就连接到芯片内部的I2C1外设。

在硬件设计中,STM32主控芯片的I2C接口默认配置为PB6(SCL)和PB7(SDA)引脚。然而,实际电路连接中,EEPROM存储器的SCL和SDA信号线并未与这两个引脚直接相连,而是分别接至PC12和PC11端口。为实现正常的I2C通信功能,需要通过外部飞线将PB6与PC12、PB7与PC11进行对应连接。这种跨接方式最终实现了STM32的I2C接口引脚与EEPROM器件之间的信号通路建立,从而构成完整的I2C总线系统。

4. STM32的I2C外设通信机制(核心功能解析)

4.1 I2C工作模式配置

STM32的I2C接口支持四种基本工作模式,分别是:

- 主设备发送模式(Master Transmitter)

- 主设备接收模式(Master Receiver)

- 从设备发送模式(Slave Transmitter)

- 从设备接收模式(Slave Receiver)

在默认情况下,I2C模块初始化为从模式(Slave Mode)。工作模式会在以下两种情况下动态切换:

- 从模式切换到主模式:当接口主动发起起始信号(Start Condition)时自动进行。

- 主模式切换回从模式:当检测到总线仲裁失败(Arbitration Loss)或生成停止信号(Stop Condition)时发生。这种设计支持多主设备(Multi-Master)总线架构,允许多个主设备在同一总线上进行通信。

4.2 主从模式功能定义

- **主模式(Master Mode)**:在这种模式下,STM32充当总线主机,负责发起通信并生成时钟信号(SCL),可以作为发送端或接收端。

- **从模式(Slave Mode)**:在这种模式下,STM32作为从设备,响应主机的指令并传输数据。

4.3 主模式工作机制

**模式切换条件**:

I2C接口默认处于从模式,需要通过置位控制寄存器的START位来产生起始信号,从而切换至主模式。

**数据传输控制**:

主设备负责初始化数据传输,包括以下步骤:

- 产生起始条件(Start Condition)以启动通信;

- 输出同步时钟(SCL);

- 发送停止条件(Stop Condition)以终止通信。

起始信号触发后,硬件会自动将设备配置为主模式,并接管总线控制权。在主模式下,完整的通信周期必须包含起始信号与停止信号,这是确保协议时序正确性的关键。

**关键点**:

- 在主模式下,STM32必须精确控制时钟信号(SCL)和数据信号(SDA),以符合I2C协议的要求。

- 主设备在通信过程中需要处理总线仲裁,确保在多主设备环境中能够成功传输数据。

- 停止信号的生成标志着一次通信周期的结束,同时也是下一次通信的准备。

通过这些详细的配置和控制,STM32的I2C接口能够灵活地适应不同的通信需求,无论是作为主设备还是从设备,都能有效地进行数据传输。

二、EEPROM与硬件I2C的协同关系

硬件I2C与EEPROM的通信关系解析** 

1. 硬件I2C的作用** 

硬件I2C(Inter-Integrated Circuit)是STM32等微控制器内置的串行通信接口,采用**同步、半双工**方式,通过**SCL(时钟线)**和**SDA(数据线)**两根信号线与外部设备通信。其核心优势包括: 

- **硬件自动处理时序**(无需软件模拟时钟信号); 

- **支持标准(100kHz)、快速(400kHz)和高速(1MHz及以上)模式**; 

- **多主设备仲裁机制**,避免总线冲突。 

2. EEPROM的I2C接口特性

EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种可通过I2C接口访问的非易失性存储器,典型型号如**AT24Cxx系列**,其关键特性包括: 

- **依赖I2C协议进行读写**:所有操作(地址寻址、数据写入、数据读取)均需遵循I2C时序; 

- **从设备地址固定**:通常由硬件引脚(A0~A2)设置,例如AT24C02的默认地址为**0xA0**(写)/ **0xA1**(读); 

- **页写入与单字节操作**:支持按字节或分页(如16字节/页)写入,需严格遵循时序间隔。 

3. 硬件I2C与EEPROM的协同工作流程

1. 初始化配置

   - STM32的I2C外设需配置为**主模式**,并设置: 

     - 时钟频率(与EEPROM兼容,如100kHz); 

     - 自身引脚(如PB6/PB7或重映射引脚)与EEPROM的SCL/SDA连接。 

2. 数据传输过程

   - **写操作**: 

     1. 主机(STM32)发送**起始信号(Start)**; 

     2. 发送EEPROM的**设备地址 + 写标志(0)**; 

     3. 发送待写入的**存储单元地址**; 

     4. 发送数据字节(单字节或页写入); 

     5. 终止通信(Stop信号)。 

   - **读操作**: 

     1. 主机先发送设备地址 + 写标志,写入目标存储地址; 

     2. 重新发送起始信号,切换为读模式(设备地址 + 读标志1); 

     3. 接收EEPROM返回的数据,最后发送NAK/Stop结束。 

3. 关键注意事项 

   - **电气兼容性**:需确保总线上拉电阻(通常4.7kΩ)正确连接; 

   - **时序严格性**:EEPROM的写入周期(如5ms)需通过延时或轮询ACK保证; 

   - **错误处理**:硬件I2C应启用中断/DMA,检测总线错误(如仲裁丢失、无应答)。 

4. 硬件I2C对比软件模拟的优势** 

特性       ​软件 I²C ​硬件 I²C

​实现方式       通过 GPIO 引脚模拟 I²C 时序(软件控制)  使用 MCU 内置的硬件 I²C 外设(硬件控制)

​CPU 占用      高(需 CPU 持续操作 GPIO) 低(硬件自动完成时序,CPU 可处理其他任务)

​时序精度       依赖软件延时,精度较低    由硬件时钟控制,精度高且稳定

​开发复杂度    简单(无需配置复杂寄存器)    复杂(需初始化外设、处理中断/DMA)

​灵活性    高(可适配任意 GPIO 引脚)   低(必须使用硬件 I²C 外设的固定引脚)

​速度       较慢(受限于软件延时)    较快(支持标准模式 100kHz、快速模式 400kHz+)

​兼容性    通用性强(可适配不同 MCU) 依赖具体 MCU 的硬件支持

5. 典型问题与解决方案

- **通信失败**: 

  - 检查SCL/SDA线路连接、上拉电阻; 

  - 确认设备地址匹配(含硬件引脚电平); 

  - 通过逻辑分析仪捕获时序,排查协议错误。 

- **数据写入异常**: 

  - 遵守EEPROM的页写入限制(如AT24C02每页≤16字节); 

  - 写入后增加足够延时(或查询ACK完成信号)。 

**总结**:硬件I2C为EEPROM提供了高效、稳定的访问方式,其硬件自动化的特性显著降低了软件复杂度,适用于需要高可靠性的嵌入式存储系统。

三、软件I2C        

通过 GPIO 手动控制 SCL 和 SDA 引脚电平,模拟 I²C 时序。

#include "stm32f10x_gpio.h"#include "stm32f10x_rcc.h"/* 宏定义(修改为PB6/PB7引脚) */#define SOFT_I2C_SCL_PIN    GPIO_Pin_6  // PB6作为SCL#define SOFT_I2C_SDA_PIN    GPIO_Pin_7  // PB7作为SDA#define SOFT_I2C_PORT       GPIOB/* 初始化函数(开漏模式+上拉) */void Soft_I2C_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;// 使能GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 配置SCL和SDA为开漏输出(实际需外接上拉电阻)GPIO_InitStruct.GPIO_Pin = SOFT_I2C_SCL_PIN | SOFT_I2C_SDA_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;  // 开漏输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(SOFT_I2C_PORT, &GPIO_InitStruct);// 初始状态拉高总线GPIO_SetBits(SOFT_I2C_PORT, SOFT_I2C_SCL_PIN);GPIO_SetBits(SOFT_I2C_PORT, SOFT_I2C_SDA_PIN);}/* 精确延时(基于SysTick或NOP指令) */static void Delay_us(uint32_t us) {us *= (SystemCoreClock / 1000000) / 5;  // 根据主频校准while(us--) __NOP();}/* 产生起始信号 */void Soft_I2C_Start(void) {GPIO_SetBits(SOFT_I2C_PORT, SOFT_I2C_SDA_PIN);GPIO_SetBits(SOFT_I2C_PORT, SOFT_I2C_SCL_PIN);Delay_us(5);GPIO_ResetBits(SOFT_I2C_PORT, SOFT_I2C_SDA_PIN);  // SDA下降沿Delay_us(5);GPIO_ResetBits(SOFT_I2C_PORT, SOFT_I2C_SCL_PIN);  // SCL拉低准备数据传输}/* 产生停止信号 */void Soft_I2C_Stop(void) {GPIO_ResetBits(SOFT_I2C_PORT, SOFT_I2C_SCL_PIN);GPIO_ResetBits(SOFT_I2C_PORT, SOFT_I2C_SDA_PIN);Delay_us(5);GPIO_SetBits(SOFT_I2C_PORT, SOFT_I2C_SCL_PIN);    // SCL上升沿Delay_us(5);GPIO_SetBits(SOFT_I2C_PORT, SOFT_I2C_SDA_P

相关文章:

硬件I2C和软件I2C的区别

硬件I2C和软件I2C的区别 一、硬件I2C 1、硬件IC的局限性及学习意义 尽管硬件IC外设在STM32等微控制器中提供了标准化的通信支持,但在实际应用中,其稳定性可能存在问题。例如,某些情况下外设会因事件检测异常而进入死锁状态,仅能…...

单元测试报错

报错信息如下所示: 五月 30, 2025 5:35:44 下午 org.junit.vintage.engine.descriptor.RunnerTestDescriptor warnAboutUnfilterableRunner 警告: Runner org.junit.internal.runners.ErrorReportingRunner (used on class redis.demo.RedisTemplateTest) does not…...

AWS WAF设置IP白名单

目标 设置一个组白名单IP地址,当发现是这些IP地址发过来的请求后,WAF自动放行。 创建IP集 打开WAF页面,开始IP集创建如下图: 设置ip集,如下图: aws waf acl配置白名单 找到Web ACL,开始在…...

智能门禁的项目

项目需求 矩阵键盘输入密码,正确开锁,错误提示,三次错误后蜂鸣器响三秒;按下#号确认输入,按下*号修改密码;密码保存在W25Q128里;OLED屏幕显示信息。 硬件清单 矩阵键盘OLED显示屏继电器蜂鸣器…...

《Google I/O 2025:AI浪潮下的科技革新风暴》

Google I/O 2025 盛大开幕 在科技飞速发展的时代,Google I/O 开发者大会一直是全球科技爱好者和开发者瞩目的焦点,堪称科技领域的年度盛宴。2025 年 5 月 20 日至 21 日,Google I/O 2025 在美国加州山景城的 Shoreline Amphitheatre 盛大举行…...

职坐标IT培训:硬件嵌入式与AI芯片开发实战

课程体系以硬件嵌入式开发与AI芯片技术融合为核心,构建模块化知识框架。从硬件设计规范切入,系统讲解PCB Layout设计中的信号完整性控制、电磁兼容性(EMC)优化等关键要素,延伸至高速电路设计中阻抗匹配与电源完整性&am…...

一句话开发Chrome摸鱼插件

本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴。 CodeBuddy 一、CodeBuddy新功能特色 Craft智能体:自然语言驱动的全栈开发引擎Craft开发智能体的核心突破在于实现需求理解-任务拆解-代码生成的…...

Spring Boot + OpenCSV 数据清洗实战:CSV 结构化处理与可视化

目录 摘要 演示 一、背景:为什么需要自动化数据清洗? 二、技术选型:为什么选择这三个工具? 三、核心功能实现:从数据读取到智能清洗 1. 配置控制器 2. 文件上传控制器 3. CSV数据处理服务接口 4. CSV数据处理…...

Cmake编译glog成功并在QT中测试成功步骤

glog是开源的日志记录系统,下载地址GitHub - google/glog: C implementation of the Google logging module 跟gflags有点相似,编译和测试过程比较周折,所以记录下来具体的编译和测试步骤。 编译环境:WindowsCmakeVs2022Qt5.14.…...

AI绘画提示词:从零开始掌握Prompt Engineering的艺术

文章目录 什么是AI绘画提示词?提示词的基本结构主体描述场景/背景风格指定技术参数负面提示人物肖像模板风景模板 高级技巧权重调整混合风格颜色控制情绪氛围 常见问题与解决方法手部变形问题构图不理想风格不够突出 提示词示例库科幻场景奇幻人物静物画 结语 在当今…...

xhr、fetch和axios

XMLHttpRequest (XHR) XMLHttpRequest 是最早用于在浏览器中进行异步网络请求的 API。它允许网页在不刷新整个页面的情况下与服务器交换数据。 // 创建 XHR 对象 const xhr new XMLHttpRequest();// 初始化请求 xhr.open(GET, https://api.example.com/data, true);// 设置请…...

lcd-framebuffer驱动开发参考文章

MMAP mmap的时候总是失败,查了很多资料,显存大小是驱动层fb_info->fix.smem_len设置,要遵循内核页大小的整数倍,应用层调用mmap也要遵循对齐。 MMAP使用(一、基本接口)_mmap接口-CSDN博客 基于fbtft和…...

2025吉林ccpc【部分题解】

文章目录 C - SSPPSPSPProblemD.互互互质质质ProblemF. Ever ForeverProblemG.石石石头头头剪剪剪刀刀刀布布布Problem J.奇偶游戏Problem L.好矩阵 C - SSPPSPSP 题目来源:C - SSPPSPSP !](https://i-blog.csdnimg.cn/direct/26fc1492b1724446be61cf39b718cf9b.…...

PowerDesigner通过SQL反向生成类图

PowerDesigner通过SQL反向生成类图 背景操作步骤步骤1: 选择这个步骤2: 目前我是选择的这个步骤3: 选择这个 其他 背景 工作学习 操作步骤 步骤1: 选择这个 步骤2: 目前我是选择的这个 步骤3: 选择这个 其他 其他同事告诉我的, 我还没有亲自尝试, 应该问题不大. 尝试后再反…...

【appium】环境安装部署问题记录

1.安装uiautomator2 appium driver install uiautomator2(超时报错,多执行几遍) 出现code1,安装失败 执行APPIUM_SKIP_CHROMEDRIVER_INSTALL1 appium driver install uiautomator2 安装失败code196 清理缓存npm cache clean --for…...

【bug排查记录】由Redission配置引发的Satoken血案

背景 在今天服务更改服务配置的redis的database后,本地测试通过,发布到线上。出现所有用户登录状态失效,并且重新登录后也是失效的问题,由于鉴权登录框架使用的是satoken,线上database配置的是1,然后去red…...

深入理解 MySQL 隔离级别:理论与实战

深入理解 MySQL 隔离级别:理论与实战 在数据库管理系统中,事务的隔离级别是确保数据一致性和完整性的关键因素。MySQL 作为广泛使用的关系型数据库,提供了四种不同的事务隔离级别: 读未提交(Read Uncommitted)读已提交(Read Committed)可重复读(Repeatable Read)串行…...

MAC程序签名遇到的问题

整体步骤 需要一个apple开发者账号,个人账户注册需要按年付费 申请证书 申请证书链接 command 空格打开聚焦搜索 输入钥匙串访问打开 默认情况下是没有要的证书的 点击左上角的证书助理,选择请求证书 根据输入创建请求文件并保存到本地 点开申请…...

华为OD机试真题——宜居星球改造计划(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《宜居…...

C#实现图片缩略图生成:多种模式详解与实践

C#实现图片缩略图生成:多种模式详解与实践 在图像处理的场景中,生成图片缩略图是一项常见且实用的功能。无论是搭建图片展示网站,还是开发本地图片管理工具,按需生成合适尺寸的缩略图,能够有效减少图片传输和显示所需…...

Linux下基本指令的介绍

目录 1.目标 2.快速认识指令 1.pwd 2.clear 3.ls 4.mkdir 5.cd 6.touch 3.细化每一条指令 1.ls指令 2.pwd指令 注: 3.cd指令 4.touch和mkdir指令 6.删除文件 4.总结 1.目标 上一篇博客中,我们了解了Linux的起源和发展,也知道…...

零基础开始的网工之路第十四天------Linux程序管理

目录 一、Linux程序与进程 1、程序,进程,线程的概念 2、程序和进程的区别 3、进程和线程的区别 二、Linux进程基础(生命周期) 1、进程生命周期 2、父子进程的关系 三、程序管理 1、常见的软件包类型 四、Linux操作系统启动流程详解 1、概述 2、启动流程核心阶段 1…...

SIGGRAPH 2025 | 快手可灵团队提出3D感知的电影级文本到视频生成框架CineMaster

Sora、可灵等视频生成模型令人惊艳的性能表现使得创作者仅依靠文本输入就能够创作出高质量的视频内容。然而,我们常见的电影片段通常是由导演在一个场景中精心布置多个目标的运动、摄像机拍摄角度后再剪辑而成的。例如,在拍摄赛车追逐的场景时&#xff0…...

历年西安电子科技大学计算机保研上机真题

2025西安电子科技大学计算机保研上机真题 2024西安电子科技大学计算机保研上机真题 2023西安电子科技大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 查找不同的连续数字串个数 题目描述 给定一个数字串,查找其中不同的连续数字串的个…...

利用openwrt路由器和随身WIFI搭建CPE

背景: 最近5GCPE挺火,各种硬件层出不穷,包括DY上很多商家在推的AX3000叠加展锐RM500 5G模块,自己组装CPE,成本也在300 看了下开源硬件,其实就是一个开源的openwrt系统,硬件上5G模块通过usb协议…...

科学智能赋能空间科学研究(2):AI4S 范式下空间科学实验的核心挑战

中国科学院空间应用工程与技术中心在空间科学实验领域的研究覆盖了多模态空间科学实验数据模式挖掘、领域知识抽取、跨学科知识融合与认知智能等研究内容,有效促进了空间科学实验领域的数据应用生态的体系化建设,相关研究成果已正式发表于权威学术期刊《…...

计算机网络学习(九)——CDN

一、CDN CDN(Content Delivery Network,内容分发网络)是一种通过分布式节点将内容更高效地传递给用户的技术架构,广泛应用于加速网站、视频、下载、直播等业务。 CDN 是把内容放到离用户最近的“高速公路入口”,提升访…...

Axure设计案例——科技感渐变线性图

想让数据变化趋势展示告别枯燥乏味,成为吸引观众目光的亮点吗?快来看看这个Axure设计的科技感渐变线性图案例!科技感设计风格凭借炫酷的渐变色彩打破传统线性图的单调,营造出一种令人过目难忘的视觉体验。每一条线条都仿佛是流动的…...

【Opencv+Yolo】Day2_图像处理

目录 一、图像梯度计算 图像梯度-sobal算子: Scharr:权重变化更大(线条更加丰富,比Sobel更加细致捕捉更多梯度信息) Laplacian算子:对噪音点敏感(可以和其他一起结合使用) 二、边…...

嵌入式开发学习(第二阶段 C语言笔记)

内存操作 我们对于内存操作需要依赖于string.h头文件中相关的函数库。 内存操作函数 内存填充 头文件&#xff1a;#include <string.h> 函数原型&#xff1a; void* memset(void *s,int c,size_t n)函数功能&#xff1a;将内存块s的前n个字节填充为c&#xff0c;一般…...