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

📄 flash.c

📁 基于dsp的软驱控制源程序
💻 C
字号:
#include "flash.h"
#include "Delay.h"
#include "f2407_c.h"
#include "global.h"
/*************************************************/
/*FLASH CommandReg's Addr  */
#define BASEADDR_FLASH    (unsigned int *)0x8000
#define COMMANDREG1_FLASH (unsigned int *)0x8555
#define COMMANDREG2_FLASH (unsigned int *)0x8AAA
#define COMREG1ADDR_FLASH 0xFF2F
#define COMREG2ADDR_FLASH 0xFF17
/*************************************************/
const char WPAGE[32]={ 
      0xFF07,0xFF0F,0xFF17,0xFF1F,0xFF27,0xFF2F,0xFF37,0xFF3F,
      0xFF47,0xFF4F,0xFF57,0xFF5F,0xFF67,0xFF6F,0xFF77,0xFF7F,
      0xFF87,0xFF8F,0xFF97,0xFF9F,0xFFA7,0xFFAF,0xFFB7,0xFFBF,
      0xFFC7,0xFFCF,0xFFD7,0xFFDF,0xFFE7,0xFFEF,0xFFF7,0xFFFF
};	 
/*****************************************************/
void EraseWholeFlash()
{
	*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0xAAAA;
	
	*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
	*COMMANDREG2_FLASH=0x5555;
	
	*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0x8080;
	
	*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0xAAAA;
	
	*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
	*COMMANDREG2_FLASH=0x5555;
	
	*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0x1010;
	Delay50mS();
}
void EraseSector(int Sector)
{
	*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0xAAAA;
	
	*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
	*COMMANDREG2_FLASH=0x5555;
	
	*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0x8080;
	
	*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0xAAAA;
	
	*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
	*COMMANDREG2_FLASH=0x5555;
	    
    *PEDATDIR=WPAGE[Sector];/*Set ComReg2's Address*/
	*COMMANDREG1_FLASH=0x3030;
	Delay25mS();
}
void ProgramByte(int Sector,int Offset,int data)
{
    *PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0xAAAA;
	
	*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
	*COMMANDREG2_FLASH=0x5555;
	
	*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
	*COMMANDREG1_FLASH=0xA0A0;
	
	*PEDATDIR=WPAGE[Sector];/*Send Data to Flash*/
	*(BASEADDR_FLASH+Offset)=data;
	Delay8uS();		
}
void ReadDataFromFlash(int Sector,int StartAddr,char *data,int datalength)
{
	int i;
	*PEDATDIR=WPAGE[Sector];/*Send Data to Flash*/
	for(i=0;i<datalength;++i)
	{
		data[i]=(char)*(BASEADDR_FLASH+StartAddr+i);
	}
}
void WriteDataInFlash(int Sector,int StartAddr,char *data,int datalength)
{
    int i;
    for(i=0;i<datalength;++i)
    {
    	ProgramByte(Sector,StartAddr+i,data[i]);
    }
}
void WriteFileInFlash(int newfile,char *data,int datalength)
{   
	int i=datalength/2+datalength%2;
	if(newfile)
	{
		curFlashPage+=1;
		curFlashOffset=0;
		WriteDataInFlash(curFlashPage,curFlashOffset,data,i);
		curFlashOffset+=i;
	}
	else
	{
		if(curFlashOffset+i>4095)
		{
			WriteDataInFlash(curFlashPage,curFlashOffset,data,4096-curFlashOffset);
			curFlashPage+=1;			
			WriteDataInFlash(curFlashPage,0,data+4096-curFlashOffset,i-4096+curFlashOffset);	
		    curFlashOffset=i-4096+curFlashOffset;
		}
		else
		{
			WriteDataInFlash(curFlashPage,curFlashOffset,data,i);
			curFlashOffset+=i;
		}
	}	
}
void GetSTFromFlash(int design_number,int first_st,char *data,int st_numbers)
{
	int i,sector,offset;
	unsigned int temp;
	int st[2];
	long filesize;
	sector=1;
	offset=0;
	for(i=0;i<design_number;++i)
	{
		ReadDataFromFlash(sector,offset,data,16);
		temp=(data[15]<<8)+(data[15]>>8);
		filesize=temp<<16;
		temp=(data[14]<<8)+(data[14]>>8);
		filesize+=temp;
		sector+=(filesize+16)/8192+1;
	}
	for(i=0;i<st_numbers;++i)
	{
		 sector+=((long)(first_st*3)+512+32)/8192;
		 offset=(((long)(first_st*3)+512+32)%8192)/2;
		 ReadDataFromFlash(sector,offset,st,2);
		 if(first_st%2)
		 { 
		 	 data[i*2]=((st[1]&0x00c0)>>4)+(st[1]&0x0003);
		 	 data[i*2+1]=((st[0]&0x0003)+1)%3+((((st[1]&0x0300)>>8)+1)%3)*3+
		 	 		 ((((st[0]&0x000c)>>2)+1)%3)*9+((((st[1]&0x0c00)>>10)+1)%3)*27+
		 	 		 ((((st[1]&0x000c)>>2)+1)%3)*81-121;		     
		     data[i*2+1]<<=8;
		 	 data[i*2+1]+=((-1*((((st[0]&0x0030)>>4)+1)%3)+2)*9+(-1*((((st[1]&0xc000)>>14)+1)%3)+2)*3+
		 	 		 (-1*((((st[0]&0x00c0)>>6)+1)%3)+2)+(-1*((((st[1]&0x3000)>>12)+1)%3)+2)*27+
		 	 		 ((((st[1]&0x0030)>>4)+1)%3)*81-121)&0x00ff;		    
		 }
		 else
		 {
		 	 data[i*2]=((st[1]&0xc000)>>12)+((st[1]&0x0300)>>8);
		 	 data[i*2+1]=(((st[0]&0x0300)>>8)+1)%3+(((st[0]&0x0003)+1)%3)*3+
		 	 		 ((((st[0]&0x0c00)>>10)+1)%3)*9+((((st[0]&0x000c)>>2)+1)%3)*27+
		 	 		 ((((st[1]&0x0c00)>>10)+1)%3)*81-121;		     
		     data[i*2+1]<<=8;
		 	 data[i*2+1]+=((-1*((((st[0]&0x3000)>>12)+1)%3)+2)*9+(-1*((((st[0]&0x00c0)>>6)+1)%3)+2)*27+
		 	 		 (-1*((((st[0]&0xc000)>>14)+1)%3)+2)*9+(-1*((((st[0]&0x0030)>>4)+1)%3)+2)*3+
		 	 		 ((((st[1]&0x3000)>>12)+1)%3)*81-121)&0x00ff;
		 }
		 sector-=((long)(first_st*3)+512+32)/8192;
		 first_st++;
    }
}

⌨️ 快捷键说明

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