4.STM32之通信接口《精讲》之IIC通信---软件实现IIC《深入浅出》面试必备!

接下正式,进入软件编写IIC时序了,并实现对MPU6050的控制,既然是软件实现,那么硬件方面,我仅需两根控制线即可,即:数据控制线SDA,时钟控制线SCL。(人为软件层面定义的,就是把单片机的GPIO模拟成IIC时序)在单片机上,我们只需两个普通的GPIO即可。

(软件实现IIC的好处就是端口不受限,可以任意指定)

可以参考51单片机-IIC实验1-AT24C02数据存储(实战1)_51使用iic模块-CSDN博客https://blog.csdn.net/qq_58662017/article/details/142199565?spm=1001.2014.3001.5501

座右铭:我们何必为人生的部分片段而哭泣,我们整个人生都催人泪下!

目前实现的逻辑是STM32是主机,MPU6050是从机,一主一从。如下图(主机对SCL完全掌控在写程序的过程中我们一般只关注主机端的程序。

程序主框架,编写IIC时序,然后利用IIC对MPU6050进行写寄存器和读寄存器。最后,在主函数里调用一下即可!(主函数主要实现初始化,拿到数据,和打印数据)

开漏输出(Open-Drain 或 Open-Collector)是单片机或其他数字电路中常用的一种输出方式,它可以通过合理的电路设计实现输入功能。以下是详细说明:


问题1:开漏输出,可以输入吗?

开漏输出的工作原理

  • 开漏输出特点

    1. 当输出为低电平(逻辑0)时,开漏输出内部的 MOSFET 或晶体管导通,输出直接拉低至地(GND)。
    2. 当输出为高电平(逻辑1)时,内部 MOSFET 或晶体管断开,输出处于高阻态(悬空状态),需要通过外部上拉电阻将输出电平拉高。
  • 电路结构: 开漏输出电路没有直接的 "高电平" 驱动能力,必须依赖外部上拉电阻将输出端拉到高电平电压(如 3.3V 或 5V)。


开漏输出是否可以作为输入?

可以实现输入功能,但需要特定的电路设计。

1. 直接作为输入
  • 如果开漏输出端口本身的电路允许双向通信(如 I2C 总线),它可以接收来自其他设备的信号。
  • 在这种情况下:
    • 当开漏输出为高阻态时,端口可以感知外部输入信号(如其他设备的驱动信号或电压变化)。
    • 当开漏输出为低电平时,它会主动拉低信号线。
2. 需要外部电路支持
  • 如果开漏端口不直接支持输入,可以通过额外的硬件设计(如与其他电路连接)实现输入功能。典型方法包括:
    • 外部上拉电阻与驱动器相结合,输入信号可以通过上拉电阻的电压水平反映到开漏输出端。
    • 使用外部电路,如电平转换器或双向驱动芯片,将开漏端与输入信号连接。
3. I2C 典型例子
  • I2C 总线是一种开漏输出的经典应用。I2C 中的 SDA(数据线)和 SCL(时钟线)通过外部上拉电阻实现双向数据通信:
    • 在设备 "发送" 数据时,单片机通过开漏端口主动拉低 SDA 线。
    • 在设备 "接收" 数据时,单片机的开漏端口进入高阻态,从而允许外部设备驱动 SDA 线。

注意事项

  1. 上拉电阻的选择

    • 电阻值太大:信号线的上升时间变长,影响高速通信。
    • 电阻值太小:消耗过多电流,降低电路能效。
    • 一般情况下,推荐使用 4.7kΩ ~ 10kΩ 的电阻。
  2. 输入电压范围

    • 确保外部输入信号的电压范围在单片机的输入电平(如 0V ~ VCC)之内,以避免损坏器件。
  3. 避免冲突

    • 如果多个设备连接到开漏输出引脚,必须确保这些设备不会同时主动拉低信号线(避免驱动冲突)。

总结

开漏输出引脚可以实现输入功能,特别是在需要双向通信的场景(如 I2C 总线)。关键在于设计合理的外部电路,包括适当的上拉电阻,并确保输入信号的电压范围和驱动能力与开漏端口兼容。

代码实现:

软件初始化IIC:(也就是IIC的基本6个操作基本单元)

起始条件,终止条件,读一个字节,写一个字节,接收应答位,不接受应答位。

通过下面6张图,可以看出,分离设计,也就是在SCL期间:SDA如果改变电平,则就会产生开始或停止的信号(即:SCL=1 ,SDA从高到底就是开始信号,SDA从低到高就是停止信号),反之,就会使传输数据的过程,即:就是在SCL=0期间,变换电平来传输数据。

相关推荐
国科安芯5 小时前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
茯苓gao7 小时前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉10 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者11 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间12 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious12 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng16 小时前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计17 小时前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu17 小时前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32
kebidaixu18 小时前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片调试实录:四个关键问题与解决方案
stm32