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

📄 ds3231.c

📁 DS3231驱动
💻 C
字号:
/******************************************************************************
*   名称:  D3231.c                            
*   描述:  D3231模块驱动的实现文件 
*   编写:  
*   日期:  2010.07.23
******************************************************************************/
/*****************************************************************************
**                            DS3231的寄存器说明

    时间寄存器组        0x00    时间:秒
                        0x01    时间:分
                        0x02    时间:小时
                        0x03    时间:星期          
                        0x04    时间:日
                        0x05    时间:月
                        0x06    时间:年
    
    闹钟1寄存器组       0x07    闹钟1:秒
                        0x08    闹钟1:分           
                        0x09    闹钟1:时
                        0x0A    闹钟1:星期/日期
    
    闹钟2寄存器组       0x0B    闹钟2:分    
                        0x0C    闹钟2:时           
                        0x0D    闹钟2:星期/日期
    
    控制寄存器组        0x0E    控制寄存器          
                        0x0F    控制/状态寄存器
    
                        0x10    偏移寄存器
    
    温度寄存器组        0x11    温度MSB             
                        0x12    温度LSB

    说明:  时间和日历寄存器中的数据是BCD格式存储的
******************************************************************************/
/*****************************************************************************
**                            预编译包含
******************************************************************************/
#include "D3231.h"            

/******************************************************************************
*   功能:  初始化DS3231芯片
******************************************************************************/
void DS3231Init(void)
{
   I2CInit(0,0,400);		//初始化I2C总线,400K速率   
}
/******************************************************************************
*   功能:  从DS3231读取时间
*   输出:  pTime 保存从DS3231读取到的时间的指针
    说明:  时间寄存器组7个字节定长
******************************************************************************/
void DS3231ReadTime(DS3231_TIMEtag *pTime)
{
    //设置起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                &(pTime->cSecond),
                0x00); 
    
    //读取时间寄存器
    I2CRecvStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_TIME_BEGIN_ADDR, 
                &(pTime->cSecond),
                0x07);                     //7个字节定长
    
    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                &(pTime->cSecond),
                0x00); 
}
/******************************************************************************
*   功能:  设置DS3231的时间寄存器
*   输入:  pTime 待设置的时间内容的指针
    说明:  时间寄存器组7个字节定长
******************************************************************************/
void DS3231SetTime(DS3231_TIMEtag *pTime)
{
    //设置当前的时间
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_TIME_BEGIN_ADDR, 
                &(pTime->cSecond),
                0x07);

    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                &(pTime->cSecond),
                0x00);  
}
/******************************************************************************
*   功能:  读取DS3231的闹钟1的设置
*   输出:  pAlarm1   保存从DS3231读取到的闹钟1数据的指针
    说明:  闹钟1寄存器组4个字节定长
******************************************************************************/
void DS3231ReadAlarm1(DS3231_ALARM1tag *pAlarm1)
{
    //设置起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_ALARM1_BEGIN_ADDR, 
                &(pAlarm1->cSecond),
                0x00);
                 
    //读取闹钟1时间寄存器
    I2CRecvStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_ALARM1_BEGIN_ADDR, 
                &(pAlarm1->cSecond),
                0x04);                     //4个字节定长
    
    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                &(pAlarm1->cSecond),
                0x00); 
}
/******************************************************************************
*   功能:  设置DS3231的闹钟1寄存器的值
*   输入:  pAlarm1   待设置的闹钟时间内容指针
    说明:  闹钟1寄存器组4个字节定长
******************************************************************************/
void DS3231SetAlarm1(DS3231_ALARM1tag *pAlarm1)
{
    //设置闹钟1的时间
    //4个字节定长
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_ALARM1_BEGIN_ADDR, 
                &(pAlarm1->cSecond),
                0x04);     

    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                &(pAlarm1->cSecond),
                0x00);  
}
/******************************************************************************
*   功能:  读取闹钟2的设置
*   输出:  pAlarm2 保存从DS3231读取到的闹钟2的指针
    说明:  闹钟2寄存器组3个字节定长
******************************************************************************/
void DS3231ReadAlarm2(DS3231_ALARM2tag *pAlarm2)
{
    //设置起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_ALARM2_BEGIN_ADDR, 
                &(pAlarm2->cMinute),
                0x00);
                 
    //读取闹钟2时间寄存器
    //3个字节定长
    I2CRecvStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_ALARM2_BEGIN_ADDR, 
                &(pAlarm2->cMinute),
                0x03);                     
    
    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR,   
                &(pAlarm2->cMinute),
                0x00); 
}
/******************************************************************************
*   功能:  设置闹钟2
*   输入:  pAlarm2 设置闹钟2寄存器内容的指针
    说明:  闹钟2寄存器组3个字节定长
******************************************************************************/
void DS3231SetAlarm2(DS3231_ALARM2tag *pAlarm2)
{
    //设置闹钟2的时间
    //3个字节定长
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_ALARM2_BEGIN_ADDR, 
                &(pAlarm2->cMinute),
                0x03);     

    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                &(pAlarm2->cMinute),
                0x00); 
}
/******************************************************************************
*   功能:  读取DS3231的控制寄存器
******************************************************************************/
void DS3231ReadCtlReg(BYTE *pCtrlReg)
{
    //设置起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_CTRL_ADDR, 
                pCtrlReg,
                0x00);
                 
    //读取控制寄存器
    //1个字节定长
    I2CRecvStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_CTRL_ADDR, 
                pCtrlReg,
                0x01);                     
    
    //恢复起始
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR,   
                pCtrlReg,
                0x00); 
}
/******************************************************************************
*   功能:  设置DS3231的控制寄存器
******************************************************************************/
void DS3231SetCtlReg(BYTE *pCtlReg)
{
    //设置控制寄存器
    //1个字节定长
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_CTRL_ADDR, 
                pCtlReg,
                0x01);     

    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                pCtlReg,
                0x00);  
}
/******************************************************************************
*   功能:  读取DS3231的控制/状态寄存器
******************************************************************************/
void DS3231ReadCtlStatusReg(BYTE *pCtrlStatusReg)
{
    //设置起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_CTRL_STATUS_ADDR, 
                pCtrlStatusReg,
                0x00);
                 
    //读取控制/状态寄存器
    //1个字节定长
    I2CRecvStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_CTRL_STATUS_ADDR, 
                pCtrlStatusReg,
                0x01);                     
    
    //恢复起始
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR,   
                pCtrlStatusReg,
                0x00); 
}
/******************************************************************************
*   功能:  设置DS3231的控制/状态寄存器
******************************************************************************/
void DS3231SetCtlStatusReg(BYTE *pCtlStatusReg)
{
    //设置控制/状态寄存器
    //1个字节定长
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_CTRL_STATUS_ADDR, 
                pCtlStatusReg,
                0x01);     

    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                pCtlStatusReg,
                0x00);  
}
/******************************************************************************
*   功能:  读取DS3231的偏移寄存器
******************************************************************************/
void DS3231ReadOffsetReg(BYTE *pOffsetReg)
{
    //设置起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_OFFSET_ADDR, 
                pOffsetReg,
                0x00);
                 
    //读取偏移寄存器
    //1个字节定长
    I2CRecvStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_OFFSET_ADDR, 
                pOffsetReg,
                0x01);                     
    
    //恢复起始
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR,   
                pOffsetReg,
                0x00); 
}
/******************************************************************************
*   功能:  设置DS3231的偏移寄存器
******************************************************************************/
void DS3231SetOffsetReg(BYTE *pOffsetReg)
{
    //设置偏移寄存器
    //1个字节定长
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_OFFSET_ADDR, 
                pOffsetReg,
                0x01);     

    //恢复起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR, 
                pOffsetReg,
                0x00);  
}
/******************************************************************************
*   功能:  读取DS3231的温度寄存器
******************************************************************************/
void DS3231ReadTempReg(DS3231_TEMPtag *pTemp)
{
    //设置起始地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_TEMP_BEGIN_ADDR, 
                &(pTemp->cTempMSB),
                0x00);
                 
    //读取温度寄存器
    //2个字节定长
    I2CRecvStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_0, 
                DS3231_TEMP_BEGIN_ADDR, 
                &(pTemp->cTempMSB),
                0x02);                     
    
    //恢复地址为寄存器组首地址
    I2CSendStr( I2C_PORT_0, 
                DS3231_SLAVE_ADDR,
                DS3231_SUBA_EN_2, 
                DS3231_REG_BEGIN_ADDR,   
                &(pTemp->cTempMSB),
                0x00); 
}
/*****************************************************************************
**                            文件结束
******************************************************************************/


⌨️ 快捷键说明

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