📄 rtc41t81.c
字号:
{
status = E_INVALID_INPUT;
goto I2Cfail;
}
status = E_INVALID_INPUT;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_sec, (Uint8)59, (Uint8)00);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0x80) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_min, (Uint8)59, (Uint8)00);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0x80) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_hour, (Uint8)23, (Uint8)00);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0xC0) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_wday, (Uint8)7, (Uint8)1);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0xF8) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_mday, (Uint8)31, (Uint8)1);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0xC0) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_mon, (Uint8)12, (Uint8)1);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0xE0) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_year, (Uint8)99, (Uint8)00);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = Buffer;
M41T81_Register = Register;
status = M41T81_HaltEable( (M41T81_Register + 0x0C) );
if (status != E_PASS)
goto I2Cfail;
counter = 8;
i2cWriteRegs((M41T81_SLAVE_ADDR << 1), 0x00, M41T81_Register, counter, &Buffer);
if (Buffer != E_PASS)
goto I2Cfail;
status = M41T81_HaltDisable( (M41T81_Register + 0x0C) );
if (status != E_PASS)
goto I2Cfail;
I2Cfail:
TimeInputEnd:
return status;
}
/* M41T81_TimeInput - */
/*=========================================================================
SubRoutine: STATUS M41T81_TimeOut( M41T81_TM *TimeOutput )
Function : read time from M41T81.
Parameter : M41T81_TM
Return : Status - error message ==> E_PASS OR E_INVALID_INPUT
Reference : [2][1]
=========================================================================*/
STATUS M41T81_TimeOut( M41T81_TM *TimeOutput )
{
STATUS status;
static Uint8 Register[20];
Uint8 *M41T81_Register;
M41T81_Register = Register;
i2cInit();
M41T81_ReadRegister(&status, &(*M41T81_Register));
if(status != I2C_SUCCESS)
{
status = E_INVALID_INPUT;
return status;
}
else
status = E_PASS;
M41T81_Register++;
TimeOutput->M41T81_sec = M41T81_Dec2Hex( *M41T81_Register & 0x7F );
M41T81_Register++;
TimeOutput->M41T81_min = M41T81_Dec2Hex( *M41T81_Register & 0x7F );
M41T81_Register++;
TimeOutput->M41T81_hour = M41T81_Dec2Hex( *M41T81_Register & 0x3F );
M41T81_Register++;
TimeOutput->M41T81_wday = M41T81_Dec2Hex( *M41T81_Register & 0x07 );
M41T81_Register++;
TimeOutput->M41T81_mday = M41T81_Dec2Hex( *M41T81_Register & 0x3F );
M41T81_Register++;
TimeOutput->M41T81_mon = M41T81_Dec2Hex( *M41T81_Register & 0x1F );
M41T81_Register++;
TimeOutput->M41T81_year = M41T81_Dec2Hex( *M41T81_Register & 0xFF );
return status;
}
/* M41T81_TimeOut - */
/*=========================================================================
SubRoutine: STATUS M41T81_Init( void )
Function : Init and start M41T81.
Parameter : nil
Return : Status - error message ==> E_PASS OR E_INVALID_INPUT
Reference : [2][1]
=========================================================================*/
STATUS M41T81_Init( void )
{
STATUS status;
static Uint8 Register[20];
Uint8 *M41T81_Register;
M41T81_Register = Register;
i2cInit();
M41T81_ReadRegister(&status, &(*M41T81_Register));
if(status != I2C_SUCCESS)
status = E_INVALID_INPUT;
else
status = M41T81_StopDisable( M41T81_Register + M41T81_ST );
return status;
}
/* M41T81_Init - */
/*=========================================================================
SubRoutine: STATUS M41T81_AlarmTimeInput( M41T81_TM *TimeInput )
Function : set alarm time successive to M41T81.
Parameter : *TimeInput - time struct for input.
(Just useing Month, Date, Hour, Minutes, Secons)
Return : STATUS
Reference : [2][1]
=========================================================================*/
STATUS M41T81_AlarmTimeInput( M41T81_TM *TimeInput )
{
STATUS status;
static Uint8 Register[20];
Uint8 *M41T81_Register;
Uint8 Buffer;
M41T81_TM TimeBuff;
Uint16 counter;
TimeBuff = *TimeInput;
M41T81_Register = Register;
i2cInit();
M41T81_ReadRegister(&status, &(*M41T81_Register));
if(status != I2C_SUCCESS)
{
status = E_INVALID_INPUT;
goto I2Cfail;
}
status = E_INVALID_INPUT;
M41T81_Register += M41T81_AlarmMonth;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_mon, (Uint8)12, (Uint8)1);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0xE0) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_mday, (Uint8)31, (Uint8)1);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0xC0) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_hour, (Uint8)23, (Uint8)00);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0xC0) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_min, (Uint8)59, (Uint8)00);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0x80) | Buffer;
M41T81_Register++;
Buffer = M41T81_Hex2Dec( TimeBuff.M41T81_sec, (Uint8)59, (Uint8)00);
if(Buffer == 0xFF)
goto TimeInputEnd;
*M41T81_Register = (*M41T81_Register & 0x80) | Buffer;
M41T81_Register = Register;
status = M41T81_HaltEable( (M41T81_Register + M41T81_HT) );
if (status != E_PASS)
goto I2Cfail;
counter = 5;
i2cWriteRegs((M41T81_SLAVE_ADDR << 1), M41T81_AlarmMonth,
(M41T81_Register + M41T81_AlarmMonth), counter, &Buffer);
if (Buffer != E_PASS)
goto I2Cfail;
status = M41T81_HaltDisable( (M41T81_Register + M41T81_HT) );
if (status != E_PASS)
goto I2Cfail;
I2Cfail:
TimeInputEnd:
return status;
}
/* M41T81_AlarmTimeInput - */
/*=========================================================================
SubRoutine: STATUS M41T81_AlarmTimeOut( M41T81_TM *TimeOutput )
Function : read alarm time from M41T81.
Parameter : M41T81_TM (Month, Date, Hour, Minutes, Secons)
Return : Status - error message ==> E_PASS OR E_INVALID_INPUT
Reference : [2][1]
=========================================================================*/
STATUS M41T81_AlarmTimeOut( M41T81_TM *TimeOutput )
{
STATUS status;
static Uint8 Register[20];
Uint8 *M41T81_Register;
M41T81_Register = Register;
i2cInit();
M41T81_ReadRegister(&status, &(*M41T81_Register));
if(status == I2C_SUCCESS)
{
status = E_PASS;
M41T81_Register += M41T81_AlarmMonth;
TimeOutput->M41T81_mon = M41T81_Dec2Hex( *M41T81_Register & 0x1F );
M41T81_Register++;
TimeOutput->M41T81_mday = M41T81_Dec2Hex( *M41T81_Register & 0x3F );
M41T81_Register++;
TimeOutput->M41T81_hour = M41T81_Dec2Hex( *M41T81_Register & 0x3F );
M41T81_Register++;
TimeOutput->M41T81_min = M41T81_Dec2Hex( *M41T81_Register & 0x7F );
M41T81_Register++;
TimeOutput->M41T81_sec = M41T81_Dec2Hex( *M41T81_Register & 0x7F );
TimeOutput->M41T81_wday = 0x00;
TimeOutput->M41T81_year = 0x00;
}
else
status = E_INVALID_INPUT;
return status;
}
/* M41T81_AlarmTimeOut - */
/*=========================================================================
SubRoutine: STATUS M41T81_AlarmRepeatMode( AlarmRepeatMode *Repeat )
Function : Write alarm repeat mode to M41T81 register.
Parameter : AlarmRepeatMode (OncePerYear, Month, Day, Hour, Minute, Second)
Return : Status - error message ==> E_PASS OR E_INVALID_INPUT
Reference : [2][1]
=========================================================================*/
STATUS M41T81_AlarmRepeatMode( AlarmRepeatMode Repeat )
{
STATUS status;
static Uint8 Register[20];
Uint8 *M41T81_Register;
Uint8 *RepeatBuffer;
Uint8 Buffer;
Uint16 counter;
M41T81_Register = Register;
// i2cInit( RTC );
M41T81_ReadRegister(&status, &(*M41T81_Register));
if(status != I2C_SUCCESS)
{
status = E_INVALID_INPUT;
goto I2Cfail;
}
RepeatBuffer = M41T81_Register + M41T81_PRT5;
switch(Repeat)
{
case OncePerYear:
*RepeatBuffer &= ~0xC0; // RPT5 RPT4 RPT3 RPT2 RPT1
*(RepeatBuffer + 1) &= ~0x80; // Once Per Year 0 0 0 0 0
*(RepeatBuffer + 2) &= ~0x80; // Once Per Month 1 0 0 0 0
*(RepeatBuffer + 3) &= ~0x80; // Once Per Day 1 1 0 0 0
break; // Once Per Hour 1 1 1 0 0
// Once Per Minute 1 1 1 1 0
case OncePerMonth: // Once Per Second 1 1 1 1 1
*RepeatBuffer &= ~0xC0;
*RepeatBuffer |= 0x40;
*(RepeatBuffer + 1) &= ~0x80;
*(RepeatBuffer + 2) &= ~0x80;
*(RepeatBuffer + 3) &= ~0x80;
break;
case OncePerDay:
*RepeatBuffer |= 0xC0; // alarm repeat seting of repeat register to RPT5 and RPT4
*(RepeatBuffer + 1) &= ~0x80; // alarm repeat seting of repeat register to RPT3
*(RepeatBuffer + 2) &= ~0x80; // alarm repeat seting of repeat register to RPT2
*(RepeatBuffer + 3) &= ~0x80; // alarm repeat seting of repeat register to RPT1
break;
case OncePerHour:
*RepeatBuffer |= 0xC0; // alarm repeat seting of repeat register to RPT5 and RPT4
*(RepeatBuffer + 1) |= 0x80; // alarm repeat seting of repeat register to RPT3
*(RepeatBuffer + 2) &= ~0x80; // alarm repeat seting of repeat register to RPT2
*(RepeatBuffer + 3) &= ~0x80; // alarm repeat seting of repeat register to RPT1
break;
case OncePerMinute:
*RepeatBuffer |= 0xC0; // alarm repeat seting of repeat register to RPT5 and RPT4
*(RepeatBuffer + 1) |= 0x80; // alarm repeat seting of repeat register to RPT3
*(RepeatBuffer + 2) |= 0x80; // alarm repeat seting of repeat register to RPT2
*(RepeatBuffer + 3) &= ~0x80; // alarm repeat seting of repeat register to RPT1
break;
case OncePerSecond:
*RepeatBuffer |= 0xC0; // alarm repeat seting of repeat register to RPT5 and RPT4
*(RepeatBuffer + 1) |= 0x80; // alarm repeat seting of repeat register to RPT3
*(RepeatBuffer + 2) |= 0x80; // alarm repeat seting of repeat register to RPT2
*(RepeatBuffer + 3) |= 0x80; // alarm repeat seting of repeat register to RPT1
break;
default:
break;
}
M41T81_Register = Register;
status = M41T81_HaltEable( (M41T81_Register + M41T81_HT) );
if (status != E_PASS)
goto I2Cfail;
counter = 4;
i2cWriteRegs((M41T81_SLAVE_ADDR << 1), M41T81_PRT5,
RepeatBuffer, counter, &Buffer);
if (Buffer != E_PASS)
{
status = E_INVALID_INPUT;
goto I2Cfail;
}
else
status = E_PASS;
status = M41T81_HaltDisable( (M41T81_Register + M41T81_HT) );
if (status != E_PASS)
goto I2Cfail;
I2Cfail:
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -