⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m41t11.c

📁 s3c2440裸机程序源码
💻 C
字号:
/* * FILE: m41t11.c * 调用I2C读写函数,设置、读取RTC芯片m41t11 */#include <string.h>#include "m41t11.h"#include "i2c.h"struct rtc_registers {    unsigned char   secs;    unsigned char   mins;    unsigned char   hours;    unsigned char   wday;    unsigned char   mday;    unsigned char   mon;    unsigned char   year;    unsigned char   cs;};#define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10)#define BIN_TO_BCD(val) ((((val)/10)<<4) + (val)%10)                     static unsigned long epoch = 2000;  /* 芯片中”年”为0x00时,对应2000年 */static const unsigned char days_in_mo[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};/* * 写m41t11,设置日期与时间 */int m41t11_set_datetime(struct rtc_time *dt){    unsigned char leap_yr;    struct {        unsigned char addr;        struct rtc_registers rtc;    } __attribute__ ((packed)) addr_and_regs;    memset(&addr_and_regs, 0, sizeof(addr_and_regs));    leap_yr = ((!(dt->tm_year % 4) && (dt->tm_year % 100))            || !(dt->tm_year % 400));    if ((dt->tm_mon < 1) || (dt->tm_mon > 12) || (dt->tm_mday == 0)) {        return -1;    }    if (dt->tm_mday > (days_in_mo[dt->tm_mon] + ((dt->tm_mon == 2)                && leap_yr))) {        return -2;    }    if ((dt->tm_hour >= 24) || (dt->tm_min >= 60) || (dt->tm_sec >= 60)) {        return -3;    }    if ((dt->tm_year -= epoch) > 255) {        /* They are unsigned */        return -4;    }    if (dt->tm_year >= 100) {        dt->tm_year -= 100;    }    addr_and_regs.rtc.secs  = BIN_TO_BCD(dt->tm_sec);    addr_and_regs.rtc.mins  = BIN_TO_BCD(dt->tm_min);    addr_and_regs.rtc.hours = BIN_TO_BCD(dt->tm_hour);    addr_and_regs.rtc.mday  = BIN_TO_BCD(dt->tm_mday);    addr_and_regs.rtc.mon   = BIN_TO_BCD(dt->tm_mon);    addr_and_regs.rtc.year  = BIN_TO_BCD(dt->tm_year);    addr_and_regs.rtc.wday  = BIN_TO_BCD(dt->tm_wday);    addr_and_regs.rtc.cs    = 0;    i2c_write(0xD0, (unsigned char *)&addr_and_regs, sizeof(addr_and_regs));    return 0;}/* * 读取m41t11,获得日期与时间 */int m41t11_get_datetime(struct rtc_time *dt){    unsigned char addr[1] = { 0 };    struct rtc_registers rtc;    memset(&rtc, 0, sizeof(rtc));    i2c_write(0xD0, addr, 1);    i2c_read(0xD0, (unsigned char *)&rtc, sizeof(rtc));    dt->tm_year = epoch;    rtc.secs  &= 0x7f;   /* seconds */    rtc.mins  &= 0x7f;   /* minutes */    rtc.hours &= 0x3f;   /* hours */    rtc.wday  &= 0x07;   /* day-of-week */    rtc.mday  &= 0x3f;   /* day-of-month */    rtc.mon   &= 0x1f;   /* month */    rtc.year  &= 0xff;   /* year */    dt->tm_sec     = BCD_TO_BIN(rtc.secs);    dt->tm_min     = BCD_TO_BIN(rtc.mins);    dt->tm_hour    = BCD_TO_BIN(rtc.hours);    dt->tm_wday    = BCD_TO_BIN(rtc.wday);    dt->tm_mday    = BCD_TO_BIN(rtc.mday);    dt->tm_mon     = BCD_TO_BIN(rtc.mon);    dt->tm_year    += BCD_TO_BIN(rtc.year);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -