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

📄 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      chenchil   created

--*/
/******************************************************************/
#include "io8515v.h"
#include "d12head.h"
#include "scsi.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;

void flashErase(unsigned char addh,unsigned char addl)
{
	char i=0;
	fWPs;//打开写保护
	fCOMMAND = 0x60;
	fADD = addl;
	fADD = addh;
	fCOMMAND = 0xd0;
	asm("nop \n nop");
	while(!fRB);
	fCOMMAND = 0x70;
	i = fDATA;
	csram;
	fWPc;//写保护
}

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;
	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];
}

void flashWrite(unsigned char * PageBuff)
{
	unsigned int i;
	if(WriteResidueVal > 0)
	{
		fWPs;//打开写保护
		fCOMMAND = Flash_Write_Sec;
		fCOMMAND = 0x80;
		fADD = 0x00;
		fADD = Flash_Write_addl;
		fADD = Flash_Write_addh;
		
		for(i=0;i<256;i++)
		{
			fDATA = PageBuff[i];
		}
		
		fCOMMAND = 0x10;
		asm("nop \n nop");
		while(!fRB);
		fCOMMAND = 0x70;
		i = fDATA;
		D12_COMMAND = 0xf2;// 清 OUT 缓冲区
		csram;
		fWPc;//写保护
		
		if(Flash_Write_Sec== 0x01){
			WriteResidueVal = WriteResidueVal - 1;
			if(Flash_Write_addl== 255){
				Flash_Write_addl= 0x00;
				Flash_Write_addh++;
			}else
				Flash_Write_addl++;
		}
	}
}

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;//写保护
}

void flashReadcmd(void)
{
	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);
}

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;// 选择 IN 端点(指针指向0位置)
		cwait;
		D12_COMMAND = 0xf0;// 写缓冲区
		cwait;
		D12_DATA = 0x00;
		cwait;
		D12_DATA = 64;
		csram;
		for(i=0;i<64;i++)
		{
			D12_DATA = fDATA;
			cwait;
		}
		D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志)
		csram;
	}
}

⌨️ 快捷键说明

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