网上买了一个OLED 0.96寸 SSD1306 i2c协议,用了一周,总算弄亮了,但是还是有疑惑未解。
我用的是STC8H1K08,按卖家提供的资料下载,卖家的资料是有STC89C52的单片机 ,直接拿过来编译下载到STC8H1K08中,屏幕点不亮,以为是不是单片机是1T的,频率太快,于是降频,运行频率降到1MHZ,还是不行。
在网上看了很多代码,和厂家提供的都是大同小异,无明显区别,按照网友提供的方法,修改了很多地方,终于弄亮了。
疑惑1:网上好多代码,我也找了3、4个吧,都不能用,要说频率不对我能理解,不明白都是1T的51单片机,为什么就用不了?列出我修改的几处关键代码
********************************************************************************************
函数名称:IIC Start
功 能:IIC Start
返 回 值:无
时 间:2022-02-12
备 注:厂家提供
*********************************************************************************************/
void IIC_Start(void)
{
SCL = high;
SDA = high; //依次拉高SCL和SDA,使总线处于空闲状态;
//存在三种情况:1:SCL和SDA都在空闲(高电平)这时先拉高SCL无问题;
// 2:SCL高电平,SDA低电平,此时先拉高SCL,在拉高SDA能不能造成停止信号?
// 3:SCL低电平,SDA高电平,此时先拉高SCL,无问题。
Delay2us(); //手册要求大于0.6微秒,增加!
SDA = low; //拉低SDA,启动指令
Delay2us(); //手册无要求
SCL = low; //拉低SCL,准备发数据
Delay2us(); //手册无要求
}
/********************************************************************************************
函数名称:IIC Stop
功 能:IIC Stop
返 回 值:无
时 间:2022-02-28
备 注:参照逻辑分析仪和I2C协议进行部分修改,未验证。
*********************************************************************************************/
void IIC_Stop(void)
{
SCL = low; //不管SCL在字符结束是否拉低,再次拉低
//Delay2us();
SDA = low;
Delay2us(); //屏蔽这2句,即发送字节函数结束SCL已拉低且延时;SDA已被从机ACK拉低,未验证。
SCL = high; //拉高SCL
Delay2us(); //手册要求大于0.6微秒,增加!
SDA = high; //拉高SDA 发出停止信号
}
疑惑2:搞亮后,用逻辑分析仪分析,发现SSD1306说明书没有说ACK保持多长时间,程序无法准确判断ACK信号的结束时间,造成字节间存在传输的一个空闲区。