Función de retardo IIC

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

inserte la descripción de la imagen aquí
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

inserte la descripción de la imagen aquí

reducir la frecuencia

inserte la descripción de la imagen aquí

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++);
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44057803/article/details/132245846
Recomendado
Clasificación