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

📄 flash.c.bak

📁 这是我在我们公司做的C51加油单片机程序
💻 BAK
字号:
#include "D:\comm_d\flash.h"
#include "D:\comm_d\flash_pub.h"




void init_spi(void)
{
   CS=1;
   SCK=1;
   MOSI=1;
    MISO=1;
}


void spi_send_uint(unsigned char dat)
{
   idata unsigned int i;
   for(i = 0; i < 8; i ++){

      if(dat >= 0x80)
      {   MOSI = 1;
     }          //修改
      else
         MOSI = 0;
      SCK = 0;
      _nop_();
      _nop_();
      _nop_();
      SCK = 1;
      dat <<= 1;
   }
}

unsigned int get_unsigned(void)
{
   idata unsigned int i;
   idata unsigned int result = 0;

   for(i = 0; i < 8; i ++){
      result <<= 1;
      SCK = 0;
      _nop_();
      _nop_();          //修改
      _nop_();
      SCK = 1;
      _nop_();
      _nop_();          //修改
      _nop_();
      if(MISO == 0)
         result |= 0;
      else
         result |= 1;
   }
   return result;
}
unsigned char read_status(void)
{
   idata unsigned int result;
   CS = 0;
   spi_send_uint(CMD_READ_STATUS);
   result = get_uint();
   CS = 1;
   return result;
}

unsigned char wait_ready(void)
{
   unsigned int status;
   do{
      status = read_status();
   }
   while((status & 0x80) == 0); /* If flash is busy */
   return status;
}

void send_cmd32(unsigned long cmd32)
{
   unsigned int cmd8;

   cmd8 = (unsigned int)(cmd32 >> 24);
   spi_send_uint(cmd8);

   cmd8 = (unsigned int)(cmd32 >> 16);
   spi_send_uint(cmd8);

   cmd8 = (unsigned int)(cmd32 >> 8);
   spi_send_uint(cmd8);

   cmd8 = (unsigned int)cmd32;
   spi_send_uint(cmd8);
}



bit we_buf(unsigned int buf_no, unsigned int xdata *src, unsigned int BFA, unsigned int n)
{
   unsigned long cmd32;
   unsigned int i;
   unsigned int xdata *temp;

   switch(buf_no){
      case BUFFER1:
         cmd32 = CMD_WE_BUF1;
         break;

      case BUFFER2:
         cmd32 = CMD_WE_BUF2;
         break;

      default:
         return 0;
   }
   cmd32 |= BFA;
   temp = src;

   CS = 0;
   send_cmd32(cmd32);
   for(i = 0; i < n; i ++){
      spi_send_uint(*temp++);
      //temp ++;
   }
   CS = 1;
   return 1;
}




bit we_buf_main_del(unsigned int buf_no, unsigned int PA)
{
   unsigned long cmd32;
   cmd32 = ((unsigned long)PA) << 9;
   switch(buf_no){
      case BUFFER1:
         cmd32 |= CMD_WE_BUF1_MAIN_DEL;
         break;

      case BUFFER2:
         cmd32 |= CMD_WE_BUF2_MAIN_DEL;
         break;

      default:
         return 0;
   }
   CS = 0;
   send_cmd32(cmd32);
   CS = 1; /* Begin transfer from now */
   wait_ready();
   return 1;
}
/*

名称:read_main

功能:读AT45D021函数,指定页、指定起始字节及字节数,送到RAM指定地址中;

入口参数:PA:AT45D021主存储器页地址。

          BA:页内起始字节。

		  dest:RAM区存放数据地址。

		  n :读取字节数

  */
unsigned int at45d021_rd(unsigned int *rdbuf,unsigned int size,unsigned int pa,unsigned int ba)
{
   unsigned long cmd32;
   unsigned int i;
   unsigned int xdata *gg;
   gg=rdbuf;
   cmd32 = ((unsigned long)pa) << 9;
   cmd32 |= (unsigned long)ba;
   cmd32 |= CMD_READ_MAIN;

   CS = 0;
   send_cmd32(cmd32);
   send_cmd32(0L);
   for(i = 0; i < size; i ++){
      *gg++ = get_uint();
       //gg++;
   }
   CS = 1;
   //return 1;
}

/*

名称:we_main

功能:写AT45D021函数,指定RAM源数据地址、主存页、起始字节及字节数。
      将RAM区数据写入AT45D021中

入口参数:PA:AT45D021主存储器页地址。

          BA:页内起始字节。

		  src:RAM区存放数据地址。

		  n :写入字节数

  */
unsigned int at45d021_wr(unsigned int *wrbuf,unsigned int size,unsigned int pa,unsigned int ba)
{
   we_buf(BUFFER1, wrbuf, ba, size);
   we_buf_main_del(BUFFER1, pa);
   wait_ready();
   //return 1;
}

⌨️ 快捷键说明

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