[APM32E0] Free I2C_SCL and I2C_SDA 这部分代码的作用是什么

[复制链接]
 楼主| gaoyang9992006 发表于 2025-8-7 21:02 | 显示全部楼层 |阅读模式
  1.     /* Free I2C_SCL and I2C_SDA */
  2.     gpioConfigStruct.mode = GPIO_MODE_OUT;
  3.     gpioConfigStruct.speed = GPIO_SPEED_50MHz;
  4.     gpioConfigStruct.outtype = GPIO_OUT_TYPE_PP;
  5.     gpioConfigStruct.pupd = GPIO_PUPD_NO;
  6.     gpioConfigStruct.pin = GPIO_PIN_8;
  7.     GPIO_Config(GPIOB, &gpioConfigStruct);

  8.     gpioConfigStruct.pin = GPIO_PIN_9;
  9.     GPIO_Config(GPIOB, &gpioConfigStruct);
看厂家提供的库函数实例,里面有这么一段,不明所以,这 一段作用是什么?
aozima 发表于 2025-8-7 22:11 | 显示全部楼层
你看下后面是否有9个以上的时钟输出
CloudKiss 发表于 2025-8-8 11:26 | 显示全部楼层
是不是传说中的释放I2C总线卡死的步骤啊
Gfan 发表于 2025-8-8 14:18 | 显示全部楼层
建议配置 I2C1 对应引脚 (PB8: SCL, PB9: SDA)


具体流程可见:
先将 PB8、PB9 配置为普通推挽输出(GPIO_MODE_OUT、GPIO_OUT_TYPE_PP),并输出高电平(GPIO_SetBit(GPIOB, GPIO_PIN_8 / 9))。
之后将其切换到复用功能(GPIO_MODE_AF),指定 GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_8/9, GPIO_AF_PIN1) 以将 PB8、PB9 连接到 I2C1 的复用功能。
同时将输出类型设为开漏(GPIO_OUT_TYPE_OD),满足 I2C 硬件协议对开漏输出的要求。


目的:
先把引脚配置成普通推挽输出并设高电平,再切换到开漏复用模式,作用就是让引脚在上电或初始化前保持高电平,类似于“预上拉”,防止上电过程中的不确定状态造成干扰或错误的总线读写。

 楼主| gaoyang9992006 发表于 2025-8-8 18:36 | 显示全部楼层
Gfan 发表于 2025-8-8 14:18
建议配置 I2C1 对应引脚 (PB8: SCL, PB9: SDA)

原来如此,这个理由很充分,受教了,感谢。
Gfan 发表于 2025-8-11 10:27 | 显示全部楼层
gaoyang9992006 发表于 2025-8-8 18:36
原来如此,这个理由很充分,受教了,感谢。

客气
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2045

主题

16350

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2045

主题

16350

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部