我用I2C0与一款EEPROM收发,用的PB6和PB7可以正常通信,当换成PB8和PB9作为SCL和SDA发现就一直卡在Busy为1的死循环里。PB6与PB8的区别如下,
所以在PB8/9 GPIO配置时加了rcu_periph_clock_enable(RCU_AF),请问如何用PB8/9正常与EEPROM通信起来?
我用I2C0与一款EEPROM收发,用的PB6和PB7可以正常通信,当换成PB8和PB9作为SCL和SDA发现就一直卡在Busy为1的死循环里。PB6与PB8的区别如下,
所以在PB8/9 GPIO配置时加了rcu_periph_clock_enable(RCU_AF),请问如何用PB8/9正常与EEPROM通信起来?
对于使用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的状态寄存器,查看是否出现错误标志位,进一步调试和定位问题。