M41T56是实时时钟芯片,与流行的DS1307类似。 尽管微电路的引脚排列相同,但它们之间还是存在很大差异,我将尝试讨论这些差异。
简短说明
我不会详细介绍IIC总线的工作,我只注意到两个芯片的地址均为0xd0。 为了处理时间,微电路包含七个帐户寄存器和一个控制寄存器。 帐户寄存器包含二进制十进制格式的数字,但是某些位具有特殊含义。
寄存器xxx-未定义位值。
位x-接通后,该位的状态可以为任意。
区别从时钟寄存器的位7、6和5的分配开始。 在M41T56中,位7和6用于指示向新世纪的过渡,位5和4用于计数数十小时。 此外,小时计数仅在模式24下可用,而AM / PM模式不可用。 在DS1307中,未使用位7,位6中的零表示使用了计数模式24,在这种情况下,位5和4包含数十小时。 如果第6位为1,则第5位成为AM / PM标志,第4位包含数十小时。
在控制寄存器中有很大的不同,其中包含了字校正笔划。
课程修正
M41T56允许您在-62至+124 ppm的范围内补偿石英谐振器的误差,该误差每月不超过±5秒。 为了补偿,控制寄存器的六个最低有效位负责。 位4-0包含校正值的无符号整数,位5设置校正方向。 如果位5包含零,则冲程以2.034 ppm的增量减速,否则RTC以4.068 ppm的增量加速。 这很不方便,因此我绘制了一些简单的函数,用于将ppm转换为校正字,反之亦然。
#define MASK_CALIBR ((1 << 4) | (1 << 3) | (1 << 2) | (1 << 1) | (1 << 0)) #define MASK_CALIBR_SIGN (1 << 5) int8_t caliber_to_ppm(uint8_t caliber) { int8_t result = caliber & MASK_CALIBR; result = (uint8_t) result * 2; if ((caliber & MASK_CALIBR_SIGN) != 0) { result = -result; } else { result = (uint8_t) result * 2; } return result; } uint8_t ppm_to_caliber(int8_t ppm) { uint8_t result; if (ppm < 0) { result = (uint8_t) (-ppm + 1) / 2; result |= MASK_CALIBR_SIGN; } else { result = (uint8_t) (ppm + 2) / 4; } return result; }
故障检测
DS1307和M41T56都不能检测到发电故障,但是它们保证在接通电源时,某些位将处于特定状态。 在控制寄存器中启用时,M41T56将为10xxxxxx。 若要跟踪程序崩溃,可以使用以下算法。 如果在微控制器打开时,RTC控制寄存器包含10xxxxxx,则表明电源出现故障,必须将一个值写入该寄存器的高位不等于10。最简单的方法是用7和6位等于零的方式写入校正字。
文学作品