This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Flash烧写问题

Other Parts Discussed in Thread: CCSTUDIO

各位工程师好,我自己写了一个hex文件向flash的烧写程序,但不知道为什么,烧写过程特别慢,基本上一秒钟差不多写进一个16位数据,下面是烧写的代码,能帮忙看看是哪里出问题了吗?谢谢!!

/*******************************************************/
/*** hexÎļþÏÂÔص½Flash ***/
FILE *myhex;
Uint8 symbol = 1;
short temp = 0;
Uint16 data_low,data_high,data1,data2;
Uint16 data = 0;
long i = 0,j = 0;

DSP6713_Init();
//½«¶ÔÓ¦µÄhexÎļþ·ÅÔÚ¹¤³ÌĿ¼ÖУ¬²¢½«ÏÂÃæµÄÎļþÃû×÷ÏàÓ¦¸ü¸Ä
if ((myhex = fopen("D:\\CCStudio_v3.3\\MyProjects\\SunModule6713_FlashProgrammer\\FlashSun.hex","r")) == NULL)
{
printf("wrong!");
exit(0);
}
flash_chip_erase();
while(*(int *)0x90000000 != 0xffffffff);
i = 0;
data_low = data_high = data1 = data2 = 0;
printf("Start!");
while(1)
{

fseek(myhex,i,SEEK_SET);//µÚÒ»×Ö½Ú¸ßλ
temp = getc(myhex);
if(temp == -1)
{
break;
}
while(temp == 0x000a)//Õâ¸öÓÃÓÚÏû³ý»»ÐзûµÄÓ°Ïì
{
i++;
fseek(myhex,i,SEEK_SET);
temp = getc(myhex);
}
data_high = AscII2Number(temp);
data_high = data_high<<4;
i++;

fseek(myhex,i,SEEK_SET);//µÚÒ»×Ö½ÚµÍλ
temp = getc(myhex);
while(temp == 0x000a)//Õâ¸öÓÃÓÚÏû³ý»»ÐзûµÄÓ°Ïì
{
i++;
fseek(myhex,i,SEEK_SET);
temp = getc(myhex);
}
data_low = AscII2Number(temp);

data1 = data_low | data_high;//ÐγɵÚÒ»×Ö½Ú
data1 = data1<<8; //°ÑµÚÒ»×Ö½ÚŲµ½×ֵĸßλ
i += 2;

fseek(myhex,i,SEEK_SET);//µÚ¶þ×Ö½Ú¸ßλ
temp = getc(myhex);
while(temp == 0x000a)//Õâ¸öÓÃÓÚÏû³ý»»ÐзûµÄÓ°Ïì
{
i++;
fseek(myhex,i,SEEK_SET);
temp = getc(myhex);
}
data_high = AscII2Number(temp);
data_high = data_high<<4;
i++;

fseek(myhex,i,SEEK_SET);//µÚ¶þ×Ö½ÚµÍλ
temp = getc(myhex);
while(temp == 0x000a)//Õâ¸öÓÃÓÚÏû³ý»»ÐзûµÄÓ°Ïì
{
i++;
fseek(myhex,i,SEEK_SET);
temp = getc(myhex);
}
data_low = AscII2Number(temp);
data2 = data_low | data_high;//Ðγɵڶþ×Ö½Ú
i += 2;

data = data1 | data2;//ÐγÉÕû¸ö16λ×Ö
Write_Flash_Word(&data, (Uint16 *)(0x90000000+j));
//delay();
j += 2;
}
printf("Success!");
return 0;

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


short AscII2Number(short temp)
{
short number;
if((temp < 0x3a) && (temp > 0x2f))
{
number = temp - 0x30;
}
else if((temp < 0x47) && (temp > 0x40))
{
number = temp - 0x37;
}
else
{
number = temp;
}
return number;
}


int Write_Flash_Word(Uint16 *data,Uint16 *address)
{
*(volatile Uint16 *)FLASH_ADR1=0x012a;//0xaa;
*(volatile Uint16 *)FLASH_ADR2=0x0095;//0x55;
*(volatile Uint16 *)FLASH_ADR1=0x0120;//0xa0;
(*address)=*data;
//return(Toggle_Bit_Check(address));
return Pass_Flag;
}

int Read_Flash_Word(Uint16 *data,Uint16 *address)
{
*(volatile Uint16 *)FLASH_ADR1=0x012a;//0xaa;
*(volatile Uint16 *)FLASH_ADR2=0x0095;//0x55;
*(volatile Uint16 *)FLASH_ADR1=0x01b0;//0xf0;
*data=(*address);
//return(Toggle_Bit_Check(address));
return Pass_Flag;

}