题主在学习IIC驱动OLED过程中,模仿例程的逻辑编写好代码,程序几乎一致但是OLED啥也显示不出来。通过查询资料选择用逻辑分析仪分析IIC时钟线和数据线的时序信号,检查具体是哪里出了问题。
时序图显示在每次模拟IIC生成停止信号时,都会多出来一个开始信号,导致IIC信号传输异常,之后具体查询这部分代码。
/**
* 功能:发起IIC停止信号
* 参数:None
* 返回值:None
*/
void stopIIC(void)
{
IIC_SDA_OUT();
IIC_SCL_H();
IIC_SDA_L();
Delay_us(IIC_SPEED);
IIC_SDA_H(); //SCL高电平期间,产生SDA下降沿
Delay_us(IIC_SPEED);
IIC_SCL_L();
}
检查过后发现在在SDA转为输出之后,应该先拉低SDA后拉高SCL。题主猜测如果按照上面的程序逻辑,在发起停止信号前,SDA为高电平, 这时候先拉高SCL再拉低SDA,就会再SCL高电平期间实现SDA的下降沿,就产生了起始信号,而反过来就会避免这种情况发生。