您现在的位置是:首页 > 单片机

x5045 c程序-x5045读写程序-x5045c驱动程序

2020-01-26 02:15:15

x5045 c程序

//X5045.H

#ifndef X5045_h
#define X5045_h


#define WDT1_4  0x00;
#define WDT600  0x10;
#define WDT200  0x20;
#define WDTDIS  0x30;

//BIT
sbit B_CS5045=P2^0;
sbit B_SO5045=P2^1;
sbit B_SCLK5045=P2^3;
sbit B_SI5045=P2^2;

extern unsigned char data tcX5045;

void RstWDT(void);
void WrB5045(unsigned char,unsigned char) reentrant;      //写入单字节数据
unsigned char RdB5045(unsigned char);           //读出单字节数据
void byteout(unsigned char);                    //向5045输出单字节
void wip_chk(void);                             //等待5045结束内部写周期
unsigned char rdsr(void);                       //5045状态寄存器读出程序
unsigned char bytein(void);                     //从5045读出一字节数据
unsigned char readx(void);                      //读地址,地址位于100h
void wrsr(unsigned char);                       //5045状态寄存器写入程序
void wren(void);                                //写允许
void wrdi(void);                                //写禁止

#endif

/*
X5045/3 读写驱动
*/

#include <reg51.h>
#include "X5045.h"

//复位看门狗
void RstWDT()
{
    B_CS5045=0;
    B_CS5045=1;
}

//向X5045写入单字节数据
//输入:x,待写数据,address,写入数据的地址
void WrB5045(unsigned char x,unsigned char address) reentrant //数据,地址
{
        wren();
        B_SCLK5045=0;
        B_CS5045=0;
        byteout(0x2); //write
        byteout(address);
        byteout(x);
        B_SCLK5045=0;
        B_CS5045=1;
        wip_chk();
        wrdi();
}

//从X5045读入单字节数据
//输入:address,待读数据地址
//返回:读出的数据
unsigned char RdB5045(unsigned char address)
{
        unsigned char data x;
        B_SCLK5045=0;
        B_CS5045=0;
        byteout(0x3);  //read 000h
        byteout(address);
        x=bytein();
        B_SCLK5045=0;
        B_CS5045=1;
        return (x);
}

//向X5045输出单字节
void byteout(unsigned char x)
{
    unsigned char data i,j;
    j=128;
    for(i=0;i<8;i++)
    {
        B_SCLK5045=0;
        B_SI5045=x/j;
        B_SCLK5045=1;
        x%=j;
        j/=2;
    }
    B_SI5045=0;
}

//等待X5045结束内部写周期
void wip_chk()
{
    unsigned char data dat;
    tcX5045=0;
 do
    {
        dat=rdsr();
        dat&=0x1;
        if(tcX5045>=5) break;
    }
    while(dat);
}

//5045状态寄存器读出程序
unsigned char rdsr()
{
    unsigned char data dat;
 B_SCLK5045=0;
    B_CS5045=0;
    byteout(5);
 dat=bytein();
 B_SCLK5045=0;
 B_CS5045=1;
 return (dat);
}

//从X5045读出一字节数据
unsigned char bytein()
{
    unsigned char data i,x;
    x=0;
    for (i=0;i<8;i++)
    {
        B_SO5045=1;
        B_SCLK5045=1;
        B_SCLK5045=0;
        if (B_SO5045) x=x+x+1;
        else x<<=1;
    }
    return(x);
}

//5045状态寄存器写入程序
void wrsr(unsigned char x)
{
    wren();
 B_SCLK5045=0;
 B_CS5045=0;
 byteout(1);   //wrsr
 byteout(x);
 B_SCLK5045=0;
 B_CS5045=1;
 wip_chk();
    wrdi();
}

//写允许
void wren()
{
 B_SCLK5045=0;
 B_CS5045=0;
 byteout(6);
 B_SCLK5045=0;
 B_CS5045=1;
}

//写禁止
void wrdi()
{
 B_SCLK5045=0;
 B_CS5045=0;
    byteout(4);
    B_SCLK5045=0;
 B_CS5045=1;
}

x5045c驱动程序

