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

📄 dec6713_flash.c

📁 在DSP6713项目开发中编写的烧写AM29LV160DB flash编程的工具软件
💻 C
字号:

/********************************************************************************
Function:For Flash burn											    
*********************************************************************************/

#include <stdio.h>
#include <csl.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_emif.h>
#include <csl_irq.h>
#include "DEC6713_FLASH.h"
#include <math.h>

/********************************************************************************/

extern far void vectors();

#define FLASH_ADR1   (0x90000000+0xAAA)
#define FLASH_ADR2   (0x90000000+0x555)  
#define Sourceaddr   0x90000000
#define Toggle_Bit   0x40  /* d6 = 1 */
#define Hangup_Bit   0x20  /* d5 = 1 */ 
#define  Pass_Flag   0
#define  Fail_Flag   1  

#define ramstart      0x00000000
unsigned long ramaddr=ramstart;
Uint8  flash[1024];
Uint8  ram[1024];

Uint8  Tempdata[720];
Uint8  Tempdata2[740];
unsigned char Tempdata1;
unsigned char Data_to_write[240];
unsigned char Data_from_flash[1024];
char           filename[128];
long           codelength;
long           datalength;	 
long           lengthtemp;
unsigned long  processaddr=Sourceaddr;
unsigned int   counter=0;

void flash_chip_erase()
{    
  *(unsigned volatile char*)FLASH_ADR1=0xaa;    
  *(unsigned volatile char*)FLASH_ADR2=0x55;
  *(unsigned volatile char*)FLASH_ADR1=0x80;
  *(unsigned volatile char*)FLASH_ADR1=0xaa;
  *(unsigned volatile char*)FLASH_ADR2=0x55;
  *(unsigned volatile char*)FLASH_ADR1=0x10;   
}      

int Toggle_Bit_Check(unsigned char *addr)
{
	unsigned char toggle_data,read_data;
	toggle_data = *addr&Toggle_Bit;
	do{
		if(((read_data = *addr) &Toggle_Bit) == toggle_data)
			break;
		toggle_data = read_data & Toggle_Bit;
	}while((read_data&Hangup_Bit) != Hangup_Bit);
	toggle_data    = *addr & Toggle_Bit;
	if(((read_data = *addr)&Toggle_Bit) != toggle_data)
		return (Fail_Flag);
	return (Pass_Flag);
}
                  
int Write_Flash_Word(unsigned char *data,unsigned char *address)
{ 
  *(unsigned volatile char *)FLASH_ADR1=0xaa;
  *(unsigned volatile char *)FLASH_ADR2=0x55;
  *(unsigned volatile char *)FLASH_ADR1=0xa0;
  *address=*data; 
  return(Toggle_Bit_Check(address));
}

int Read_Flash_Word(unsigned char *data,unsigned char *address) 
{  
  *(unsigned volatile char *)FLASH_ADR1=0xaa;
  *(unsigned volatile char *)FLASH_ADR2=0x55;
  *(unsigned volatile char *)FLASH_ADR1=0xf0;
  *data=*address; 
  return(Toggle_Bit_Check(address)); 
} 

void Write_Flash(unsigned char Data_to_write[],unsigned char *write_address) 
{ 
  int j;  
  for(j=0;j<240;j++)
    Write_Flash_Word(&Data_to_write[j],write_address++);  
}

void Read_Flash(unsigned char Data_from_flash[],unsigned char *read_address)  
{
  int i;
  for(i=0;i<1024;i++)  
    Read_Flash_Word(&Data_from_flash[i],read_address++);
}   

