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

📄 c5045.c

📁 本程序是读写x5045复位芯片的源程序
💻 C
字号:
/*5045的底层操作程序*/

#include <stdio.h>
#include <intrins.h>
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int  uint;

#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^2;                /*时钟*/
sbit SI		= P1^3;                 /*CPU--->5045*/
sbit SO		= P1^1;                 /*5045-->CPU*/
sbit CS		= P1^0;                 /*片选*/

/*
extern uchar Byte_Read(uint e2_add);
extern void  Byte_Write(uint e2_add,uchar a);
extern void  Page_Write_FromIdata(uint e2_add,uchar idata *pt);
extern void  Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uint data_amount);
extern void  Wrdi_Cmd(void);
extern void  Wrsr_Cmd(uchar control_Byte);
static uchar InByte(void);
static void  OutByte(uchar ch);
static void  Pre_Read(uint c1);
static uchar Rdsr_cmd(void);
static void  Pre_Write(uint c1);
static void  Wip_Poll(void);
static void  Wren_Cmd(void);
*/
/*******************************************/
/*输出一个字节							   */
/*入口:一个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();                /*等待写入操作完成*/
}
/*****************************************/
/*写入1页,数据来源:内部的RAM*/
/*入口:5045的地址,指向内部RAM的指针*/
/*出口:无*/
/*****************************************/
//extern void  Page_Write_FromIdata(uint e2_add,uchar idata *pt)
//{
//        uchar i;
//        Pre_Write(e2_add);         /*预写*/
//        for (i=16;i>0;--i,pt++)    /*连续写入16字节(5045一页为16字节)*/
//              OutByte(*pt);
//        SCK=0;
//        CS=1;
//        Wip_Poll();                /*等待写入操作完成*/
//}
/*****************************************/
/*写入1页,数据来源:外部的RAM*/
/*入口:5045的地址,指向外部RAM的指针*/
/*出口:无*/
/*****************************************/

/*extern void  Page_Write_FromXdata(uint e2_add,uchar xdata *pt)
{
        uchar i;
        Pre_Write(e2_add);        /*预写*/
/*        for (i=16;i>0;--i,pt++)   /*连续写入16字节(5045一页为16字节)*/
/*              OutByte(*pt);
        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);
}
/*****************************************/
/*从5045连续读取数据.数据存放:内部的RAM*/
/*入口:5045的地址,指向内部RAM的指针,数据的个数*/
/*出口:无*/
/*****************************************/
//extern void Sequ_Read_ToIdata(uint e2_add,uchar idata *pt,uint data_amount)
//{
//        uint i;
//        Pre_Read(e2_add);                       /*预读取*/
//        for (i=data_amount;i>0;--i,pt++)
//             *pt=InByte();                      /*读出数据*/
//        SCK=0;
//        CS=1;
//}
/*****************************************/
/*从5045连续读取数据.数据存放:外部的RAM*/
/*入口:5045的地址,指向外部RAM的指针,数据的个数*/
/*出口:无*/
/*****************************************/
/*extern void Sequ_Read_ToXdata(uint e2_add,uchar xdata *pt,uchar data_amount)
{
        uchar i;
        Pre_Read(e2_add);
        for (i=data_amount;i>0;--i,pt++)
             *pt=InByte();
        SCK=0;
        CS=1;
}
/*****************************************/

⌨️ 快捷键说明

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