//*******************X5045 DRIVE**************************
 //X5045.H
 //#include <absacc.h>
 //#include <intrins.h> 
 #include <reg52.h>
 #define  byte   unsigned char
 #define  N_NOP _nop_();//_nop_();_nop_();_nop_();_nop_();
 //////////////////////////////////////////////////////////////////
 //x5045
  //////////////////////////////////////////////////////////////////
 //DEFINE

 #define  WRSR_INIT 0X01 //写状态寄存器指令;
 #define  WRITE_INIT 0X02 //写数据指令;
 #define  READ_INIT 0X03 //读数据指令;
 #define  WRDI_INIT 0X04 //禁止写操作指令;
 #define  RDSR_INIT 0X05 //读状态寄存器指令;
 #define  WREN_INIT 0X06 //允许写操作指令;
 #define  WAIT_TIMES 200  //等待时间常数;

 sbit  SO     =P2^4;
 sbit  SI     =P2^5;
 sbit  SCK     =P2^6;
 sbit  CS     =P2^7;

 /////////////////////////////////////////////////////////////////
 //函数声明;PROPERTY
 void  wren_cmd(void);   //允许写操作指令函数;
 void  write(byte dt);   //写一个字节数据函数;
 byte  read(void);    //读一个字节数据函数;
 byte  read_state(void);  //读状态控制字函数;
 void  write_state(byte dt); //写状态控制字函数;
 void  read_nbyte( bit bA8, //读n个字节数据函数;
      byte adr_L,
      byte n,
      byte *adr);
 void  write_nbyte(bit bA8, //写n个字节数据函数;
      byte adr_L,
      byte n,
      byte *adr);
 void  wait_end(byte run_TImes);//等待函数;
 /////////////////////////////////////////////////////////////////
 //函数定义;
 //FOUNCTION
 //enable before write data to x5045;

 void wren_cmd(void)
 {//向X5045写入允许写操作指令字;
 
  CS=1;
  SCK=0;
  CS=0;
  write(WREN_INIT);
  CS=1;
  SCK=0;
 }

 //make clk for send data
 void write(byte dt)
 {//向X5045写入一个字节数据

  register byte i;
  for(i=0;i<8;i++)
  {  

   SCK=0;
          //N_NOP;                                                     

                                                                             

                     
   SI=(bit)(dt & 0x80);//_|-
   SCK=1;
          //N_NOP;                                                     

                                                                             

                     
     dt=dt<<1;
  }
  SI=0;
 }

 //make clk for receive data
 byte read(void)
 {//从X5045读一个字节数据;

  register byte i;
  register byte dt=0;
  SO=1;
  for(i=0;i<8;i++)
  {
   SCK=1;
          //N_NOP;                                                     

                                                                             

                     
   SCK=0;
          //N_NOP;                                                     

                                                                             

                     
   dt=dt<<1;
   if(SO)dt++;
  }
  return dt;
 }

 //---------------------------------------
 //X5045状态控制字:      |
 //BIT: 7 6 5 4 3 2 1 0 

|
 //      x   x   WD1 WD0 BL1 BL0 WEL WIP |
 //WIP:0---正在写操作;     |
 //   1---写操作完成;     |
 //WEL:0---写使能锁存器复位;    |
 //    1---写使能锁存器置位;    |
 //BL1 BL0:        

|
 //   00--不保护;      |
 //   01--保护:01H--180H--1FFH;   |
 //    10--保护:100H--1FFH;    |
 //    11--保护:000H--1FFH;    |
 //WD1 WD0:        

|
 //   00--1.4秒;      |
 //   01--600毫秒;      |
 //    10--200毫秒;      |
 //    11--禁止看门狗;     | 
 //---------------------------------------
 //read state word from x5045;
 byte read_state(void)
 {//从X5045读状态控制字;

  register byte dt;
  wren_cmd();
  CS=1;
  SCK=0;
  CS=0;
  write(RDSR_INIT);
  dt=read();
  SCK=0;
  CS=1;
  return dt;
 }

 //write state word to x5045 before do somthing;
 void write_state(byte dt)
 {//向X5045写状态控制字;

  wren_cmd();
  CS=1;
  SCK=0;
  CS=0;
  write(WRSR_INIT);
  write(dt);
  SCK=0;
  CS=1;
  wait_end(WAIT_TIMES);
 }

 //read n bytes from x5045;
 void read_nbyte(bit bA8,//选择EPROM上半部分/下半部分
                        byte adr_L,//从EPROM中什么地址开始读;
                        byte n, //要读的字节数;
                        byte *adr)//所读的数据从什么地址开始存放;
 {//从X5045读n个字节数据;

  register byte  i ;
  
  CS=1;
  SCK=0;
  CS=0;
  write(bA8?READ_INIT | 0x08 : READ_INIT);
  write(adr_L);
  for(i=0;i<n;i++)
  {
   *adr=read();
   adr++;
  }
  SCK=0;
  CS=1;

 }

 //write n bytes to x5045;
 void write_nbyte(bit bA8,//选择EPROM上半部分/下半部分;
                         byte adr_L,//从EPROM中什么地址开始写;
                         byte n,//要写的字节数;
                         byte *adr)//从什么地址开始取数据写;
 {//向X5045写n个字节数据;

  register byte  i ;
  EA=0;
  wren_cmd();
  CS=1;
  SCK=0;
  CS=0;
  write(bA8?WRITE_INIT | 0x08 : WRITE_INIT); 
  write(adr_L);
  for(i=0;i<n;i++)
  {
   write(*adr);
   adr++;
  }
  SCK=0;
  CS=1;
  wait_end(WAIT_TIMES);
  EA=1;
 }

 // wait for be sure to complete
 void wait_end(byte run_times)
 {////等待向X5045写操作完成;
  register byte dt=0;
  while(run_times--)
  {
   dt=read_state();
   if(dt&0x01==0)break;
  }
 }
 //////////////////////////////////////////////////////////////////