前段时间家里有事,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文件编写的问
STC8 & I2C总线通信
最新推荐文章于 2024-06-04 08:20:14 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)