这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【原创】任意GPIO口模拟iic通讯--from棚

共2条 1/1 1 跳转至

【原创】任意GPIO口模拟iic通讯--from棚

工程师
2025-05-18 22:17:42     打赏

在做项目的时候PCB板子设计缺陷,导致mpu6050的scl,和sda,的gpio无法正常工作。

所以用到了随机GPIO模拟iic,进行通讯。

 

I2C的基本知识

1、I2C总线有两条线:SCL是时钟线,SDA是数据线;

2、I2C总线通信方式是主从模式,即由主设备发起通信,从设备响应通信;

3、I2C从设备具有I2C地址,从设备只有收到自己的地址信息后才会被唤醒;

4、具有不同地址的从设备可以挂载到同一个I2C总线上;

5、从设备地址的最后一个Bit表示读写,0表示写操作,1表示读操作;

6、I2C总线地址有7Bit表示方法和8Bit表示方法,7Bit表示方法是地址中不包含表示读写的最后一个Bit;

7、当SCL=1时,SDA产生下降沿来启动I2C;

8、当SCL=1时,SDA产生上升沿来停止I2C;

9、I2C启动后,当SCL=1时,SDA的电平不允许有变化;

10、I2C启动后,只有当SCL=0时,数据发送方才能在SDA上改变发送电平;

11、I2C总线上数据接收方在接收完一个字节数据(8Bit)后,要在下一个SCL的上升沿,通过SDA响应ACK(SDA=0)或NACK(SDA=1)信号;

12、I2C外部需根据传输速率匹配上拉电阻,速率越高,上拉电阻越小,否则会影响时序;

13、I2C引脚作为输出时需是开漏输出,作为输入时需是浮空输入,不能匹配内部上拉或下拉电阻;

所以没必要非要用特定的引脚,只需要将SCL配置开漏输出SDA配置浮空输入。再通过手动操作主机电瓶和读取从机电平就可以完成通讯。

专用硬件I2C引脚

优点:

高效性

硬件自动处理协议层(如起始位、停止位、ACK/NACK),减少CPU干预。

支持高速模式(最高400kHz或更高),传输效率高。

可结合DMA,进一步降低CPU负载。

低资源占用

数据传输由硬件完成,CPU可并行处理其他任务。

错误处理

内置错误检测(如总线冲突、仲裁丢失),提升通信可靠性。

多主支持

天然支持多主仲裁,适合复杂总线拓扑。

缺点:

引脚固定

必须使用特定引脚(如I2C1的PB6/PB7),可能引发布局冲突。

配置复杂

需正确配置寄存器,可能存在硬件兼容性问题(如某些从设备时序严格)。

潜在硬件问题

STM32的I2C模块历史上存在偶发问题(如总线挂起),需软件规避。

软件模拟I2C(任意GPIO)

优点:

引脚灵活

可自由选择任意GPIO,避免硬件引脚冲突。

时序可控

完全自定义时序,适配非标设备(如低速传感器或特殊协议)。

开发简单

无需深入理解硬件寄存器,适合简单应用或快速原型开发。

规避硬件缺陷

绕过硬件I2C模块的潜在问题,提高稳定性。

缺点:

CPU占用

CPU轮询或延时控制时序,难以执行多任务。

速度限制

传输速率受软件延时精度限制,通常低于100kHz。

时序稳定性风险

中断或高负载场景可能导致时序偏差,影响可靠性。

功能局限

不支持多主仲裁,复杂错误处理需手动实现。

场景建议

选硬件I2C:
高速通信、多主系统、低CPU占用需求(如连接EEPROM、高精度传感器)。

选软件模拟:
引脚受限、非标时序设备、硬件I2C存在兼容性问题,或简单低速应用(如驱动OLED屏)。

关键权衡

灵活性 vs. 效率:软件模拟提供引脚和时序自由,但牺牲速度和CPU资源。

开发成本 vs. 维护成本:硬件I2C初始配置复杂但长期稳定,软件模拟开发快但可能需更多调试。

根据具体需求,合理选择方案可最大化系统性能与开发效率。



助工
2025-06-04 14:17:10     打赏
2楼

软件I2C移植很方便!


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]