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

📄 nflash.c

📁 D12和89s52+K9F5608组成的系统
💻 C
字号:
/***********************************************************
Module Name:

         NFlash32.c
***********************************************************/
#include "reg52.h"
#include "d12config.h"
#include "D12CI.h"
#include "Chap_9.h"
#include "SCSI.h"
#include "NFLASH.h"


unsigned int idata WriteResidueVal = 0;
unsigned char idata Flash_Write_Sec = 0x00;
unsigned char idata Flash_Write_Col = 0x00;
unsigned char idata Flash_Write_addl = 0x00;
unsigned char idata Flash_Write_addh = 0x00;
unsigned long idata ReadResidueVal = 0;
unsigned char idata Flash_Read_Sec = 0x00;
unsigned char idata Flash_Read_Col = 0x00;
unsigned char idata Flash_Read_addl = 0x00;
unsigned char idata Flash_Read_addh = 0x00;
unsigned char idata Flash_Write_No = 0x00;


sbit fRB   = P1^4;
sbit fRE   = P1^5;
sbit CLE   = P3^0;
sbit ALE   = P3^1;
sbit fWE   = P3^4;
sbit fWP   = P3^5;

/********************************************************
Flash 底层读写操作
**********************************************************/

void fcommand(unsigned char cmd)
{
P2 = cmd;
CLE = 1;
fWE = 0;
fWE = 1;
CLE = 0;
}


void faddr(unsigned char addr)
{
P2 = addr;
ALE = 1;
fWE = 0;
fWE = 1;
ALE = 0;
}


void fwedata(unsigned char Data)
{
P2 = Data;
fWE = 0;
fWE = 1;
}



unsigned char fredata(void)
{
fRE = 0;
return P2;
fRE = 1;
}


