在做项目的时候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初始配置复杂但长期稳定,软件模拟开发快但可能需更多调试。
根据具体需求,合理选择方案可最大化系统性能与开发效率。