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

📄 nflash32.c

📁 usb开发(基于D12)。。湖南大学计算机与通信学院同学毕业设计及源代码!!好的很啊
💻 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<CopyBack_Count;i++){
		flashCopyBLack(Sour_addh,Sour_addl,Dest_addh,Dest_addl);
		Sour_addl ++;
		Dest_addl ++;
	}
	Erase_addl = (XmtBuff.b[20]/0x20) * 0x20;
	Erase_addh = XmtBuff.b[19];
	WritePageNum = (XmtBuff.b[22]<<8)+XmtBuff.b[23];
	Erase_Count = WritePageNum / 0x20;
	if(WritePageNum % 0x20){
		Erase_Count ++;
		if((WritePageNum % 0x20) > (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<CopyBack_two_count;i++){
		flashCopyBLack(Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl);
		Sour_two_addl ++;
		Dest_two_addl ++;
	}
	for(i=0;i<Erase_Count;i++){
		flashErase(Erase_addh, Erase_addl);
		if(Erase_addl == 224){
			Erase_addl = 0x00;
			Erase_addh ++;
		}else
			Erase_addl += 0x20;
	}
	for(i=0;i<CopyBack_Count;i++){
		Sour_addl --;
		Dest_addl --;
		flashCopyBLack(Dest_addh,Dest_addl,Sour_addh,Sour_addl);
	}
	for(i=0;i<CopyBack_two_count;i++){
		Sour_two_addl --;
		Dest_two_addl --;
		flashCopyBLack(Dest_two_addh,Dest_two_addl,Sour_two_addh,Sour_two_addl);
	}
	Flash_Write_Sec= 0x00;
	Flash_Write_Col= 0x00;
	Flash_Write_addl= XmtBuff.b[20];
	Flash_Write_addh= XmtBuff.b[19];
  	WriteResidueVal=(XmtBuff.b[22]<<8)+XmtBuff.b[23];
}
/************************************************************
**工程名称:U盘固件程序开发
**编译器类型及版本:ICCAVR 6.26C
**日期:2004.4.30
**创建人:陈驰
**所属单位:湖南大学计算机与通信学院

**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**时钟频率:8MHZ

**函数功能:写FLASH函数
**函数输入参数及说明:写入数据

**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无

**修改人:陈驰
**修改日期:2004.4.30
**修改说明:创建
*************************************************************/
void flashWrite(unsigned char * PageBuff)
{
	unsigned int i;
	if(WriteResidueVal > 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;
	}
}

⌨️ 快捷键说明

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