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

📄 fm3164.c

📁 基于ARM7的ucos-ii移动收发通信编程ADS开发源码
💻 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 + -