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

📄 amdflash.c

📁 DownLoad_sst39sf010.zip--嵌入式系统中关于SST39SF010的FLASH的BOOTLOADER源程序(KC51)
💻 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 + -