RTC读值总为0xFF?可能是这些硬件设计疏漏!
RTC走时误差大、不返回ACK的解决方法
1、 Q:RTC走时误差大是什么原因?
1.1 看参考时间是不是准。如果使用电脑本地时间作为走时参考时间,可先用网络校时工具“About Time”或者“Chronograph”对电脑先进行校时后再比较。
1.2 后备电池电量过低导致时钟走时变慢,如果使用频率计或者时钟测试仪测试输出频率计算走时还不够完善,可以查看1分钟中断,或者直接不断电走时测试实际误差。
1.3 对于SD24系列、SD2068和SD2058,还可以查看12H寄存器是否已清零,此寄存器为数字精度调整寄存器,调整范围达到±189ppm(±16.3s/d)。
1.4 如果使用的是SD24系列、SD22系列,SD2058和SD2068,SD8568等不带温补芯片,环境温度很高或者很低时对走时精度的影响会比较大,一天慢10秒都是有可能的。
2、 Q:为什么RTC一直都不返回ACK,读出来的数值都是0xFF?
2.1 对于带内置电池的RTC,检查VDD是否小于3.3V;我司SD2405系列有3.3v版本与5v版本,检查是否型号选择错误;无内置电池的SD2068请对照RTC芯片手册中的应用参考电路(3.3V和5V应用电路是不一样的)。
2.2 SDA端口没有加上拉电阻(一般是2-10K),或者设置为了推挽输出,建议使用开漏输出。
2.3 SCL和SDA端口定义反了,此问题需要用户仔细核对规格书引脚定义与原理图及代码中引脚引用是否正确对应。
2.4 IO口被复用,因SCL端口在IIC整个操作过程中只有一个方向始终为输入状态,推荐SCL使用推挽输出即可,SDA针对MCU在作为输出作用时设置为开漏输出,作为输入作用时设置为上拉输入。
2.5 器件地址没有设置正确,比如我司SD20XX/SD30XX系列器件地址为0110 010X(51单片机或者STM32中一般写为0x64,Linux驱动中器件地址写为0x32。),我司SD8568器件地址为1010 001X(51单片机或者STM32中一般写为0xA2,Linux驱动中器件地址写为0x51。)。我司SD8939器件地址为1101 000X(51单片机或者STM32中一般写为0xD0,Linux驱动中器件地址写为0x68。)。
2.6 I2C总线上有其它的器件和RTC的器件地址冲突。
2.7 RTC已经损坏,可以多测试几颗芯片,或者交叉验证一下,以此判断出现此问题是个例零星问题还是全部都是一样现象,然后再依据不同结果分析可能原因。
2.8 I2C的通信程序的问题可能涉及到单片机时序不规范、总线过快、等。一般解决此类问题需要示波器或者逻辑分析仪抓取IIC通信波形辅助分析,建议可以直接与我司技术人员联系。