/********************************************************************************/
/********************************************************************************/
void main()
{   
    FILE *stream;
    long int datalength1;
 	long codelength1;
	int  i,k;
	int Conditionback=1;  
    
	CSL_init();
	
	/* Initialize DEC6713 board. */
	DEC6713_init();
	
	/*Read_Flash(flash,(unsigned char *)Sourceaddr);
	for(i=0;i<1024;i++)
	{
	  ram[i]=*(unsigned char *)ramaddr;
	  ramaddr++;
	}
	for(k=0;k<1024;k++)
	{
	  if(flash[i]!=ram[i])
	  printf("data %d is error\n",i);
	}*/
	
	
	puts("Please Input your file\n");
	scanf("%s",filename);
	
    flash_chip_erase(); 
	puts(" erasing the Flash\n");
	stream=fopen(filename,"rb");
    fseek(stream,0,SEEK_END);          /* the end address of the file */
	codelength1 = (long)ftell(stream);
    fseek(stream,0,SEEK_SET);          /* the start address of the file */
	datalength1 = (long)ftell(stream);
	codelength = codelength1-datalength1;/* calculate the length of the file */
	
	if(stream != NULL)
	{  
	   while(Conditionback)
	   { 
	     if(codelength>740)
	       {
	         datalength    = 740;	 
	         codelength   -= 740;
	         lengthtemp    = 740;
	       } 
	     else
	       {
	         datalength    = codelength;
	         lengthtemp    = codelength;
	         Conditionback = 0;
	       }
	     fread(Tempdata2,sizeof(unsigned char),datalength,stream);
	     /************************/
	     /************************/
	     if(datalength<740)
	     {
	       for(i=datalength;i<740;i++)
	       {
	         Tempdata2[i]='F';
	       }
	     }
	     /************************/
	     /************************/	     
         for(k=0;k<10;k++)
	     {  
	       for(i=0;i<72;i++)
	       {
	         Tempdata[72*k+i]=Tempdata2[74*k+i];
	       }
	     }
	     /************************/
	     /************************/	     	     
	     for(i=0;i<720;i++)
	     {
	       switch(Tempdata[i])
	       {
	         case'0':Tempdata[i]=0x00;break;
	         case'1':Tempdata[i]=0x01;break;
	         case'2':Tempdata[i]=0x02;break;
	         case'3':Tempdata[i]=0x03;break;
	         case'4':Tempdata[i]=0x04;break;
	         case'5':Tempdata[i]=0x05;break;
	         case'6':Tempdata[i]=0x06;break;
	         case'7':Tempdata[i]=0x07;break;
	         case'8':Tempdata[i]=0x08;break;
	         case'9':Tempdata[i]=0x09;break;
	         case'A':Tempdata[i]=0x0A;break;
	         case'B':Tempdata[i]=0x0B;break;
	         case'C':Tempdata[i]=0x0C;break;
	         case'D':Tempdata[i]=0x0D;break;
	         case'E':Tempdata[i]=0x0E;break;
	         case'F':Tempdata[i]=0x0F;break;
	         default:break;
	       }
	     }
         for(i=0;i<240;i++)
	     {
	       //Data_to_write[i]=(Tempdata[i*6+3]<<12)|(Tempdata[i*6+4]<<8)|(Tempdata[i*6]<<4)|Tempdata[i*6+1];
	       //Data_to_write[i]=(Tempdata[i*6]<<12)|(Tempdata[i*6+1]<<8)|(Tempdata[i*6+3]<<4)|Tempdata[i*6+4];
	       Data_to_write[i]=(Tempdata[i*3]<<4)|(Tempdata[i*3+1]);
	     }
         Write_Flash(Data_to_write,(unsigned char *)processaddr);
         Read_Flash_Word(&Tempdata1,(unsigned char *)Sourceaddr);
         if(Tempdata1!=0xC2)
         {
           *(unsigned volatile char *)FLASH_ADR1=0xaa;
           *(unsigned volatile char *)FLASH_ADR2=0x55;
           *(unsigned volatile char *)FLASH_ADR1=0xa0;
           *(unsigned char *)Sourceaddr =0xC2;
         }
         processaddr += 240;
         printf("%s,%d\n","Writing FLASH is in progress",counter++);
       }
       fclose(stream);
       *(unsigned char *)Sourceaddr = 0xF0;       
       puts(" End of writting the Flash\n");
       puts(" Now Please reset your system\n");
    }
    else
       puts("the file is empty\n");

}



/********************************************************************************\
\* End of DEC6713_FLASH.C *\
\********************************************************************************/


⌨️ 快捷键说明

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