STM32软件模拟和硬件模拟的区别(i2c)

一、软件模拟和硬件模拟的区别

  • 硬件读写I2C:
    • 通过微控制器内部的I2C硬件模块进行通信。微控制器会提供专门的硬件接口(例如,STM32的I2C外设),用于生成I2C信号并处理通信协议。
    • 硬件模块会自动处理时序、产生起始位、停止位、应答位等,简化了软件的开发过程。
  • 软件读写I2C:
    • 通过控制GPIO引脚来模拟I2C通信。这意味着I2C的时序(例如SCL和SDA信号的生成)是由软件来控制的,而不是硬件模块
    • 软件需要手动设置时序和控制信号的变化,通常通过延时或计时器来确保I2C时序正确。
性能和资源消耗不同:
  • 硬件 I2C 是基于外设的,数据传输由硬件自动管理,因此非常高效,并且对 CPU 的干扰较小。可以高频率(如 400kHz 或更高)运行,而且支持多个设备连接。
  • 软件 I2C 是完全通过 CPU 和 GPIO 控制的,因此它比硬件 I2C 慢得多。它占用 CPU 时间,并且由于软件模拟时序,最高速度通常只有几千赫兹到几十千赫兹。此外,由于全程由软件处理,精度可能较差,受系统时钟影响较大。

二、例子(标准库为例)

接下来上例子:我们读写数据就是在读写寄存器,所以软硬件区别就取读取寄存器上

硬件模拟:

我们通过I2C_GenerateSTART、MPU6050_WaitEvent这些硬件接口函数来iic读取数据。

软件模拟:

软件模拟中,我们需要自己控制时序,通过延时或计时器来确保I2C时序正确,需要自己产生起始位、停止位。

接下来将软件、硬件iic如何初始化:

这是软件初始化,而硬件初始化需要加上注释部分,也就是需要I2C_Init(I2C1,&I2C_InitStructure);初始化IIC。才可以使用接口函数

三、为啥软件模拟不初始化IIC(I2C_Init(I2C1,&I2C_InitStructure);)

在你使用 软件模拟 I2C(bit-banging)时,不要调用硬件 I2C 的初始化函数。

  • 软件模拟 I2C通过 GPIO 手动模拟时序,完全依赖 CPU 来控制 SCL 和 SDA 引脚。而硬件 I2C 是通过 STM32 的硬件外设来自动生成时序并传输数据
  • 如果你在使用软件模拟 I2C 的时候调用了 I2C_Init,会尝试启用硬件 I2C 外设,这会与软件模拟 I2C 冲突,因为硬件 I2C 的时序和控制是由硬件管理的,而软件模拟 I2C 是由软件(CPU)手动管理的。这样就会导致冲突,甚至导致 I2C 外设的错误初始化或未能正确工作。

四、HAL的cubemx配置

下面是hal库:其实都差不多也可以不看了 hal库硬件就是直接配置完,就可以使用里面的接口函数了,如: HAL_I2C_Master_Receive

硬件 I2C

步骤:使用 CubeMX 工具配置 I2C 外设,将 I2C 句柄 I2C_HandleTypeDef 初始化为所需的波特率、模式等参数。

软件I2C

步骤:直接使用 GPIO 引脚,通过手动控制 SDA 和 SCL 的电平来模拟 I2C 通信的时序。通常通过设置 GPIO 的输出模式和延时函数来控制信号时序。  

总结:

硬件 I2C优势:可以获得更高的传输速率和稳定性,因为硬件 I2C 有专门的模块来处理时序、电平控制等细节。还可以支持 DMA、中断等方式进行数据传输。

软件模拟 I2C优势:灵活性高,可以使用任何 GPIO 引脚,不受限于硬件 I2C 的引脚限制;并且适合 I2C 外设数目多、占用引脚较多的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值