21ic问答首页 - GD32F103CBT6 IIC写数据后IIC不能STOP的问题咨询
GD32F103CBT6 IIC写数据后IIC不能STOP的问题咨询
lyyun2022-03-06
使用GD的硬件IIC通讯,代码用STM32的,能读但不能写,表现为写8个字节(一页)数据后时钟没办法恢复到高电平状态,咨询一下大家有没有比较通用的方法:
定位到应该是以上代码中不能使GD的IIC正常STOP,STM32和HK32都正常:
void I2C_EE_WaitEepromStandbyState2(void)
{
I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
return;
vu16 SR1_Tmp = 0;
do {
/* 发送起始信号 */
I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
/* 读 I2C1 SR1 寄存器 */
SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);
/* 发送 EEPROM 地址 + 写方向 */
I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS,
I2C_Direction_Transmitter);
}
// SR1 位 1 ADDR:1 表示地址发送成功,0 表示地址发送没有结束
// 等待地址发送成功
while (!(I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1) & 0x0002));
/* 清除 AF 位 */
I2C_ClearFlag(EEPROM_I2Cx, I2C_FLAG_AF);
/* 发送停止信号 */
I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
}
定位到应该是以上代码中不能使GD的IIC正常STOP,STM32和HK32都正常:
void I2C_EE_WaitEepromStandbyState2(void)
{
I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
return;
vu16 SR1_Tmp = 0;
do {
/* 发送起始信号 */
I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
/* 读 I2C1 SR1 寄存器 */
SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);
/* 发送 EEPROM 地址 + 写方向 */
I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS,
I2C_Direction_Transmitter);
}
// SR1 位 1 ADDR:1 表示地址发送成功,0 表示地址发送没有结束
// 等待地址发送成功
while (!(I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1) & 0x0002));
/* 清除 AF 位 */
I2C_ClearFlag(EEPROM_I2Cx, I2C_FLAG_AF);
/* 发送停止信号 */
I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
}
您需要登录后才可以回复 登录 | 注册