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

📄 x5045.c

📁 X5045看门狗的用法和读写程序,C语言编写
💻 C
字号:
/*************************************************************************
本文件是X5045的读写程序段。文件名为:X5045.c
编写作者:puke7381
编写日期:20081017
版本:Vyf08.c.01
*************************************************************************/

#include "at89x51.h"
#include "intrins.h"
#include "x5045.h"

/*************************************************************************
名称:rst_wdog
功能:复位看门狗
输入参数 :无
调用:	无
返回值:	无
*************************************************************************/
void rst_wdog( void )
{
	X5045_CS = 0;
	X5045_CS = 1;
}

/*************************************************************************
名称:si_byte
功能:从SI线送一个字节到状态寄存器或EEPROM,高位(MSB)在前
输入参数 :cha
调用:	无
返回值:	无
*************************************************************************/
void si_byte( unsigned char cha )
{
	unsigned char i,temp;
	for( i = 0; i < 8; i++ )
	{
		temp = cha & 0x80;						//为取高位作准备
		X5045_SCK = 0;							//SCK产生下降沿
		_nop_();
		X5045_SI = temp >> 7;					//把最高位右移到最低位,输出到SI线
		X5045_SCK = 1;
		cha <<= 1;								//把cha左移一位
	}
	X5045_SI = 0; 								//设SI为已知状态
}


/*************************************************************************
名称:so_byte
功能:从SO线输出寄存器或EEPROM中的一个字节,高位(MSB)在前
输入参数 :无
调用:	无
返回值:	cha
*************************************************************************/
unsigned char so_byte( void )
{
	unsigned char i,temp;
	unsigned char cha = 0;
	for( i = 0; i < 8; i++ )
	{
		X5045_SCK = 1;
		_nop_();
		X5045_SCK = 0;
		temp = X5045_SO;
		cha = cha | temp;
		if( i <= 6 )
		{	
			cha <<= 1;
		}
	}
	return cha;
}

/*************************************************************************
名称:wip_poll
功能:检测状态寄存器中的WIP位,来查询非易失性写周期是否完成
输入参数 :无
调用:	rdsr_func
返回值:	无
*************************************************************************/
void wip_poll( void )
{
	unsigned char i,temp;
	for( i = 0; i < MAX_POLL; i++)
	{
		temp = rdsr_func();								//读状态寄存器
		if(( temp & 0x01) == 0)							//读状态寄存器的结果与0x01得到WIP位,判是否为0,是则退出	
		{
			i = MAX_POLL;
		}
	}
}

/*************************************************************************
名称:rdsr_func
功能:读出状态寄存器内的内容
输入参数 :无
调用:	si_byte,so_byte
返回值:	temp
*************************************************************************/
unsigned char rdsr_func( void )
{
	unsigned char temp_cmd, temp;
	X5045_SCK = 0;
	X5045_CS = 0;
	temp_cmd = RDSR_cmd;							//送读状态寄存器指令
	si_byte( temp_cmd );
	temp = so_byte(); 							//从状态寄存器得到内容
	X5045_SCK = 0;
	X5045_CS = 1;
	return temp;
}

/*************************************************************************
名称:wrsr_func
功能:设置状态寄存器中的WD1,WD0,BP1,BP0
输入参数 :cha
调用:	si_byte,wip_poll,set_wren,set_wrdi
返回值:	无
*************************************************************************/
void wrsr_func( unsigned char cha_time, unsigned char cha_eepprt )
{
	unsigned char temp, temp_cmd;
	set_wren();								//写使能打开,允许写
	X5045_SCK = 0;
	X5045_CS = 0;
	temp_cmd = WRSR_cmd;						//送写状态寄存器指令
	si_byte( temp_cmd );
	temp = cha_time + cha_eepprt;						//设置看门狗定时时间
	si_byte( temp );
	//temp = cha_eepprt;						//设置EEPROM内保护区
	//si_byte( temp );
	_nop_();
	X5045_SCK = 0;
	X5045_CS = 1;
	wip_poll();								//等等写完成
	set_wrdi();								//禁止写功能
}

