chiplib.c

来自「电能表源码」· C语言 代码 · 共 498 行

C
498
字号
/*************************************************************************************

	文件类型:底层驱动函数文件
	文件作用:
	修改权限:底层驱动维护人员
	文件相关:
	
	创 建 人:GeminiKQ
	创建日期:2006.12.19
	当前版本:Ver0.1
	
	版本信息:Ver0.1					GeminiKQ

**************************************************************************************/
//#include "ExTigReg.h"
//#include "ChipMac.h"
//#include "HardwareDef.h"
//#include "defvar.h"
#include "tiger.h"

#define		WPADDRESS	0x1094		// 写缓存首地址
#define		RLADDRESS	0x1093		// 读缓存末地址
//=======================================================
//函数名:W_Buff
//函数作用:写数据到写缓存
//入口参数:需要写的32位数据
//出口参数:无
//
//======================================================= 
void W_Buff(unsigned long lword)
{
	unsigned char xdata *point;
	point = WPADDRESS;
	*(point++) = (unsigned char)lword;
	*(point++) = (unsigned char)(lword>>8);
	*(point++) = (unsigned char)(lword>>16);
	*point = (unsigned char)(lword>>24);
}
//=======================================================
//函数名:W_Byte
//出口参数:无
//
//函数作用:写数据到地址
//入口参数:Addr-目标地址,Wdata-操作数据
//======================================================= 
void W_Byte(unsigned int Addr,unsigned char Wdata)
{
	unsigned char xdata *point;
	point = Addr;
	*point = Wdata;
}
//=======================================================
//函数名:R_Byte
//函数作用:从目标地址读数据
//入口参数:目标地址
//出口参数:读出的数据
//
//======================================================= 
unsigned char R_Byte(unsigned int Addr)
{
	unsigned char xdata *point;
	unsigned char Rdata;
	point = Addr;
	Rdata = *point;
	return Rdata;
}	
//=======================================================
//函数名:R_Buff
//函数作用:从读缓存读数据
//入口参数:无
//出口参数:读出的32位数据
//
//======================================================= 
unsigned long R_Buff(void)
{
	unsigned char xdata *point;
	unsigned long longword;
	point = RLADDRESS;
	longword = *(point--);
	longword <<= 8;
	longword += *(point--);
	longword <<= 8;
	longword += *(point--);
	longword <<= 8;
	longword += *(point--);
	return longword;
}
//=======================================================
//函数名:Init_ExTU2
//函数作用:外扩timer2及uart2模块初始化
//入口参数:无
//出口参数:无
//
//======================================================= 
void Init_ExTU2(void)
{
	// timer mode control
	TMOD2 = ExT2M;
	
	TL20 = ExT2TL;
	TH20 = ExT2TH;
#ifdef	ExT2_4CLK
	// T0M = 1 -> t0clk = system.clk/4
	TCON2 |= BIT4;
#endif
	// TR0 = 1; <TCON2.0>
	TCON2 |= 0x01;
	
// 以下为串口设置
 	SCON2 = ExU2M;	// 波特率方式1
#ifdef	ExU2_SMOD1	
	TCON2 |= BIT7;	// SET SMOD,波特率加倍
#endif
	TL21 = ExU2TL;
	TH21 = ExU2TH;	//
	// T1M = 1;
	TCON2 |= BIT5;
#ifdef	ExU2_38K	
	// 载波38K选择
	Txd2FS = 0x01;
#endif	
	// 打开定时器1
	TCON2 |= BIT1;
}
//=======================================================
//函数名:Init_ExTU3
//函数作用:外扩timer3及uart3模块初始化
//入口参数:无
//出口参数:无
//
//======================================================= 
void Init_ExTU3(void)
{
	// timer mode control
	TMOD3 = ExT3M;
	
	TL30 = ExT3TL;
	TH30 = ExT3TH;
#ifdef	ExT3_4CLK
	// T0M = 1 -> t0clk = system.clk/4
	TCON3 |= BIT4;
#endif
	// TR0 = 1; <TCON2.0>
	TCON3 |= 0x01;
	
// 以下为串口设置
 	SCON3 = ExU3M;	// 波特率方式1
#ifdef	ExU3_SMOD1	
	TCON3 |= BIT7;	// SET SMOD,波特率加倍
#endif
	TL31 = ExU3TL;
	TH31 = ExU3TH;	//
//	TL31 = 0xe3;
//	TH31 = 0xe3;	//
	// T1M = 1;
	TCON3 |= BIT5;
	// 打开定时器1
	TCON3 |= BIT1;
}
//=======================================================
//函数名:Init_ExTU4
//函数作用:外扩timer4及uart4模块初始化
//入口参数:无
//出口参数:无
//
//======================================================= 
void Init_ExTU4(void)
{
	// timer mode control
	TMOD4 = ExT4M;
	
	TL40 = ExT4TL;
	TH40 = ExT4TH;
#ifdef	ExT4_4CLK
	// T0M = 1 -> t0clk = system.clk/4
	TCON4 |= BIT4;
#endif
	// TR0 = 1; <TCON2.0>
	TCON4 |= 0x01;
	
// 以下为串口设置
 	SCON4 = ExU4M;	// 波特率方式1
#ifdef	ExU4_SMOD1	
	TCON4 |= BIT7;	// SET SMOD,波特率加倍
#endif
	TL41 = ExU4TL;
	TH41 = ExU4TH;	//
	// T1M = 1;
	TCON4 |= BIT5;
	// 打开定时器1
	TCON4 |= BIT1;
}
//=======================================================
//函数名:Init_ExTU5
//函数作用:外扩timer5及uart5模块初始化
//入口参数:无
//出口参数:无
//
//======================================================= 
void Init_ExTU5(void)
{
	// timer mode control
	TMOD5 = ExT5M;
	
	TL50 = ExT5TL;
	TH50 = ExT5TH;
#ifdef	ExT5_4CLK
	// T0M = 1 -> t0clk = system.clk/4
	TCON5 |= BIT4;
#endif
	// TR0 = 1; <TCON2.0>
	TCON5 |= 0x01;
	
// 以下为串口设置
 	SCON5 = ExU5M;	// 波特率方式1
#ifdef	ExU5_SMOD1	
	TCON5 |= BIT7;	// SET SMOD,波特率加倍
#endif
	TL51 = ExU5TL;
	TH51 = ExU5TH;	//
	// T1M = 1;
	TCON5 |= BIT5;
	// 打开定时器1
	TCON5 |= BIT1;
}

