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

📄 x4045.c

📁 x5045接口程序,C51,X5045是带4Kb SPI EEPROM的CPU监控器(看门狗和电源监控)
💻 C
字号:
/*
   x5045接口程序

*/
#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int

 // IO口定义
sbit SDI    = P3^0;  //X5045的数据输入线
sbit SDO    = P3^1;  //X5045的数据输出线
sbit CSWDT  = P3^2;  //X5045的片选和看门狗
sbit SCLK   = P3^3;  //X5045的时钟线


void clrwdt()  //清看门狗
{
    CSWDT=0;
    CSWDT=1;
}



void wr1byte5045(uchar indata) // 向5045写入1字节(MSB在前,即左移)
{ //in:indata-数据    
  uchar xi;
   for(xi = 0; xi < 8; xi++)
    { SCLK = 0;
       
      if(indata & 0x80) SDI = 1;
      else SDI = 0;
      indata = indata << 1;
       
      SCLK = 1;
       
    }
}

uchar rd1byte5045()  //从5045的当前地址读1字节
{           
  uchar xi,xad = 0;
   SDO = 1;
   for(xi = 0; xi < 8; xi++)
    { SCLK = 1;
       xad = xad * 2;
      SCLK = 0;
      if(SDO) xad++;
    }
  return xad;
}

void write_WREN5045() //写使能命令(06h)
{ CSWDT = 0;
  wr1byte5045(0x06);
  SCLK = 0;
  clrwdt();
}
void write_WRDI5045()//关闭写使能命令(04h)
{ CSWDT = 0;
  wr1byte5045(0x04);
  SCLK = 0;
  clrwdt();
}
uchar read_status5045() //读5045状态寄存器(05h)
{ uchar xd;
  CSWDT = 0;
  wr1byte5045(0x05);
  xd = rd1byte5045();
  clrwdt();
  return xd;
}
void write_status5045(uchar indata)//写5045状态寄存器(01h)
//                   ;in:indata-写入状态寄存器的数据
{ write_WREN5045();
  CSWDT = 0;
  wr1byte5045(0x01);
  wr1byte5045(indata);
  clrwdt();
}

void read5045(uint addr,uchar len,uchar *p)   //读取5045的flash数据区的数据
             //;in: addr-数据地址,范围为0x00~0x1ff
             //     len -读取的数据长度
             //out: *p - 读出数据的地址指针
{ uchar xi;
  CSWDT = 0;
   wr1byte5045(((addr >> 5) & 0x08) | 0x03);   //地址高1位(bit3)与读命令(0x03)合为一字节
   wr1byte5045(addr & 0xff); //地址低8位
  for(xi = 0; xi < len; xi++)
   {p[xi] = rd1byte5045();}
  CSWDT = 1;
}

void write5045(uchar addr,uchar len,uchar *p)  //写一组数据到5045的数据区,一次最多写入16字节(1页))
             //;in: addr-数据地址,范围为0x00~0x1ff
             //     len -读取的数据长度
             //     *p  - 数据组
{uchar xi;
 if(len > 16) len = 16;
  write_WREN5045();
 CSWDT = 0;
   wr1byte5045(((addr >> 5) & 0x08) | 0x02);   //地址高1位(bit3)与写命令(0x02)合为一字节
   wr1byte5045(addr & 0xff); //地址低8位
  for(xi = 0; xi < len; xi++) wr1byte5045(p[xi]);
   SCLK = 0;
   clrwdt();
   write_WRDI5045();
  delay_n(0x4000);
}

⌨️ 快捷键说明

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