/*************************************************************************
名称:set_wren
功能:允许向EEPROM存储器或状态寄存器写入数据
输入参数 :无
调用:	si_byte
返回值:	无
*************************************************************************/
void set_wren( void )
{
	unsigned char temp_cmd;
	X5045_SCK =  0;
	X5045_CS = 0;
	temp_cmd = WREN_cmd; 					//送入写允许指令
	si_byte( temp_cmd );
	_nop_();
	X5045_SCK = 0;
	X5045_CS = 1;
}

/*************************************************************************
名称:set_wrdi
功能:禁止向EEPROM存储器或状态寄存器写入数据
输入参数 :无
调用:	si_byte
返回值:	无
*************************************************************************/
void set_wrdi( void )
{
	unsigned char temp_cmd;
	X5045_SCK =  0;
	X5045_CS = 0;
	temp_cmd = WRDI_cmd; 					//送入写禁止指令
	si_byte( temp_cmd );
	_nop_();
	X5045_SCK = 0;
	X5045_CS = 1;
}

/*************************************************************************
名称:read_eeprom
功能:从EEPROM存储器中读出指定地址内的内容
输入参数 :无
调用:	SI_BYTE,SO_BYTE
返回值:	cha
*************************************************************************/
unsigned char read_eeprom( unsigned int add )
{
	unsigned char cha, temp_cmd, temp_add;
	X5045_SCK = 0;
	X5045_CS = 0;
	if( add > 0xff)
	{
		temp_cmd = RDDA_cmd | 0x08;				//合成带高位地址的读eeprom指令
	}
	else
	{
		temp_cmd = RDDA_cmd;
	}
	si_byte( temp_cmd );						//送读EEPROM指令
	temp_add = add & 0xff ;						//得到低8位地址
	si_byte( temp_add );						//送低8位地址
	cha = so_byte();						//读出指定地址中的内容
	X5045_SCK = 0;
	X5045_CS = 1;
	return cha;
}

/*************************************************************************
名称:write_eeprom
功能:将数据写入EEPROM的指定地址中
输入参数 :cha,add
调用:	SI_BYTE,wip_poll,set_wren
返回值:	无
*************************************************************************/
void write_eeprom( unsigned char cha, unsigned int add )
{
	unsigned char temp_add, temp_cmd;
	set_wren();
	X5045_SCK = 0;
	X5045_CS = 0;	
	if( add > 0xff)
	{
		temp_cmd = WRDA_cmd | 0x08;			//合成带高位地址的写EEPROM指令
	}
	else
	{
		temp_cmd = WRDA_cmd;
	}
	si_byte( temp_cmd );					//送写EEPROM指令
	temp_add =  add & 0xff ;			//得到低8位地址
	si_byte( temp_add );					//送要写数据的地址
	si_byte( cha );							//把数据写到指定地址中
	X5045_SCK = 0;
	X5045_CS = 1;
	wip_poll();
	set_wrdi();
}

/*************************************************************************
名称:x5045_init
功能:初始化X5045,对X5045的定时时间,EEPROM保护区等进行设置
参数:无
调用:wrsr_func
返回:无
*************************************************************************/
void x5045_init( void )
{
	set_wren();					//允许写操作
	wip_poll( );				//查询X5045是否有写操作
	set_wrdi();					//禁止写操作
	wrsr_func( WDTDis, EEP_NPr );			//关看门狗定时器,不保护EEPROM
	wip_poll( );				//查询写操作是否完成
}

//打开看门狗
void open_wdog( void )
{
	wrsr_func( WDT600ms, EEP_NPr );				//开看门狗,定时时间600ms,不保护EEPROM
	wip_poll( );
}

//关看门狗
void close_wdog( void )
{
	wrsr_func( WDTDis, EEP_NPr );				//关看门狗,关定时器,不保护
	wip_poll( );
}
						

⌨️ 快捷键说明

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