STC8H单片机I2C协议驱动OLED 的困惑

作者分享了在使用STC8H1K08驱动0.96寸OLED SSD1306的过程中遇到的问题,包括IIC初始化代码的调整和ACK信号处理的不确定性。通过尝试不同代码并解决频率问题,最终点亮屏幕,但对ACK信号保持时间的不确定性成为后续调试关键。
摘要由CSDN通过智能技术生成

         网上买了一个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信号的结束时间,造成字节间存在传输的一个空闲区。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值