// HC89F302C 等待ACK(返回0=成功,1=失败)
uint8_t I2C_Wait_Ack(void) {
uint8_t timeout = 0;
I2C_Delay_us(1);
SDA = 1; // 释放SDA,让从机拉低
I2C_Delay_us(1);
SCL = 1; // SCL拉高,检测ACK(必须拉高SCL!)
I2C_Delay_us(5); // 等待从机拉低SDA
while(SDA == 1) { // 检测SDA电平
timeout++;
if(timeout > 200) { // 超时阈值(≈1ms)
I2C_Stop(); // 超时则发送停止信号
return 1; // ACK失败
}
}
SCL = 0; // SCL拉低,结束ACK检测
I2C_Delay_us(5);
return 0; // ACK成功
}
|