/* 初始化Timer0 */
void Init_Timer0(void)
{	
	TMOD = 0x01;	// 工作在模式1
	CKCON|=0x01;    // clk/4 
    TL0  = 0xff;    //10ms
    TH0  = 0xdf;
    TR0 = 1;		// 开定时器0
    ET0 = 1;		// enable timer0 interrupt
}

void Init_Timer1(void)
{
	//
}

void Init_Uart1(void)
{
	TMOD = 0x21;	// 定时器1方式2
	SCON1 = 0xd0;	// 波特率方式3
	EICON = 0x80;	// set smod
	TH1 = 0xc7;		//
	TL1 = 0xc7;		// 波特率设置
	TR1 = 1;		// 开定时器1
}
//=======================================================
//函数名:Init_Timer2
//函数作用:内核Timer2的初始化
//入口参数:无
//出口参数:无
//
//======================================================= 
void Init_Timer2(void)
{
	RCAP2L = 0x00;	// reload data low byte
	RCAP2H = 0x50;	// reload data high byte

	TL2 = 0x00;
	TH2 = 0x00;
	
	CP_RL2 = 0;		// reload mode 
	TR2 = 1; 		// start timer2
}
//=======================================================
//函数名:Init_RTC
//函数作用:RTC模块初始化
//入口参数:无
//出口参数:无
//
//======================================================= 
void Init_RTC(void)
{
#ifdef RESET_RTC_MODE
	/* 复位RTC操作 */
	RTC_PEN = 0x96;	//password 1
	RTCPWD = 0x57;	//password 2
#endif	
	/* RTC允许写 */
	RTC_PEN = 0x96;	//password 1
	RTCPWD = 0xd7;	//password 2

	/* 写RTC修正寄存器 */
	RTCLC = DPXZ;	// 低频修正
	RTCHCH = GPXZH;	// 高频修正高位
	RTCHCL = GPXZL;	// 高频修正低位
	
	/* RTC时钟初始化 */
	RTCSFTO = TSource;	// T-souce选择
	/* 休眠唤醒间隔时间初始化 */
	INT_RTC = SleepTime;
	
#ifdef INIT_RTCTIME_MODE
	/* 写RTC时间 */
	RTCYC = YEAR;
	RTCMoC = MONTH;
	RTCDC = DATE;
	RTCHC = HOUR;
	RTCMiC = MINUTE;
	RTCSC = SECOND;
	RTCWC = WEEK;
#endif
	/* RTC禁止写 */ 
	RTC_PEN = 0x96;	//
	RTCPWD = 0xd6;
}
//=======================================================
//函数名:Init_LCD
//函数作用:LCD模块初始化
//入口参数:无
//出口参数:无
//
//======================================================= 
void Init_LCD(void)
{   
	Ctrl_LCD = LCDON+DRVLCD+FLCD;
}   
    

