硬件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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐12个wordpress企业网站模板

WordPress企业网站模板是一种专为企业网站设计的WordPress主题,旨在帮助企业创建专业、美观且易于管理的网站。这些模板通常具备响应式设计、SEO优化、多语言支持等功能,能够满足不同行业和企业的需求。 WordPress企业网站模板的适用场景 企业官网&…

68道Hbase高频题整理(附答案背诵版)

简述什么是Hbase数据库? Hbase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,它利用HBase技术在HDFS上提供了类似于Bigtable的能力。换句话说,Hbase是Apache Hadoop生态系统中的一部分,可以为大数据应用提供快速的随机…

PyTorch——卷积操作(2)

二维矩阵 [[ ]] 这里面conv2d(N,C,H,W)里面的四个是 N就是batch size也就是输入图片的数量,C就是通道数这只是一个二维张量所以通道为1,H就是高,W就是宽,所以是1 1 5 5 卷积核 reshape 第一个参数是batch size样本数量 第二个参数…

Linux之MySQL安装篇

1.确保Yum环境是否能正常使用 使用yum环境进行软件的安装 yum -y install mysql-server mysql2.确保软件包已正常完成安装 3.设置防火墙和selinux配置 ## 关闭防火墙 systemctl stop firewalld## 修该selinux配置 vim /etc/selinux/config 将seliuxenforcing修改为sel…

Devops系列---python基础篇二

1、列表 1.1 概念 格式: 名称 [ “元素1”,“元素2”,…] #定义一个列表 computer ["主机","键盘","显示器","鼠标"]类型方法用途查index(“元素”)查看元素索引位置count(“元素”)统计元素出现的次数reverse()倒序排…

LeetCode - 234. 回文链表

目录 题目 快慢双指针步骤 读者可能的错误写法 正确的写法 题目 234. 回文链表 - 力扣(LeetCode) 快慢双指针步骤 找到链表的中点(find_mid函数): 使用快慢指针,慢指针每次走一步,快指针…

UniApp 全生命周期钩子详解

👉 整理不易,如果本文对你有帮助,欢迎点个【赞 👍】【收藏 ⭐】【关注 🧡】 后续我们还将继续分享实用的 UniApp 教程,比如: 文件上传全局请求封装状态管理动态路由等… 📮 有任何…

探索NautilusTrader:下一代开源算法交易平台的革命性突破

在金融科技的浪潮中,量化交易领域正经历一场由开源技术驱动的变革。NautilusTrader(https://github.com/nautechsystems/nautilus_trader)作为一款高性能、生产级的算法交易平台,正以其创新的设计理念和强大的技术架构重塑开发者的策略研发流程。 一、核心定位:打破回测与…

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…

[论文阅读] (38)基于大模型的威胁情报分析与知识图谱构建论文总结(读书笔记)

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…

python批量解析提取word内容到excel

# 基于Python实现Word文档内容批量提取与Excel自动化存储 ## 引言 在日常办公场景中,常需要从大量Word文档中提取结构化数据并整理到Excel表格中。传统手动操作效率低下,本文介绍如何通过Python实现自动化批处理,使用python-docx和openpyxl…

win32相关(远程线程和远程线程注入)

远程线程和远程线程注入 CreateRemoteThread函数 作用:创建在另一个进程的虚拟地址空间中运行的线程 HANDLE CreateRemoteThread([in] HANDLE hProcess, // 需要在哪个进程中创建线程[in] LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全…

Flyway

Flyway 是一个强大的数据库版本控制和迁移工具,主要用于管理数据库结构的变更和演进。 核心作用 1. 数据库版本控制 追踪数据库变更:记录每次数据库结构的修改版本管理:为每个变更分配版本号变更历史:完整记录数据库演进过程 …

【深尚想】OPA855QDSGRQ1运算放大器IC德州仪器TI汽车级高速8GHz增益带宽的全面解析

1. 元器件定义与核心特性 OPA855QDSGRQ1 是德州仪器(TI)推出的一款 汽车级高速运算放大器,专为宽带跨阻放大(TIA)和电压放大应用优化。核心特性包括: 超高速性能:增益带宽积(GBWP&a…

机器学习实验八--基于pca的人脸识别

基于pca的人脸识别 引言:pca1.pca是什么2.PCA算法的基本步骤 实例:人脸识别1.实验目的2.实现步骤3.代码实现4.实验结果5.实验总结 引言:pca 1.pca是什么 pca是一种统计方法,它可以通过正交变换将一组可能相关的变量转换成一组线…

【LLIE专题】NTIRE 2025 低照度图像增强第二名方案

Towards Scale-Aware Low-Light Enhancement via Structure-Guided Transformer Design(2025,NTIRE) 专题介绍一、研究背景二、SG-LLIE方法1.和Retinexformer方案对比2.总体方案及创新点3.详细方案3.1 结构先验提取3.2 网络结构3.3 损失函数 …

泊松融合的介绍和OpenCV教程

泊松融合 Poisson Blending 简介 核心思想 泊松融合的目标是在保留剪切图像的梯度(纹理)信息的同时,使融合结果在边界区域平滑过渡到目标图像中。换句话说,它在融合区域中重建一个图像,使其梯度尽可能接近源图像的梯度,并且边界贴合目标图像。 数学描述 泊松融合将问题…

Unity协程Coroutine与UniTask对比

原理对比 CoroutineUniTask本质IEnumerator 的协作调度器async/await 状态机(IAsyncStateMachine)调度方式Unity 内部调用 MoveNext()自建 PlayerLoopRunner 控制状态推进内存管理引用类型,频繁分配 GC结构体 UniTask,低 GC 压力…

MAC软件打开提示已损坏:“已损坏,打不开。您应将它移到废纸篓“

打开「终端.app」,输入以下命令并回车,输入开机密码回车 sudo spctl --master-disable 按照上述步骤操作完成后,打开「系统偏好设置」-「安全与隐私」-「通用」,确保已经修改为「任何来源」。 打开「终端.app」,输入…

JAVA之 Lambda

Java Lambda Lambda 表达式是 Java 8 的核心特性,通过 函数式编程 大幅简化代码。其核心思想是将行为作为参数传递,替代匿名内部类,提升代码的简洁性和可读性。以下是系统解析和完整代码示例: 一、Lambda 表达式基础 语法结构 (…