打印
[N32G43x]

”N32G435的芯片,I2C2通信不正常,发送起始条件和地址后,从机正常回复ACK,但是I2C2的状...

[复制链接]
57|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丙丁先生|  楼主 | 2025-6-21 18:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我使用N32G435的芯片,使用I2C1通信正常,使用I2C2通信不正常。 现象:发送起始条件和地址后,从机正常回复ACK,但是I2C2的状态寄存器ADDR10F置位,而我使用的是7bit地址模式。等待EV6失败而退出通信。 请知道原因的大神指教,谢谢。

根据您描述的问题,结合N32G435芯片的I2C特性,以下是可能的原因及解决方案:


1. I2C2的引脚配置错误

  • 问题:I2C2的SCL/SDA引脚可能未正确配置为开漏复用模式,或引脚映射错误。

  • 解决方案

    • 检查 GPIO_Config()函数,确保I2C2的SCL(如PB6)和SDA(如PB7)引脚配置为开漏输出GPIO_Mode_AF_OD)并启用复用功能(GPIO_PuPd_NOPULL)。

    • 示例代码(假设SCL=PB6,SDA=PB7):

      // SCL (PB6) 配置为开漏复用
      GPIO_InitStructure.Pin = GPIO_Pin_6;
      GPIO_InitStructure.Mode = GPIO_Mode_AF_OD;
      GPIO_InitStructure.PuPd = GPIO_PuPd_UP; // 上拉
      GPIO_Init(GPIOB, &GPIO_InitStructure);
      
      // SDA (PB7) 配置为开漏复用
      GPIO_InitStructure.Pin = GPIO_Pin_7;
      GPIO_Init(GPIOB, &GPIO_InitStructure);

2. I2C2时钟未使能

  • 问题:I2C2的时钟(RCC_APB1Periph_I2C2)可能未开启,导致通信异常。
  • 解决方案
    • 在初始化代码中明确使能I2C2时钟:
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);

3. 地址模式配置错误

  • 问题:虽然使用7位地址,但 ADDR10F标志位被置位,可能是配置或时序问题导致误触发。
  • 解决方案
    • 检查地址长度配置:确保I2C2的地址长度设置为7位(I2C_AcknowledgedAddress事件应仅触发一次)。
      I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
      I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    • 清除 ADDR10F标志位:在EV5(地址匹配)处理中手动清除该标志位,避免干扰后续逻辑。
      // 处理EV5事件(地址匹配)
      if (I2C_GetFlagStatus(I2C2, I2C_FLAG_ADDR10F)) {
          I2C_ClearFlag(I2C2, I2C_FLAG_ADDR10F); // 清除10位地址标志
      }

4. 事件处理逻辑问题

  • 问题:等待EV6(I2C_EVENT_MASTER_TRANSMITTER_ADDRESSED)失败,可能是因为事件被 ADDR10F标志覆盖。
  • 解决方案
    • 优先处理EV5事件:在中断或轮询逻辑中,先处理EV5(地址匹配),再处理EV6(数据传输)。
    • 调整事件判断顺序
      // 示例:中断服务函数
      if (I2C_GetEventType(I2C2) == I2C_EVENT_MASTER_TRANSMITTER_ADDRESSED) {
          // 处理EV6:发送数据
      } else if (I2C_GetEventType(I2C2) == I2C_EVENT_MASTER_RECEIVER_ADDRESSED) {
          // 处理EV6:接收数据
      } else if (I2C_GetFlagStatus(I2C2, I2C_FLAG_ADDR10F)) {
          I2C_ClearFlag(I2C2, I2C_FLAG_ADDR10F); // 清除干扰标志
      }

5. 硬件连接或干扰问题

  • 问题:I2C2的总线可能存在信号干扰(如上拉电阻缺失、线路过长)或与I2C1共用同一总线导致冲突。
  • 解决方案
    • 独立检查硬件:断开I2C1,仅测试I2C2的通信,排除总线冲突。
    • 确保上拉电阻:在SCL和SDA线上添加合适的上拉电阻(典型值4.7kΩ)。
    • 检查从设备兼容性:确保从设备支持7位地址模式,且地址无冲突。

6. 调试建议

  • 使用逻辑分析仪:抓取I2C2的总线波形,确认起始条件、地址字节、ACK信号是否符合规范。
  • 对比I2C1配置:检查I2C1与I2C2的初始化代码差异,重点对比时钟、引脚、地址模式等配置。
  • 简化测试场景:仅发送地址字节并立即读取状态寄存器,验证 ADDR10F是否被错误置位。

总结

问题的核心在于 ADDR10F标志位被误置位,导致EV6事件无法正常触发。通过以下步骤可解决:

  1. 检查并修正I2C2的引脚配置和时钟使能。
  2. 明确设置7位地址模式,并在事件处理中清除 ADDR10F标志。
  3. 优化事件处理逻辑,优先处理EV5事件。
  4. 排除硬件干扰或连接问题。

希望以上建议能帮助您定位并解决问题!

使用特权

评论回复
沙发
丙丁先生|  楼主 | 2025-6-21 18:33 | 只看该作者
[N32G43x]
”N32G435的芯片,I2C2通信不正常,发送起始条件和地址后,从机正常回复ACK,但是I2C2的状...  https://bbs.21ic.com/icview-3463510-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1112

主题

4240

帖子

7

粉丝