//=======================================================
//函数名:Fet_Dog
//函数作用:喂狗操作
//入口参数:无
//出口参数:无
//
//======================================================= 
void Fet_Dog(void)
{
	WDT_EN = 0xa5;
	WDT_CLR = 0x5a;
}
//=======================================================
//函数名:Set_PLL
//函数作用:打开PLL,并将系统时钟切换至PLL
//入口参数:无
//出口参数:无
//
//======================================================= 
void Set_PLL(void)
{
	unsigned char xdata *point;
	// 开PLL
    point = 0x2894;
    *point = 0x3f;
    point = 0x2897;
    *point = 0x8a;
    point = 0x2898;
    *point = 0x01;
	// 写密码
	point = 0x28d4;
	*(point++) = 0xd2;
	*(point++) = 0x09;
	// 切换时钟
	point = 0x28d0;
	*point = 0x01;
}
//=======================================================
//函数名:Sys_Monitor
//函数作用:系统自检
//入口参数:无
//出口参数:无
//备注:目前实现的功能是在系统有电时时钟全部切换到PLL
//======================================================= 
void Sys_Monitor(void)
{
	if(Systate & BIT0)
	{
		Set_PLL();
		ALTER_PLL_RTC();
	}
}

//====================================================
//函数名:page_erase
//函数作用 页擦除flash
//备注:擦除操作需要20ms,此时程序处于休眠状态,其他中断必须关闭,只开启擦写flash中断
//=====================================================
void page_erase ( unsigned int page)
{
    unsigned char xdata *p;
	
	SPC_FUN =0x01;
	p = 0x0555;
	*p = 0xaa;
	p = 0x02aa;
	*p = 0x55;
	p = 0x0555;
	*p = 0x80;
	p = 0x0555;
	*p = 0xaa;
	p = 0x02aa;
	*p = 0x55;
	p = page;
	*p = 0x30;
	
	SPC_FUN = 0x00;

    PCON = 0x01;

}

//====================================================
//函数名:iap_wr_byte
//函数作用:写一个字节到flash
//备注:写一个字节需要20us
//=====================================================
void iap_wr_byte( unsigned int addr, unsigned char dat)
{
	unsigned char xdata *p;

	SPC_FUN = 0x01;
	p = 0x0555;
	*p = 0xaa;
	p = 0x02aa;
	*p = 0x55;
	p = 0x0555;
	*p = 0xa0;
	p = addr;
	*p = dat;
	
	SPC_FUN = 0x00;

    PCON = 0x01;

}

//====================================================
//函数名:Read_flash
//函数作用:从flash读取一个字节数据
//备注
//=====================================================
unsigned char Read_flash( unsigned int addr )
{  unsigned char code *p;
   unsigned char idata cdata;
   p=addr;
   cdata = *p;
   return cdata;
}



//====================================================
//函数名:ready_wrflash
//函数作用:flash擦写前准备,主要关闭其他中断
//备注
//====================================================
void ready_wrflash(void)
{   IE = 0x00;
	EIE = 0x01;                    //中断向量8打开               
	ExInt2IE = 0x40;               //开FLASH擦写中断
	ExInt3IE = 0x00;            
	ExInt4IE = 0x00;
	EA=1;                          //总中断打开
}

//====================================================
//函数名:wrnum_flash
//函数作用:写4个字节一下到flash
//备注:根据需要可以改动写缓冲的大小
//====================================================
void wrnum_flash(unsigned char num,unsigned int addr)
{  
   unsigned char idata i;
   SPC_FUN = 0x01;
   //if(F_comppereas!=0)
  //    F_comppereas=0;
   ready_wrflash();
   if(num<=4)
    { for(i=0;i<num;i++)
        { iap_wr_byte(addr,wr_buff[i]);
		  addr++;
	    }
	}
   SPC_FUN = 0x00;

}


//====================================================
//函数名:rdnum_flash
//函数作用:从flash读4个字节
//备注:根据需要可以改动写缓冲的大小
//====================================================
void rdnum_flash(unsigned char num,unsigned int addr)
{unsigned char idata i;
 if(num<=4)
   {for(i=0;i<num;i++)
       {wr_buff[i]=Read_flash(addr);
	    addr++;
		}
   }
}

⌨️ 快捷键说明

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