📄 fm3164.c
字号:
#define FMMODEL
#include "config.h"
#include "I2CINT.h"
#include "fm3164.h"
/*******************************************************************************************************
** 函数名称: INT32S WriteFram(INT32U addr,INT8U * buf,INT32U leth)
** 功能描述: 写铁电
** 输 入: addr---子地址 *buf---待写数据缓冲区 leth---写入数据长度
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT32S WriteFram(INT32U addr,INT8U * buf,INT32U leth)
{
INT32S ret,i;
INT8U addrh,addrl;
INT8S *p;
p = malloc(leth+1);// 申请leth+1字节的内存,成功则返回指向该内存的指针
if(p)// 申请内存成功
{
addrh=addr>>8;
addrl=addr;
p[0]=addrl;
for(i=0;i<leth;i++)
{
p[i+1]=buf[i];
}
ret = ISendStr(0xa0, addrh, (INT8U*)p, leth+1);
free(p);// 释放内存
}
else// 申请内存失败
{
ret = -1;
}
return ret;
}
/*******************************************************************************************************
** 函数名称: INT32S ReadFram(INT32U addr, INT8U *buf ,INT32U leth)
** 功能描述: 读铁电
** 输 入: addr---子地址 *buf---接收数据缓冲区 leth---待读取数据的长度
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT32S ReadFram(INT32U addr, INT8U *buf ,INT32U leth)
{
INT8U addrh,addrl;
INT32S ret;
addrh=addr>>8;
addrl=addr;
ISendStr(0xa0, addrh, &addrl, 1);
ret = IIRcvStr(0xa0, (uint8*)buf, leth);
return ret;
}
/*******************************************************************************************************
** 函数名称: INT16S CopyData(INT8U *From,INT8U *To,INT8U Length)
** 功能描述: 复制数据
** 输 入: From---源数据指针 To---目的数据指针 leth---复制的数据长度
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT16S CopyData(INT8U *From,INT8U *To,INT8U Length)
{
INT8U Count;
for(Count=0;Count<Length;Count++)
{
*(To+Count)=*(From+Count);
}
return 0;
}
/*******************************************************************************************************
** 函数名称: INT16S DecimalToBcd(INT8U *Decimal,INT8U *Bcd,INT8U Number)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT16S DecimalToBcd(INT8U *Decimal,INT8U *Bcd,INT8U Number)
{
INT8U Num;
INT8U Data[3];
for(Num=0;Num<Number;Num++)
{
Data[0]=*(Decimal+Num);
if(Data[0]>=100) return -1;
Data[1]=Data[0]%10;
Data[2]=Data[0]/10;
*(Bcd+Num)=(Data[2]<<4)|Data[1];
}
return 0;
}
/*******************************************************************************************************
** 函数名称: INT16S BcdToDecimal(INT8U *Bcd,INT8U *Decimal,INT8U Number)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT16S BcdToDecimal(INT8U *Bcd,INT8U *Decimal,INT8U Number)
{
INT8U Num;
INT8U Data[3];
for(Num=0;Num<Number;Num++)
{
Data[0]=*(Bcd+Num);
Data[1]=(Data[0]&0xF0)>>4;
Data[2]=Data[0]&0x0F;
*(Decimal+Num)=Data[1]*10+Data[2];
}
return 0;
}
/*******************************************************************************************************
** 函数名称: INT16S EnableFmClock(void)
** 功能描述: 使能FM3164时钟
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT16S EnableFmClock(void)
{
INT8U fmdata;
IRcvStr(REG_ADDR,CALControl, &fmdata, 1);
fmdata&=0x7f;
ISendStr(REG_ADDR, CALControl, &fmdata, 1);
return 0;
}
/*******************************************************************************************************
** 函数名称: void InitClock(void)
** 功能描述: 初始化FM3164时钟
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitClock(void)
{
TimeCur_Zero systime;
EnableFmClock();
systime.Second = 0x10;
systime.Minute = 0x10;
systime.Hour = 0x10;
systime.Day = 0x16;
systime.Week = 0x03;
systime.Month = 0x06;
systime.Year = 0x07;
WriteFmTime((uint8*)&systime.Second);
}
/*******************************************************************************************************
** 函数名称: void ReadClock(INT8U *ptr)
** 功能描述: 读取系统时钟
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ReadClock(INT8U *ptr)
{
TimeCur_Zero systime;
ReadFmTime((uint8*)&systime.Second);
*ptr++ = 0x20;
*ptr++ = systime.Year;
*ptr++ = systime.Month;
*ptr++ = systime.Day;
*ptr++ = systime.Hour;
*ptr++ = systime.Minute;
*ptr++ = systime.Second;
}
/*******************************************************************************************************
** 函数名称: void FeedHartWdt(void)
** 功能描述: 调教硬件看门狗
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void FeedHartWdt(void)
{
INT8U DogData;
DogData=0x0a;
ISendStr(REG_ADDR, 9, &DogData, 1);
}
/*******************************************************************************************************
** 函数名称: void InitHartWdt(void)
** 功能描述: 初始化硬件看门狗
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitHartWdt(void)
{
INT8U DogData;
DogData=0x9E;//看门狗定时时间为3000ms
ISendStr(REG_ADDR, WDControl, &DogData, 1);
}
/*******************************************************************************************************
** 函数名称: void DisableHartWdt(void)
** 功能描述: 关闭硬件看门狗
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DisableHartWdt(void)
{
INT8U DogData = 0x05;
ISendStr(REG_ADDR, WDControl, &DogData, 1);
}
/*******************************************************************************************************
** 函数名称: INT16S WriteFmTime(INT8U *Data)
** 功能描述: 写入FM3164时钟
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT16S WriteFmTime(INT8U *Data)
{
INT8U fmdata;
INT8U BcdData[7];
CopyData(Data,BcdData,6);
OSSchedLock();
fmdata = 0x02;
ISendStr(REG_ADDR, FlagControl, &fmdata, 1);
ISendStr(REG_ADDR, SecondsReg, &BcdData[0], 1);
ISendStr(REG_ADDR, MinutesReg, &BcdData[1], 1);
ISendStr(REG_ADDR, HoursReg, &BcdData[2], 1);
// ISendStr(REG_ADDR, WeekReg, &BcdData[6], 1);
ISendStr(REG_ADDR, DayReg, &BcdData[3], 1);
ISendStr(REG_ADDR, MonthReg, &BcdData[4], 1);
ISendStr(REG_ADDR, YearsReg, &BcdData[5], 1);
fmdata=0x00;
ISendStr(REG_ADDR, FlagControl, &fmdata, 1);
OSSchedUnlock();
return 0;
}
/*******************************************************************************************************
** 函数名称: INT16S ReadFmTime(INT8U *Data)
** 功能描述: 读取FM3164时钟
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
** 作 者: 崔敬军
** 日 期: 2007年05月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
INT16S ReadFmTime(INT8U *Data)
{
INT8U fmdata;
INT8U Temp[10];
OSSchedLock(); //停止任务调度
fmdata=0x01;
ISendStr(REG_ADDR, FlagControl, &fmdata, 1);
IRcvStr(REG_ADDR,SecondsReg, &Temp[0], 1);
IRcvStr(REG_ADDR,MinutesReg, &Temp[1], 1);
IRcvStr(REG_ADDR,HoursReg, &Temp[2], 1);
IRcvStr(REG_ADDR,WeekReg, &Temp[6], 1);
IRcvStr(REG_ADDR,DayReg, &Temp[3], 1);
IRcvStr(REG_ADDR,MonthReg, &Temp[4], 1);
IRcvStr(REG_ADDR,YearsReg, &Temp[5], 1);
fmdata=0x00;
ISendStr(REG_ADDR, FlagControl, &fmdata, 1);
OSSchedUnlock(); //恢复任务调度
CopyData(Temp,Data,7);
return 0;
}
/*********************************************************************************************************
** End Of File
**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -