前段时间一直忙于工作上的职业考试,除了上班还要去听课,回家就是跟娃玩一会儿,实在没时间去捣鼓这个,就耽搁了一段时间。
今天抽个空,来把最近一周的工作补充一下,之前我努力尝试调通DS18B20,费了几个晚上,也是无功而返,之前用51还是很容易调出来,可那会儿还是学生娃啊,现在用这个AVR怎么就调不出来呢,调了几天没有一点儿成果,一直显示0xff,很是郁闷,索性就先搁置一下,去整那个DS3231去;这个芯片大家口碑都不错,我没有用过,所以没有发言权,感觉DS1302也不错,至于那个时间错多少,自己也没有去认真校验过。
DS3231的资料网上的很少,尤其是用AVR的TWI的接口来实现的更是少而又少,很多都是用通用IO来模拟IIC协议的,自己不太懂这个协议,也没把它想的太复杂,就拿来主义了,把别人现成的函数拿来用,结果呢,可想而知,自己只吃了“螃蟹”,这个事情告诉我,任何时候都不要偷懒,那我就仔细研究DS3231的通讯要求,同时学习IIC协议,由于TWI是兼容IIC的,说白了就是在人家的基础之上加了一些功能,带有通讯的状态字,那这样就可以很清楚的了解出错在哪个环节了,AVR的TWI我只用到单主机与单从机通讯,当然还有多主机与多从机的通讯,因为我这设计不到,所以我就没去管这方面,TWI主要靠四个寄存器分别TWAR、TWBR、TWCR、TWDR来实现TWI主从机通讯:
TWBR设定通讯的速率的寄存器,最高可达400KHz,这个要看你的IIC的器件支持的速率;
TWCR是用来设定通讯状态的寄存器,对器件的开始、应答、结束、中断标志、终端允许等的设定;
TWDR是用来发送、接收数据的缓冲寄存器;
TWAR是从机通讯时候用于设定地址的寄存器,这里可以忽略;
还有一个TWSR反应通讯的状态字,高5位是状态,低2位是通讯的分频因子,这个默认为0就好;
寄存器搞懂了,才好调试程序嘛,程序很快就写出来了,接口函数,但是向DS3231写数据一直不成功,让我苦恼了两三天,怎么调都没找到问题,一直提示我重新开始的状态字,通讯的步骤和datasheet对照了一遍又一遍,最后一步一步的查,终于在发送数据的子函数里找到了问题!
我的原代码这样写: TWCR|=0x84;再看数据手册,这里发送数据时要对启动状态清除,我一下子兴奋了,这就是拷贝代码付出的惨痛代价;
修改后的代码这样: TWCR=0x84;这样就保证发送数据的时候是正常的,这样一下子就搞定了DS3231的通讯,我试着改了通讯速率,测试结果与设定有偏差,不发送显示数据的情况下通讯速率可以达到300多K,显示数据的时候一下就掉到30多K,看来显示数据还是很耗时的呀!