📄 x5045.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 + -