关于IIC在通讯时为什么不会改变输入输出模式

我们都知道,IIC在通讯的时候SDA数据线是由CPU与外设交替控制(交替拉低电平的),但是为什么我们在初始化SDA线gpio,设置为开漏输出模式后就不会改变他了呢?外设也需要输入低电平来回应或者输出数据给CPU呀。

一下给予例子:CPU等待外设应答(由外设输入的情况)

正常情况下,cpu等待应答是要将SDA线交给外设控制,在等待应答(ACK)时确实需要将SDA引脚配置为输入模式,这样CPU可以检测到外设是否拉低SDA线。这里的代码没有显式地将 SDA 设置为输入模式,可能会让人误以为代码有问题,但实际上,在开漏(open-drain)输出模式下,这样的实现是合理的。

为什么可以不用切换到输入模式?

  1. 开漏输出模式的特性
    • 在开漏模式下,将 SDA 引脚设置为“高”(如 EEPROM_I2C_SDA_1())时,实际效果是让引脚浮空(俗称高阻态,而高阻态为什么可以检测外部输入状态我在前面的文章也有讲过了),这样引脚的状态就可以由外部电路(例如 I²C 设备)来控制。
    • 这意味着,如果总线上没有其他设备拉低 SDA,SDA 会通过上拉电阻保持高电平;如果其他设备拉低 SDA,那么 CPU 可以检测到 SDA 的低电平。
  2. 读取 SDA 状态
    • 在这段代码中,EEPROM_I2C_SDA_READ()用于读取 SDA 的状态,而并不需要特意将 SDA 设置为输入模式。因为在开漏模式下,SDA 设置为高实际上就是浮空状态,足以实现读取功能。

所以开漏模式下如何工作?

  • 在模拟 I²C 时,驱动 SDA 引脚的逻辑如下:
    • 写入0(即EEPROM_I2C_SDA_0()):将 SDA 拉低,表示发送低电平。
    • 写入1(即EEPROM_I2C_SDA_1()):引脚处于浮空状态,由外部上拉电阻决定 SDA 是否为高电平。
    • EEPROM_I2C_SDA_READ()中直接读取引脚状态就可以判断是否有从设备拉低 SDA 以发送 ACK。

总结

这段代码利用开漏输出特性,不需要手动切换引脚方向,**通过将 SDA 设置为高电平(浮空)**就能让引脚处于输入模式,以检测从设备是否发送了 ACK 信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值