#define WREN_INST 0x06 //写使能控制字 Write enable latch instruction (WREN)
#define WRDI_INST 0x04 //写禁能控制字 Write disable latch instruction (WRDI)
#define WRSR_INST 0x01 //写状态寄存器控制字 Write status register instruction (WRSR)
#define RDSR_INST 0x05 //读状态寄存器控制字 Read status register instruction (RDSR)
#define WRITE_INST 0x02 //写存储器控制字 Write memory instruction (WRITE)
#define READ_INST 0x03 //读存储器控制字 Read memory instruction (READ)
#define MAX_POLL 0x99 //最大查询周期控制字 Maximum number of polls
#define WDT020 0x20 //看门狗超时周期200ms
#define WDT060 0x10 //看门狗超时周期600ms
#define WDT140 0x00 //看门狗超时周期1400ms
#define WDT000 0x30 //关闭看门狗
#define BP0 0x00 //没有保护的空间
#define BP1 0x40 //保护0180--01ff
#define BP2 0x80 //保护0100--01ff
#define BP3 0xc0 //保护0000--01ff
//******************************************
//定义对5045的操作方式
#define CONTROL1 WDT000|BP0 //实际控制值一(关闭看门狗 没有保护的空间)
#define CONTROL2 WDT140|BP3 //实际控制值二(看门狗超时周期1400ms 保护0000--01ff)
#define CONTROL3 WDT140|BP0 //实际控制值三(看门狗超时周期1400ms 没有保护的空间)
//******************************************
//定义管脚
sbit SCK=P1^0; //时钟
sbit SI=P1^1; //CPU---> 5045
sbit SO=P1^5; //5045--> CPU
sbit CS=P1^4; //片选
//******************************************
//***************************************************************************
//5045底层操作程序,外部函数声明
void dog_feed(void);
extern void Wrdi_Cmd(void); //写禁能,在非正常的操作中断后,主程序在初始化时最好执行一次此操作
extern void Wrsr_Cmd(uchar control_Byte); //写状态寄存器
extern void Byte_Write(uint e2_add,uchar a); //写入一字节
extern void Page_Write_FromIdata(uint e2_add,uchar idata *pt); //写入1页,数据来源:内部的RAM
extern void Page_Write_FromXdata(uint e2_add,uchar xdata *pt); //写入1页,数据来源:外部的RAM
extern uchar Byte_Read(uint e2_add); //从5045的指定地址读出1字节
extern void Sequ_Read_ToXdata(uint e2_add,uchar xdata *pt,uint data_amount); //从5045连续读取数据.数据存放:内部的RAM
extern void Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uchar data_amount); //从5045连续读取数据.数据存放:外部的RAM
//***************************************************************************
//******************************************
//输出一个字节
//入口:一个uchar形变量
//出口:无
static void OutByte(uchar ch)
{
uchar i=8;
do
{
SCK=0;
SI=(bit)(ch&0x80); //强制取为位变量,输出
ch=ch < <1; //右移一位
SCK=1;
}
while(--i);
SI=0;
}
//******************************************
//******************************************
//输入一个字节
//入口:没有入口
//出口:一个uchar形变量
static uchar InByte(void)
{
uchar i,a=0;
SO=1;
for (i=8;i> 0;i--)
{
SCK=1;
SCK=0;
a < <=1;
if(SO)
a|=0x01;
}
return(a);
}
//*****************************************
//*****************************************
//读状态寄存器
//入口:无
//出口:寄存器状态
static uchar Rdsr_cmd(void)
{
uchar a;
SCK=0;
CS=0;
OutByte(RDSR_INST); //发出读寄存器命令
a=InByte(); //读入
SCK=0;
CS=1;
return(a);
}
//*****************************************
//*****************************************
//测试写周期是否结束,超时后测试不成功也返回
//入口:无
//出口:无
static void Wip_Poll(void)
{
uchar temp,i=MAX_POLL;
do
{
temp=Rdsr_cmd();
ACC=temp;
if(!(ACC&0x01))
break; //结束后返回
}
while(--i); //超时也返回
}
//*****************************************
//*****************************************
//设置写使能,在执行写入操作之前要先将写使能控制位置位
//入口:无
//出口:无
static void Wren_Cmd(void)
{
SCK=0;
CS=0;
OutByte(WREN_INST);
SCK=0;
CS=1;
}
//*****************************************
//*****************************************
//写禁能,在非正常的操作中断后,主程序在初始化时最好执行一次此操作
//入口:无
//出口:无
extern void Wrdi_Cmd(void)
{
SCK=0;
CS=0;
OutByte(WRDI_INST);
SCK=0;
CS=1;
}
//*****************************************
//*****************************************
//写状态寄存器
//入口:控制字
//出口:无
extern void Wrsr_Cmd(uchar control_Byte)
{
Wren_Cmd();
SCK=0;
CS=0;
OutByte(WRSR_INST);
OutByte(control_Byte);
SCK=0;
CS=1;
Wip_Poll();
}
//*****************************************
//*****************************************
//写入数据之前的预操作
//入口:5045的地址
//出口:无
static void Pre_Write(uint c1)
{
Wren_Cmd();
SCK=0;
CS=0;
OutByte(WRITE_INST|(0x08&((uchar)(c1/256)) < <3)); //将地址的第9位(D9)传送到命令字中,随命令字一起发出
OutByte((uchar)c1); //发送地址的低8位
}
//*****************************************
//*****************************************
//写入一字节
//入口:5045的地址,待写数据
//出口:无
extern void Byte_Write(uint e2_add,uchar a)
{
Pre_Write(e2_add); //预操作
OutByte(a); //发出数据
SCK=0;
CS=1;
Wip_Poll(); //等待写入操作完成
}
//*****************************************
//*****************************************
//读数据之前的预操作
//入口:5045的地址
//出口:无
static void Pre_Read(uint c1)
{
SCK=0;
CS=0;
OutByte(READ_INST|(0x08&((uchar)(c1/256)) < <3)); //将地址的第9位(D9)传送到命令字中,随命令字一起发出
OutByte((uchar)c1); //发送地址的低8位
}
//*****************************************
//*****************************************
//从5045的指定地址读出1字节
//入口:5045的地址
//出口:数据
extern uchar Byte_Read(uint e2_add)
{
uchar a;
Pre_Read(e2_add); //预读取
a=InByte(); //读出数据
SCK=0;
CS=1;
return(a);
}
/*****************************************
void dog_feed(void)
{
CS=1;
CS=0;
CS=1;
}
*/
void main(void)
{
Wrdi_Cmd(); //复位写使能
Wrsr_Cmd(CONTROL3); //设置5045的工作状态
while(1);
}