别人家的程序
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++);
}