www.pudn.com > usbcode.rar > NFlash32.c


/*++ 
 
Module Name: 
 
         NFlash32.c 
 
Abstract: 
 
         Header file related to D12 module 
 
Environment: 
 
        ICCAVR 6.29 
 
Revision History: 
 
        04/23/2004      chenchi   created 
 
--*/ 
/******************************************************************/ 
#include "io8515v.h" 
#include "d12.h" 
#include "scsi.h" 
#include "nflash32.h" 
 
unsigned int WriteResidueVal = 0; 
unsigned char Flash_Write_Sec = 0x00; 
unsigned char Flash_Write_Col = 0x00; 
unsigned char Flash_Write_addl = 0x00; 
unsigned char Flash_Write_addh = 0x00; 
unsigned long ReadResidueVal = 0; 
unsigned char Flash_Read_Sec = 0x00; 
unsigned char Flash_Read_Col = 0x00; 
unsigned char Flash_Read_addl = 0x00; 
unsigned char Flash_Read_addh = 0x00; 
 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:块擦除函数 
**函数输入参数及说明: 
  addh:高地址 
  addl:低地址 
 
**函数返回值:无 
**在本函数以外定义的变量:fCOMMAND,fADD,fWPs,fWPc,fRB 
**调用的函数说明:无 
 
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void flashErase(unsigned char addh,unsigned char addl) 
{ 
	unsigned char i=0; 
	fWPs;//打开写保护 
	fCOMMAND = 0x60;//块擦除命令 
	fADD = addl;//低地址 
	fADD = addh;//高地址 
	fCOMMAND = 0xd0;//处理命令 
	asm("nop \n nop"); 
	while(!fRB); 
	fCOMMAND = 0x70;//读状态命令 
	i = fDATA;//读状态值 
	csram; 
	fWPc;//写保护 
	printf("%x,%x erase is %x",addh,addl,i);//串口打印 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:写FLASH预处理函数 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量: 
**调用的函数说明:无 
 
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void flashWritecmd(void) 
{ 
	unsigned char Erase_addh,Erase_addl; 
	unsigned char Sour_addh,Sour_addl,Dest_addh,Dest_addl; 
	unsigned char Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl; 
	unsigned int Erase_Count = 0,i = 0; 
	unsigned int CopyBack_Count = 0; 
	unsigned int CopyBack_two_count = 0; 
	unsigned int WritePageNum = 0; 
	union{ 
		unsigned char c[2]; 
		unsigned int add; 
	}Start_add; 
	union{ 
		unsigned char c[2]; 
		unsigned int add; 
	}End_add; 
	/************说明***************** 
	  对于FLASH的写操作原理是,写之前 
	  必须擦除,FLASH写是按页写,但是擦 
	  除是按块擦除,1块 = 32页,所以在 
	  一块内只有部分页被写入时就需要先 
	  将块内其他页保存,代整块擦除后一起 
	  写入,这里用0XFA,0X00作为头块缓冲, 
	  0XFB,0X00作为最后块缓冲,中间块采 
	  用直接擦除处理 
	**********************************/ 
	flashErase(0xfa, 0x00); 
	Sour_addh = XmtBuff.b[19]; 
	Sour_addl = (XmtBuff.b[20]/0x20) * 0x20; 
	Dest_addh = 0xfa; 
	Dest_addl = (XmtBuff.b[20]/0x20) * 0x20; 
	CopyBack_Count = XmtBuff.b[20]%0x20; 
	for(i=0;i (0x20 - (XmtBuff.b[20] % 0x20))) 
			Erase_Count ++; 
	}else if(XmtBuff.b[20] % 0x20){ 
		Erase_Count ++; 
	} 
	Start_add.add = (XmtBuff.b[19]<<8)+XmtBuff.b[20]; 
	End_add.add = Start_add.add + WritePageNum; 
	flashErase(0xfb, 0x00); 
	Sour_two_addh = End_add.c[1]; 
	Sour_two_addl = End_add.c[0]; 
	Dest_two_addh = 0xfb; 
	Dest_two_addl = End_add.c[0]; 
	CopyBack_two_count = (Erase_Count * 0x20) - CopyBack_Count -WritePageNum; 
	for(i=0;i 0) 
	{ 
		fWPs;//打开写保护 
		fCOMMAND = 0x00;//从FRIST部分开始 
		fCOMMAND = 0x80;//写FLASH命令 
		fADD = 0x00;//从0列开始 
		fADD = Flash_Write_addl;//页地址低位 
		fADD = Flash_Write_addh;//页地址高位 
		 
		for(i=0;i<512;i++) 
		{ 
			fDATA = PageBuff[i];//写数据到FLASH指定页里 
		} 
		 
		fCOMMAND = 0x10; 
		asm("nop \n nop"); 
		while(!fRB); 
		fCOMMAND = 0x70;//读状态值命令 
		i = fDATA;//读状态值 
		D12_COMMAND = 0xf2;//清端点缓冲区 
		csram; 
		fWPc;//写保护 
		 
		WriteResidueVal = WriteResidueVal - 1; 
		if(Flash_Write_addl== 255){ 
			Flash_Write_addl= 0x00; 
			Flash_Write_addh++; 
		}else 
			Flash_Write_addl++; 
	} 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:FLASH页拷贝命令 
**函数输入参数及说明: 
  Source_addh:源地址高位 
  Source_addl:源地址低位 
  Destination_addh:目的地址高位 
  Destination_addl:目的地址低位 
 
**函数返回值:无 
**在本函数以外定义的变量: 
**调用的函数说明:无 
 
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void flashCopyBLack(unsigned char Source_addh,unsigned char Source_addl,unsigned char Destination_addh,unsigned char Destination_addl) 
{ 
	unsigned char i; 
	fWPs;//打开写保护 
	fCOMMAND = 0x00;//页拷贝命令 
        /*源地址*/ 
	fADD = 0x00; 
	fADD = Source_addl; 
	fADD = Source_addh; 
	asm("nop \n nop"); 
	while(!fRB); 
	 
	fCOMMAND = 0x8a;//页拷贝命令 
	/*目的地址*/ 
	fADD = 0x00; 
	fADD = Destination_addl; 
	fADD = Destination_addh; 
	asm("nop \n nop"); 
	while(!fRB); 
	 
	fCOMMAND = 0x70;//读状态命令 
	i = fDATA;//读状态值 
	csram; 
	fWPc;//写保护 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:读FLASH预处理函数 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量: 
**调用的函数说明:无 
 
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void flashReadcmd(void) 
{ 
	/****************说明************ 
	  对于FLASH的读原理为:FLASH的读 
	  可以是随机读取,所以这里只要给 
	  定读数据的首地址和读写长度 
	********************************/ 
	Flash_Read_Sec = 0x00; 
	Flash_Read_Col = 0x00; 
	Flash_Read_addl = XmtBuff.b[20]; 
	Flash_Read_addh = XmtBuff.b[19]; 
  	ReadResidueVal = (XmtBuff.b[22]<<8) + XmtBuff.b[23]; 
      	ReadResidueVal = 512 * ReadResidueVal; 
	fCOMMAND = 0xff; 
	asm("nop \n nop"); 
	while(!fRB); 
} 
/************************************************************ 
**工程名称:U盘固件程序开发 
**编译器类型及版本:ICCAVR 6.26C 
**日期:2004.4.30 
**创建人:陈驰 
**所属单位:湖南大学计算机与通信学院 
 
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
**时钟频率:8MHZ 
 
**函数功能:读FLASH函数 
**函数输入参数及说明:无 
 
**函数返回值:无 
**在本函数以外定义的变量: 
**调用的函数说明:无 
 
**修改人:陈驰 
**修改日期:2004.4.30 
**修改说明:创建 
*************************************************************/ 
void flashRead(void) 
{ 
	unsigned char i; 
	unsigned char  temp; 
	if(ReadResidueVal > 0){ 
		ReadResidueVal -= 64; 
		temp = (unsigned char)(Flash_Read_Col + 64); 
		fCOMMAND = Flash_Read_Sec; 
		fADD = Flash_Read_Col; 
		fADD = Flash_Read_addl; 
		fADD = Flash_Read_addh; 
		asm("nop \n nop"); 
		while(!fRB); 
		switch (Flash_Read_Sec) 
		{ 
			case 0x00: 
				if(temp == 0) 
				{ 
					Flash_Read_Sec = 0x01; 
					Flash_Read_Col = 0x00; 
				}else 
				{ 
					Flash_Read_Col += 64; 
				} 
				break; 
			case 0x01: 
				if(temp == 0) 
				{ 
					if(Flash_Read_addl == 255){ 
						Flash_Read_addl = 0x00; 
						Flash_Read_addh ++; 
					}else 
						Flash_Read_addl ++; 
					Flash_Read_Sec = 0x00; 
					Flash_Read_Col = 0x00; 
				}else 
				{ 
					Flash_Read_Col += 64; 
				} 
				break; 
		} 
		 
		D12_COMMAND = 0x05;//选择端点(指针指向0位置) 
		cwait; 
		D12_COMMAND = 0xf0;//写缓冲区 
		cwait; 
		/**************************** 
	  	  缓冲区数据结构: 
	  	  字节1:保留,可为任意值 
	  	  字节2:数据字节的数目/长度 
	  	  字节3:数据字节1 
	  	  字节4:数据字节2 
		*****************************/ 
		D12_DATA = 0x00;//字节1 
		cwait; 
		D12_DATA = 64;//字节2 
		csram; 
		for(i=0;i<64;i++) 
		{ 
			D12_DATA = fDATA;//写数据 
			cwait; 
		} 
		D12_COMMAND = 0xfa;//设置缓冲区有效(满标志) 
		csram; 
	} 
}