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

📄 mx25l1602drv.c

📁 LPC1114_例程和教程
💻 C
📖 第 1 页 / 共 2 页
字号:
  Send_Byte(0);                                                         /* 清0BPx位,使Flash芯片全区可写*/
  CE_High();

  for(i = 0; i < NByte; i++) {
    CE_Low();
    Send_Byte(0x06);                                                    /* 发送写使能命令               */
    CE_High();

    CE_Low();
    Send_Byte(0x02);                                                    /* 发送字节数据烧写命令         */
    Send_Byte((((Dst+i) & 0xFFFFFF) >> 16));                            /* 发送3个字节的地址信息        */
    Send_Byte((((Dst+i) & 0xFFFF) >> 8));
    Send_Byte((Dst+i) & 0xFF);
    Send_Byte(SndbufPt[i]);                                             /* 发送被烧写的数据             */
    CE_High();

    do {
      CE_Low();
      Send_Byte(0x05);                                                  /* 发送读状态寄存器命令         */
      StatRgVal = Get_Byte();                                           /* 保存读得的状态寄存器值       */
      CE_High();
    } while (StatRgVal == 0x03);                                        /* 一直等待,直到芯片空闲       */
  }

  CE_Low();
  Send_Byte(0x06);                                                      /* 发送写使能命令               */
  CE_High();

  CE_Low();
  Send_Byte(0x50);                                                      /* 使状态寄存器可写             */
  CE_High();
  CE_Low();
  Send_Byte(0x01);                                                      /* 发送写状态寄存器指令         */
  Send_Byte(temp);                                                      /* 恢复状态寄存器设置信息       */
  CE_High();

  return (OK);
}

