wenwen446 2023-04-14 16:41 采纳率: 25%
浏览 51
已结题

I2C与EEPROM通信

我用I2C0与一款EEPROM收发,用的PB6和PB7可以正常通信,当换成PB8和PB9作为SCL和SDA发现就一直卡在Busy为1的死循环里。PB6与PB8的区别如下,

img

所以在PB8/9 GPIO配置时加了rcu_periph_clock_enable(RCU_AF),请问如何用PB8/9正常与EEPROM通信起来?

  • 写回答

3条回答 默认 最新

  • lllomh 2023-04-14 16:43
    关注

    对于使用PB8和PB9作为I2C通信引脚时,您需要进行以下步骤来确保与EEPROM正常通信:

    确认硬件连接:请确保PB8与PB9正确连接到EEPROM的SCL和SDA引脚,并且没有连接错误或者电气问题。

    配置GPIO引脚:在使用PB8和PB9作为I2C通信引脚时,您需要将这两个引脚配置为复用功能,并且开启AF(Alternate Function)功能。可以使用以下代码进行配置:

    // 使能GPIOB时钟
    rcu_periph_clock_enable(RCU_GPIOB);
    
    // 配置PB8和PB9为复用功能
    gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_9);
    
    // 配置PB8和PB9的复用功能为I2C0
    gpio_pin_remap_config(GPIO_B8_B9_REMAP, ENABLE);
    
    
    

    这里使用了 gpio_pin_remap_config() 函数来配置PB8和PB9的复用功能为I2C0,这是因为在STM32F10x系列的芯片中,PB8和PB9的复用功能默认映射到了其他引脚,需要通过这个函数来重新映射。

    初始化I2C:在初始化I2C时,您需要指定正确的SCL和SDA引脚,即PB8和PB9,并且使用正确的时钟频率和通信模式。例如,以下是初始化I2C0的示例代码:

    // 使能I2C0时钟
    rcu_periph_clock_enable(RCU_I2C0);
    
    // 配置I2C0参数
    i2c_init(I2C0);
    i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, MY_OWN_ADDR);
    i2c_ack_config(I2C0, I2C_ACK_ENABLE);
    i2c_speed_config(I2C0, I2C_SPEED_STANDARD, 0x2D, 0x04);
    i2c_enable(I2C0);
    
    
    

    这里 MY_OWN_ADDR 是您的EEPROM的地址,根据您的实际应用进行配置。

    确保EEPROM配置正确:请确保您的EEPROM的配置是正确的,包括地址设置、通信速率、通信模式等参数都与您的实际硬件连接和应用需求相匹配。

    检查错误处理:如果您的代码中仍然无法正常通信,您可以添加错误处理机制,例如检查I2C的状态寄存器,查看是否出现错误标志位,进一步调试和定位问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月14日
  • 已采纳回答 4月14日
  • 赞助了问题酬金15元 4月14日
  • 创建了问题 4月14日

悬赏问题

  • ¥200 内网渗透测试 横向渗透 Windows漏洞 Windows权限维持
  • ¥15 数据结构图的相关代码实现
  • ¥20 求友友们解惑,感激不尽
  • ¥15 python中aiohttp.client_exceptions.ContentTypeError
  • ¥30 DeepLung肺结节检测生成最大froc值对应的epoch报错
  • ¥15 信号发生器如何将频率调大,步尽值改成10
  • ¥15 keil 5 编程智能家具,风扇台灯开关,人体感应等
  • ¥100 找一名渗透方面的专家
  • ¥20 使用Matlab APP设计一个插补小程序
  • ¥15 evo评估时曲线出现问题