STC8 & I2C总线通信

本文讲述了在STC8单片机上实现I2C通信的过程,包括硬件I2C和软件模拟I2C。在硬件实现中,通过修改P_SW2配置解决了引脚问题,成功与PCF8563时钟芯片通信。软件模拟I2C时,由于主频差异导致的延迟问题,通过调整_nop_指令间隔解决了通信异常。同时,修复了因缺少#endif导致的程序无法正常结束的警告。
摘要由CSDN通过智能技术生成

前段时间家里有事,I2C拖到现在才告一段落。
主要的工作是熟悉I2C的软件,硬件实现(STC8支持硬件I2C)。主要实现写,读PCF8563时钟芯片,再从串口1传给PC。
硬件实现就是套官方的例程。改了SDA,SCL引脚,理论上讲是可以直接实现的,为什么调试半天只能读出0XFF呢?手头没有逻辑分析仪,不知道问题所在。后来刁神一语惊醒梦中人,I2C硬件实现是通过芯片内部电路实现的,而默认的I2C引脚不是2.4,2.5脚。查看了Datasheet确实是如此。随后更改了P_SW2的设置将其配置到对应引脚马上就调试成功了。硬件I2C主要是通过配置相应寄存器,由于例程是编好的,还算比较顺利。
随后是软件模拟I2C,我使用的是之前学89C51用的I2C程序,碰到了一些问题,一个是结果显示写数据成功,但读不出来正确数据,一个是程序不能正常ending。
第一个问题,在查阅了很多资料和程序后,确定程序i2c.c本身逻辑问题没有。那么在不同的单片机上区别是什么呢?我又想到了芯片频率问题。STC8A的主频是24MHz,89C51的主频6MHz,中间4倍的差距直接导致_nop_指令运行的时间不同。6M晶振一个_nop_是2us,24M晶振则是0.5us。而I2C协议要求的电平维持时间大多为4.7us。要接近10个空指令才能满足。想到这里,我马上开始着手修改函数中的间隔时间。当然由于保险起见,把中间几乎所有延时都改成了5us,必然会减少I2C通信效率,但效率是在后面考虑的事情。调整完毕通信马上就正常了。
但是,程序没办法正常结束问题还是存在。程序没有循环,但串口一直输出数据。并且编译结果也是有警告的。搜索了警告“unterminated conditionals”发现是.h文件编写的问

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值