/*********************************************************************************************************
** 函数名称:MX25L1602_Erase
** 函数功能:根据指定的扇区号选取最高效的算法擦除
** 输入参数:
**          INT32U sec1:起始扇区号,范围(0~499)
**          INT32U sec2:终止扇区号,范围(0~499)
** 输出参数:操作成功则返回OK,失败则返回ERROR
*********************************************************************************************************/
INT8U MX25L1602_Erase(INT32U sec1, INT32U sec2)
{
  INT8U  temp1 = 0,temp2 = 0,StatRgVal = 0;
  INT32U SecnHdAddr = 0;
  INT32U no_SecsToEr = 0;                                               /* 要擦除的扇区数目             */
  INT32U CurSecToEr = 0;                                                /* 当前要擦除的扇区号           */

  /*
   *  检查入口参数
   */
  if ((sec1 > SEC_MAX)||(sec2 > SEC_MAX)) {
    return (ERROR);
  }

  CE_Low();
  Send_Byte(0x05);                                                     /* 发送读状态寄存器命令          */
  temp1 = Get_Byte();                                                  /* 保存读得的状态寄存器值        */
  CE_High();

  CE_Low();
  Send_Byte(0x50);                                                     /* 使状态寄存器可写              */
  CE_High();

  CE_Low();
  Send_Byte(0x01);                                                     /* 发送写状态寄存器指令          */
  Send_Byte(0);                                                        /* 清0BPx位,使Flash芯片全区可写 */
  CE_High();

  CE_Low();
  Send_Byte(0x06);                                                      /* 发送写使能命令               */
  CE_High();

  /*
   * 如果用户输入的起始扇区号大于终止扇区号,则在内部作出调整
   */
  if (sec1 > sec2)
  {
    temp2 = sec1;
    sec1  = sec2;
    sec2  = temp2;
  }
  /*
   * 若起止扇区号相等则擦除单个扇区
   */
  if (sec1 == sec2)
  {
    SecnHdAddr = SEC_SIZE * sec1;                                       /* 计算扇区的起始地址           */
    CE_Low();
    Send_Byte(0x20);                                                    /* 发送扇区擦除指令             */
    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16));                         /* 发送3个字节的地址信息        */
    Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
    Send_Byte(SecnHdAddr & 0xFF);
    CE_High();
    do {
      CE_Low();
      Send_Byte(0x05);                                                  /* 发送读状态寄存器命令        */
      StatRgVal = Get_Byte();                                           /* 保存读得的状态寄存器值      */
      CE_High();
    } while (StatRgVal & 0x01);                                         /* 一直等待,直到芯片空闲      */
    return (OK);
  }

  /*
   * 根据起始扇区和终止扇区间距调用最快速的擦除功能
   */

  if (sec2 - sec1 == SEC_MAX) {
    CE_Low();
    Send_Byte(0x60);                                                    /* 发送芯片擦除指令(60h or C7h) */
    CE_High();
    do {
      CE_Low();
      Send_Byte(0x05);                                                  /* 发送读状态寄存器命令         */
      StatRgVal = Get_Byte();                                           /* 保存读得的状态寄存器值       */
      CE_High();
    } while (StatRgVal & 0x01);                                         /* 一直等待,直到芯片空闲       */
    return (OK);
  }

  no_SecsToEr = sec2 - sec1 +1;                                         /* 获取要擦除的扇区数目         */
  CurSecToEr  = sec1;                                                   /* 从起始扇区开始擦除           */

  /*
   * 若两个扇区之间的间隔够大,则采取16扇区擦除算法
   */
  while (no_SecsToEr >= 16)
  {
    CE_Low();
    Send_Byte(0x06);                                                     /* 发送允许写命令              */
    CE_High();

    SecnHdAddr = SEC_SIZE * CurSecToEr;                                  /* 计算扇区的起始地址          */
    CE_Low();
    Send_Byte(0xD8);                                                     /* 发送64KB块擦除指令          */
    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16));                          /* 发送3个字节的地址信息       */
    Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
    Send_Byte(SecnHdAddr & 0xFF);
    CE_High();
    do {
      CE_Low();
      Send_Byte(0x05);                                                  /* 发送读状态寄存器命令        */
      StatRgVal = Get_Byte();                                           /* 保存读得的状态寄存器值      */
      CE_High();
    } while (StatRgVal & 0x01);                                         /* 一直等待,直到芯片空闲      */
    CurSecToEr  += 16;                                                  /* 计算擦除了16个扇区后和擦除区*/
                                                                        /* 域相邻的待擦除扇区号        */
    no_SecsToEr -=  16;                                                 /* 对需擦除的扇区总数作出调整  */
  }

  /*
   * 采用扇区擦除算法擦除剩余的扇区
   */
  while (no_SecsToEr >= 1) {
    CE_Low();
    Send_Byte(0x06);                                                   /* 发送允许写命令              */
    CE_High();

    SecnHdAddr = SEC_SIZE * CurSecToEr;                                /* 计算扇区的起始地址          */
    CE_Low();
    Send_Byte(0x20);                                                   /* 发送扇区擦除指令            */
    Send_Byte(((SecnHdAddr & 0xFFFFFF) >> 16));                        /* 发送3个字节的地址信息       */
    Send_Byte(((SecnHdAddr & 0xFFFF) >> 8));
    Send_Byte(SecnHdAddr & 0xFF);
    CE_High();
    do {
      CE_Low();
      Send_Byte(0x05);                                                 /* 发送读状态寄存器命令        */
      StatRgVal = Get_Byte();                                          /* 保存读得的状态寄存器值      */
      CE_High();
    } while (StatRgVal & 0x01 );                                       /* 一直等待,直到芯片空闲      */
    CurSecToEr  += 1;
    no_SecsToEr -=  1;
  }
  /*
   * 擦除结束,恢复状态寄存器信息
   */
  CE_Low();
  Send_Byte(0x06);                                                    /* 发送写使能命令               */
  CE_High();

  CE_Low();
  Send_Byte(0x50);                                                    /* 使状态寄存器可写             */
  CE_High();
  CE_Low();
  Send_Byte(0x01);                                                    /* 发送写状态寄存器指令         */
  Send_Byte(temp1);                                                   /* 恢复状态寄存器设置信息       */
  CE_High();
  return (OK);
}

/*********************************************************************************************************
** End Of File
*********************************************************************************************************/

⌨️ 快捷键说明

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