/************************************************************
**函数功能:块擦除函数
**函数输入参数及说明:
  addh:高地址
  addl:低地址

**函数返回值:无
**在本函数以外定义的变量:fCOMMAND,fADD,fWPs,fWPc,fRB
**调用的函数说明:无

**修改人:胡琦宗
**修改日期:2005.12.9
**修改说明:创建
*************************************************************/
void flashErase(unsigned char addh,unsigned char addl)
{
	unsigned char i = 0;
	fWP = 1;//打开写保护
	fcommand(0x60);//块擦除命令
	faddr(addl);//低地址
	faddr(addh);//高地址
	fcommand(0xd0);//处理命令
	while(!fRB);
	fcommand(0x70);//读状态命令
	i = fredata();//读状态值
	fWP = 0;//写保护
//	printf("%x,%x erase is %x",addh,addl,i);//串口打印
}
/************************************************************
**函数功能:写FLASH预处理函数
**函数输入参数及说明:无

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

**修改人:胡琦宗
**修改日期:2005.12.9
**修改说明:创建
*************************************************************/
void flashWritecmd(void)
{
	unsigned char idata Erase_addh,Erase_addl;
	unsigned char idata Sour_addh,Sour_addl,Dest_addh,Dest_addl;
	unsigned char idata Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl;
	unsigned int idata Erase_Count = 0,i = 0;
	unsigned int idata CopyBack_Count = 0;
	unsigned int idata CopyBack_two_count = 0;
	unsigned int idata 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 = ControlData.dataBuffer[19];
	Sour_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
	Dest_addh = 0xfa;
	Dest_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
	CopyBack_Count = ControlData.dataBuffer[20]%0x20;
	for(i=0;i<CopyBack_Count;i++){
		flashCopyBLack(Sour_addh,Sour_addl,Dest_addh,Dest_addl);
		Sour_addl ++;
		Dest_addl ++;
	}
	Erase_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
	Erase_addh = ControlData.dataBuffer[19];
	WritePageNum = (ControlData.dataBuffer[22]<<8)+ControlData.dataBuffer[23];
	Erase_Count = WritePageNum / 0x20;
	if(WritePageNum % 0x20){
		Erase_Count ++;
		if((WritePageNum % 0x20) > (0x20 - (ControlData.dataBuffer[20] % 0x20)))
			Erase_Count ++;
	}else if(ControlData.dataBuffer[20] % 0x20){
		Erase_Count ++;
	}
	Start_add.add = (ControlData.dataBuffer[19]<<8)+ControlData.dataBuffer[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= ControlData.dataBuffer[20];
	Flash_Write_addh= ControlData.dataBuffer[19];
  	WriteResidueVal=(ControlData.dataBuffer[22]<<8)+ControlData.dataBuffer[23];
 }
/************************************************************
**函数功能:写FLASH函数
**函数输入参数及说明:写入数据

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

**修改人:胡琦宗
**修改日期:2005.12.9
**修改说明:创建
*************************************************************/
void flashWrite()     //需修改***
{
	unsigned int i; 
	if(WriteResidueVal > 0)
	{
	  if(Flash_Write_No == 0)
	   {
		fWP = 1;//打开写保护
		fcommand(0x00);//从FRIST部分开始
		fcommand(0x80);//写FLASH命令
		faddr(0x00);//从0列开始
		faddr(Flash_Write_addl);//页地址低位
		faddr(Flash_Write_addh);//页地址高位
	   }
		
		for(i=0;i<64;i++)//需修改***
		{
			fwedata(ControlData.dataBuffer[i]);//写数据到FLASH指定页里
		}
		Flash_Write_No += 64;
		
		if(Flash_Write_No == 512)
		{
		fcommand(0x10);
		while(!fRB);
		fcommand(0x70);//读状态值命令
	 	i = fredata;//读状态值		
		fWP = 0;//写保护
		
		Flash_Write_No = 0;
		WriteResidueVal = WriteResidueVal - 1;
		if(Flash_Write_addl== 255)
			{
			Flash_Write_addl= 0x00;
			Flash_Write_addh++;
			}else
			Flash_Write_addl++;
		}
	}
}
/************************************************************
**函数功能:FLASH页拷贝命令
**函数输入参数及说明:
  Source_addh:源地址高位
  Source_addl:源地址低位
  Destination_addh:目的地址高位
  Destination_addl:目的地址低位

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

**修改人:胡琦宗
**修改日期:2005.12.9
**修改说明:创建
*************************************************************/
void flashCopyBLack(unsigned char Source_addh,unsigned char Source_addl,unsigned char Destination_addh,unsigned char Destination_addl)
{
	unsigned char i;
	fWP = 1;//打开写保护
	fcommand(0x00);//页拷贝命令
        /*源地址*/
	faddr(0x00);
	faddr(Source_addl);
	faddr(Source_addh);
	while(!fRB);
	
	fcommand(0x8a);//页拷贝命令
	/*目的地址*/
	faddr(0x00);
	faddr(Destination_addl);
	faddr(Destination_addh);
	while(!fRB);
	
	fcommand(0x70);//读状态命令
	i = fredata();//读状态值
	fWP = 0;//写保护
	
}
/************************************************************
**函数功能:读FLASH预处理函数
**函数输入参数及说明:无

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

**修改人:胡琦宗
**修改日期:2005.12.9
**修改说明:创建
*************************************************************/
void flashReadcmd(void)
{
	/****************说明************
	  对于FLASH的读原理为:FLASH的读
	  可以是随机读取,所以这里只要给
	  定读数据的首地址和读写长度
	********************************/
	Flash_Read_Sec = 0x00;
	Flash_Read_Col = 0x00;
	Flash_Read_addl = ControlData.dataBuffer[20];
	Flash_Read_addh = ControlData.dataBuffer[19];
  	ReadResidueVal = (ControlData.dataBuffer[22]<<8) + ControlData.dataBuffer[23];
      	ReadResidueVal = ReadResidueVal<<9;
//	fcommand(0xff);
	while(!fRB);
}
/************************************************************
**函数功能:读FLASH函数
**函数输入参数及说明:无

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

**修改人:胡琦宗
**修改日期:2005.12.9
**修改说明:创建
*************************************************************/
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);
		faddr(Flash_Read_Col);
		faddr(Flash_Read_addl);
		faddr(Flash_Read_addh);
		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;
		}
		for(i=0;i<64;i++)
		{
		ControlData.dataBuffer[i] = fredata();
		}
		D12_WriteEndpoint(5,64,ControlData.dataBuffer);
	}
}

⌨️ 快捷键说明

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