IIC延时函数

别人家的程序

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

延时函数

static void i2c_Delay(void)
{
    
    
	uint8_t i;
	for (i = 0; i < 10; i++);
}

逻辑分析测试得出
不用示波器和逻辑分析仪如何去计算这个延时时间,还望高手评论区留个言

​ 条件: CPU 主频 72MHZ ,MDK 编译, 1级优化

​ 循环次数 10 ,SCL 频率 = 205 KHZ

​ 循环次数 7 ,SCL 频率 = 347 KHZ, SCL 高电平时间 1.5us, SCL 低电平时间 2.87us

​ 循环次数 5 ,SCL 频率 = 421 KHZ ,SCL 高电平时间 1.25us, SCL 低电平时间 2.37us

我这边一个古董级项目

在这里插入图片描述
工作条件:CPU主频168MHz ,IAR编译环境

void IIC_Delay(void)
{
    
    
	u32 i = 20;
	while( i-- );
}

问题,波形不好,IIC_Delay延时时间不够

在这里插入图片描述

降低频率

在这里插入图片描述

野火的延时


/*
*********************************************************************************************************
*	函 数 名: 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++);
}

猜你喜欢

转载自blog.csdn.net/weixin_44057803/article/details/132245846
IIC
今日推荐