📄 amdflash.c
字号:
/*********************************************************************
(c) copyright Extell Company 2001
ALL RIGHTS RESERVED
*********************************************************************
ESR-700 Demonstration Program for Voice Recognition Application
*********************************************************************
File: AMDflash.c
Project: ESR-700 demo program for Voice Recognition Application
Description: AMD flash memory Fuctions
Date: Sep. 2001
********************************************************************/
#include "main.h"
#include "extell51.h"
#define UNLOCK1_OFFSET 0x0555
#define UNLOCK2_OFFSET 0x02aa
#define COMMAND_OFFSET 0x0555
#define FLASH_CMD_UNLOCK1 0xAA
#define FLASH_CMD_UNLOCK2 0x55
#define FLASH_CMD_READ_RESET 0xF0
#define FLASH_CMD_AUTOSELECT 0x90
#define FLASH_CMD_BYTE_PROGRAM 0xA0
#define FLASH_CMD_ERASE_SETUP 0x80
#define FLASH_CMD_CHIP_ERASE 0x10
#define FLASH_CMD_SECTOR_ERASE 0x30
#define FLASH_CMD_ERASE_SUSPEND 0xB0
#define FLASH_CMD_ERASE_RESUME 0x30
#define DQ7 0x80
#define DQ6 0x40
#define DQ5 0x20
void ManuIdSelect(void);
void DeviceIdSelect(void);
void SectorProtectIdSelect(unsigned int SectorAddr);
void FlashWrite(unsigned int addr, unsigned char fdata);
unsigned char FlashWriteConfirm(unsigned int addr, unsigned char fdata);
void UnlockBypass(void);
void UnlockBypassProg(unsigned int addr, unsigned char fdata);
void UnlockBypassReset(void);
unsigned char ChipErase(void);
unsigned char SectorErase(unsigned int SectorAddr);
void EraseSuspend(void);
void EraseResume(void);
void ManuIdSelect(void)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,FLASH_CMD_AUTOSELECT);
write_XDATA(0x0000,0x01);
}
void DeviceIdSelect(void)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,FLASH_CMD_AUTOSELECT);
write_XDATA(0x0001,0x4f);
}
void SectorProtectIdSelect(unsigned int SectorAddr)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,FLASH_CMD_AUTOSELECT);
if(SectorAddr)
write_XDATA(SectorAddr,0x01);
else write_XDATA(0x0002,0x01);
}
void FlashWrite(unsigned int addr, unsigned char fdata)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,FLASH_CMD_BYTE_PROGRAM);
write_XDATA(addr,fdata);
}
unsigned char FlashWriteConfirm(unsigned int addr, unsigned char fdata)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,FLASH_CMD_BYTE_PROGRAM);
write_XDATA(addr,fdata);
while(((read_XDATA(addr)&DQ7) != (fdata&DQ7)) && !(read_XDATA(addr)&DQ5));
if((read_XDATA(addr)&DQ7) == (fdata&DQ7)) return(OK);
else return(ERROR);
}
void UnlockBypass(void)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,0x20);
}
void UnlockBypassProg(unsigned int addr, unsigned char fdata)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(addr,fdata);
}
void UnlockBypassReset(void)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_AUTOSELECT);
write_XDATA(UNLOCK2_OFFSET,0x00);
}
unsigned char ChipErase(void)
{
unsigned char data prev,next;
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,FLASH_CMD_ERASE_SETUP);
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,FLASH_CMD_CHIP_ERASE);
prev = read_XDATA(0);
next= read_XDATA(0);
while((!(next&DQ7) || !(next&DQ5)) || ((prev&DQ5)!= (next&DQ5)))
{
prev = read_XDATA(0);
next= read_XDATA(0);
}
next= read_XDATA(0);
if(next&DQ7) return(OK);
else return(ERROR);
}
unsigned char SectorErase(unsigned int SectorAddr)
{
unsigned char data prev,next;
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(COMMAND_OFFSET,FLASH_CMD_ERASE_SETUP);
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_UNLOCK1);
write_XDATA(UNLOCK2_OFFSET,FLASH_CMD_UNLOCK2);
write_XDATA(SectorAddr,FLASH_CMD_SECTOR_ERASE);
prev = read_XDATA(0);
next= read_XDATA(0);
while((!(next&DQ7) || !(next&DQ5)) || ((prev&DQ5)!= (next&DQ5)))
{
prev = read_XDATA(0);
next= read_XDATA(0);
}
next= read_XDATA(0);
if(next&DQ7) return(OK);
else return(ERROR);
}
void EraseSuspend(void)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_ERASE_SUSPEND);
}
void EraseResume(void)
{
write_XDATA(UNLOCK1_OFFSET,FLASH_CMD_ERASE_RESUME);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -