参考大神文章:
STM32硬件I2C与软件模拟I2C超详解_stm32 i2c-CSDN博客https://blog.csdn.net/k666499436/article/details/124686559
1. 总线通过上拉电阻接到电源。当 I2C 设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
2.开漏输出PMOS不工作
(1)当输出寄存器输出高电平,引脚输出高阻态相当于(开路),假设该引脚接到I2C的SDA总线上,则总线被默认拉成高电平。
(2)当输出寄存器输出低电平,引脚输出低电平。
3.复用功能开漏输出
复用功能模式中,输出使能,输出速度可配置,可工作在开漏模式, 但是输出信号源于其它外设(来自I2C外设),输出数据寄存器 GPIOx_ODR 无效;输入可用,可以通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号
这里SMT32,I2C外设的两个引脚SDA,SCL就要配置成复用功能的开漏输出模式,输出信号源于I2C外设。
4.为什么引脚要设置成开漏模式
为什么两根总线要上拉电阻接高电平,总线默认情况是高电平,详情看下图。
为什么要设备空闲的时候SDA与SCL引脚要输出高阻态(相当于断开与SDA与SCL总线的连接),根本目的就是为了不干扰其他正在通信的设备。
多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线,也就是设备在发送数据之前会检测I2C总线是否忙碌(忙碌总线应该为低电平)。