自从完成了驱动LCD显示屏之后,立即着手准备用I2C驱动DS1307日历模块。开始打算尝试硬件I2C的,但反复试验均未获得成功,不得已改用软件模拟I2C来驱动,可是也很不顺利,也是反复试验,以致于头昏脑胀,搁置了两天之后,重新理清思路继续试验,今天终于获得成功。下面是我测试过程中的照片:
测试使用的是网购的DS1307日历模块(见下图),模块上不光有DS1307日历模块,还有一块AT24C32EEPROM,本次首先测试日历模块。
开始按照MCC生成的例子进行测试(见下图),也许是理解不透彻,测试了几天都不成功。
这是多字节读写操作的参考代码:
迫不得已,我就改用软件模拟I2C进行测试。起初将用途SCL和SDA的两个引脚全部设置成输出模式,然后在程序中根据需要动态地将SDA设置成输出模式或输入模式,宏定义如下:
#define SDA_OUT() DIN_SetDigitalOutput() //设置数据端口模式
#define SDA_IN() DIN_SetDigitalInput()
然后通过逻辑分析仪仔细调整延时,让时序符合DS1307数据表的要求,见下图,方波间距在5微秒或略多点:
延时调整好了,按说应该可以读写操作了,可实际上并非如此,依旧读不到数据,于是继续测试,最后调整到DS1307不光正确地接收到了信息,而且还作出了回应,发出了时间日期数据(见下图);
这样可以断定问题出在了单片机接收环节,继续查找接收问题。首先考虑是否因为SDA数据方向的设置是否有误,反复对照引脚的宏定义的,没有发现任何错误。接着怀疑是否是引脚问题,调换到其它引脚测试,仍然没有成效。一度曾经怀疑操作代码问题,但这些代码都在其他板子上正常使用过的,出问题的可能性极小。就这样又折腾了几天时间,决定先暂停测试,清醒一下头脑。隔了两天之后,今天突然想起,SDA引脚的写没有问题,就是读有问题,哪可以将SDA引脚先配置成输入模式,再根据需要动态切换为输出模式试试看,于是马上动手测试,果然就成功了,正确地读取到了日历模块的数据。下面就是读取时间并显示的动画:
这是测试项目的压缩包:
MyTest1.X.rar
(2.23 MB)
|