programa de otras personas
void i2c_Start(void)
{
OLED_I2C_SDA_1(); //SDA 总线置1
OLED_I2C_SCL_1(); //SCL 总线置1
i2c_Delay(); //延时信号
OLED_I2C_SDA_0(); //置 0
i2c_Delay();
OLED_I2C_SCL_0(); //SCL 置0
i2c_Delay();
}
función de retardo
static void i2c_Delay(void)
{
uint8_t i;
for (i = 0; i < 10; i++);
}
prueba de análisis lógico
Cómo calcular este tiempo de retardo sin un osciloscopio y un analizador lógico, deje un comentario en el área de comentarios de expertos
Condiciones: frecuencia principal de la CPU 72 MHz, compilación MDK, optimización de nivel 1
Tiempos de ciclo 10, frecuencia SCL = 205 KHZ
Tiempos de ciclo 7, frecuencia SCL = 347 KHZ, tiempo de nivel alto SCL 1.5us, tiempo de nivel bajo SCL 2.87us
Tiempos de ciclo 5, frecuencia SCL = 421 KHZ, tiempo de nivel alto SCL 1.25us, tiempo de nivel bajo SCL 2.37us
Un artículo de grado antiguo de mi lado
Condiciones de trabajo: CPU frecuencia principal 168 MHz, entorno de compilación IAR
void IIC_Delay(void)
{
u32 i = 20;
while( i-- );
}
El problema es que la forma de onda no es buena y el tiempo de retardo de IIC_Delay no es suficiente
reducir la frecuencia
lapso de tiempo del incendio forestal
/*
*********************************************************************************************************
* 函 数 名: i2c_Delay
* 功能说明: I2C总线位延迟,最快400KHz
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{
uint8_t i;
/*
可用逻辑分析仪测量I2C通讯时的频率
工作条件:CPU主频168MHz ,MDK编译环境,1级优化
经测试,循环次数为20~250时都能通讯正常
*/
for (i = 0; i < 40; i++);
}