📄 nflash.c
字号:
while(!(FIO0PIN&0x00800000));
FIO1DIR=0xF807FFFF;
FIO1PIN=0x30000000;
i=0;
do
{
FIO1PIN=0x20000000;
//FIO1PIN=0x20000000;
ControlData.dataBuffer[i]=(FIO1PIN>>19);
ControlData.dataBuffer[i]=(FIO1PIN>>19);
ControlData.dataBuffer[i]=(FIO1PIN>>19);
FIO1PIN=0x30000000;
i++;
}while(i<512);
//addr[0] +=64;
//if(addr[0]==0)
//{
addr[1]++;
if(addr[1] ==0)
{
addr[2]++;
}
//}
FIO1PIN = 0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}
void FLSRDP1(INT8U addrhs,INT8U addrls,INT8U addrld)
{
/* int i;
for( i = 0;i<512;i++)
{
Bulk_Task.dataBuffer[i]=i;
}*/
unsigned int i,j;
j = addrld*512;
addr[2] = addrhs;
addr[1] = addrls;
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
//FIO0DIR = !FLSRB; // 设置FLSRB输入
FLSCMD(0x00);
//FLSCMD(0x50);
FLSADD(addr[2],addr[1],addr[0]);
while(!(FIO0PIN&0x00800000));
FIO1DIR=0xF807FFFF;
FIO1PIN=0x30000000;
i=0;
do
{
FIO1PIN=0x20000000;
//FIO1PIN=0x20000000;
p[j+i]=(FIO1PIN>>19);
p[j+i]=(FIO1PIN>>19);
p[j+i]=(FIO1PIN>>19);
FIO1PIN=0x30000000;
i++;
}while(i<512);
//addr[0] +=64;
//if(addr[0]==0)
//{
//addr[1]++;
//if(addr[1] ==0)
//{
//addr[2]++;
//}
//}
FIO1PIN = 0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}
/*********************************************************************************************************
** 函数名称 :FLSEBK(unsigned int blockadd)
** 函数功能 :块擦除
**********************************************************************************************************/
void FLSEBK(INT8U addrh,INT8U addrl)
{
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR = 0xFFFFFFFF; // 定义为输出
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
// FIO0DIR = !FLSRB; // 设置FLSRB输入
FLSCMD(0x60);
FIO1PIN=(0x50000000)|((addrl)<<19);
FIO1PIN=(0x70000000)|((addrl)<<19);
FIO1PIN=(0x50000000)|((addrh)<<19);
FIO1PIN=(0x70000000)|((addrh)<<19);
FLSCMD(0xD0);
while(!(FIO0PIN&0x00800000));
FLSCMD(0xFF);
FIO1PIN=0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}
/*********************************************************************************************************
** 函数名称 :FLSCOPYBACK(INT8U addrhs,INT8U addrls,INT8U byteaddrs,INT8U addrhd,INT8U addrld,INT8U byteaddrd)
** 函数功能 :块擦除
**********************************************************************************************************/
/*void FLSCOPYBACK(INT8U addrhs,INT8U addrls,INT8U byteaddrs,INT8U addrhd,INT8U addrld,INT8U byteaddrd)
{
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR = 0xFFFFFFFF; // 定义为输出
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
FLSCMD(0x00);
FLSADD(addrhs,addrls,byteaddrs);
while(!(FIO0PIN&0x00800000));
FLSCMD(0x8A);
FLSADD(addrhd,addrld,byteaddrd);
while(!(FIO0PIN&0x00800000));
FLSCMD(0xFF);
FIO1PIN=0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}*/
/*void FLSCOPYBACK(INT8U addrhs,INT8U addrls,INT8U byteaddrs,INT8U addrhd,INT8U addrld,INT8U byteaddrd)
{
addr[2] = addrhs;
addr[1] = addrls;
addr[0] = byteaddrs;
FLSRDP1();
addr[2] = addrhd;
addr[1] = addrld;
addr[0] = byteaddrd;
FLSWR1();
}*/
/************************************************************
**函数功能:读FLASH预处理函数
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
*************************************************************/
void flashReadcmd(void)
{
uint32 h;
/****************说明************
对于FLASH的读原理为:FLASH的读
可以是随机读取,所以这里只要给
定读数据的首地址和读写长度
********************************/
h = (ControlData.dataBuffer[19]<<8)+ControlData.dataBuffer[20]+512;
ControlData.dataBuffer[20] = h;
ControlData.dataBuffer[19] = h>>8;
addr[0] = 0;
addr[1] = ControlData.dataBuffer[20];
addr[2] = ControlData.dataBuffer[19];
ReadResidueVal = (ControlData.dataBuffer[22]<<8) + ControlData.dataBuffer[23];
//if(ReadResidueVal == 0x80) BeepFunc();
ReadResidueVal = ReadResidueVal <<9;
//if(ReadResidueVal>512) ReadResidueVal=512;
offsetr = 0;
//while(!(FIO0PIN&0x00800000));
}
/************************************************************
**函数功能:读FLASH函数
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
*************************************************************/
void flashRead(void)
{
//uint8 epstus;
//epstus = D13_GetEndpointStatusWOInteruptClear(02);
//epstus &= 0x60;
if(ReadResidueVal > 0)
{
if((offsetr%512)==0)
{
offsetr = 0;
FLSRDP();
}
//if(ReadResidueVal == 0x80*512) BeepFunc();
/*if(epstus == 0x00)
{
ReadResidueVal -= 64;
D13_WriteEndpoint(2,64,ControlData.dataBuffer+offsetr);
offsetr += 64;
ReadResidueVal -= 64;
D13_WriteEndpoint(2,64,ControlData.dataBuffer+offsetr);
offsetr += 64;
}
else if(epstus != 0x60)
{*/
ReadResidueVal -= 64;
D13_WriteEndpoint(2,64,ControlData.dataBuffer+offsetr);
offsetr += 64;
//}
//return;
}
}
/************************************************************
**函数功能:写FLASH预处理函数
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
*************************************************************/
void flashWritecmd(void)
{
//uint16 i;
uint32 h,m,n;
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;
h = (ControlData.dataBuffer[19]<<8)+ControlData.dataBuffer[20]+512;
ControlData.dataBuffer[20] = h;
ControlData.dataBuffer[19] = h>>8;
Sour_addh = ControlData.dataBuffer[19];
Sour_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
Dest_addh = 0xFF;
Dest_addl = 0x00;
CopyBack_Count = ControlData.dataBuffer[20]%0x20;
//BeepFunc ();
Erase_addh = ControlData.dataBuffer[19];
Erase_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
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;
Sour_two_addh= End_add.c[1];
Sour_two_addl= End_add.c[0];
Dest_two_addh= 0xFF;
Dest_two_addl= 0x00;
CopyBack_two_count = (Erase_Count * 0x20) - CopyBack_Count -WritePageNum;
m = (Sour_addh<<8)+Sour_addl+32;
n = End_add.add;
if(n <= m)
{
for(i=0;i<CopyBack_Count;i++){
FLSRDP1(Sour_addh,Sour_addl,Dest_addl);
Sour_addl++;
Dest_addl++;
}
/*for(i=0;i<Erase_Count-1;i++){
FLSEBK(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 --;
FLSWR1(Sour_addh,Sour_addl,Dest_addl);
}
*/
for(i=0;i<CopyBack_two_count;i++){
FLSRDP1(Sour_two_addh,Sour_two_addl,Dest_two_addl+Dest_addl);
Sour_two_addl++;
Dest_two_addl++;
}
FLSEBK(Erase_addh, Erase_addl);
for(i=0;i<CopyBack_two_count;i++){
Sour_two_addl --;
Dest_two_addl --;
FLSWR1(Sour_two_addh,Sour_two_addl,Dest_two_addl+Dest_addl);
}
for(i=0;i<CopyBack_Count;i++){
Sour_addl --;
Dest_addl --;
FLSWR1(Sour_addh,Sour_addl,Dest_addl);
}
}
else
{
for(i=0;i<CopyBack_Count;i++){
FLSRDP1(Sour_addh,Sour_addl,Dest_addl);
Sour_addl++;
Dest_addl++;
}
for(i=0;i<Erase_Count-1;i++){
FLSEBK(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 --;
FLSWR1(Sour_addh,Sour_addl,Dest_addl);
}
for(i=0;i<CopyBack_two_count;i++){
FLSRDP1(Sour_two_addh,Sour_two_addl,Dest_two_addl);
Sour_two_addl++;
Dest_two_addl++;
}
FLSEBK(Erase_addh, Erase_addl);
for(i=0;i<CopyBack_two_count;i++){
Sour_two_addl --;
Dest_two_addl --;
FLSWR1(Sour_two_addh,Sour_two_addl,Dest_two_addl);
}
}
addr0 = 0;
addr[0] = 0;
addr[1] = ControlData.dataBuffer[20];
addr[2] = ControlData.dataBuffer[19];
WriteResidueVal=(ControlData.dataBuffer[22]<<8)+ControlData.dataBuffer[23];
WriteResidueVal= WriteResidueVal<<9;
WriteResidueValcopy = WriteResidueVal;
times1 = 0;
times2 = 0;
bEPPflags.flashwrstart = 0;
bEPPflags.flashwrend = 0;
temp = 0;
offset = 0;
offsetd = 0;
}
/************************************************************
**函数功能:写FLASH函数
**函数输入参数及说明:写入数据
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
*************************************************************/
/*void flashWrite(void)
{
uint16 i;
//if(WriteResidueVal > 0)
//{
//BeepFunc();
WriteResidueVal-=offset;
//WriteResidueVal-=512;
//if(WriteResidueVal > 0) return;
for(i = 0;i<offset/512;i++)
{
offsetd = i*512;
FLSEBK(0x00, 0x00);
FLSWR();
}
offsetd = 0;
//WriteResidueVal-=512;
//}
}*/
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -