📄 flash.c
字号:
state = flashDataErase(testBlockNum,1000);
if(state == STATUS_NORMAL) /*成功擦除测试块原有数据*/
{
/*设置测试数据*/
state = flashDataSet(testBlockNum,buffIn,1000);
if(state == STATUS_NORMAL) /*成功设置测试数据*/
{
printf("\n%x,%x,%x,%x\n",buffIn[9],buffOut[9],buffIn[500],buffOut[500]);
/*获取数据并比较*/
state = flashDataGet(testBlockNum,buffOut,1000);
if(state == STATUS_NORMAL) /*成功读出测试数据*/
{
printf("\n%x,%x,%x,%x\n",buffIn[9],buffOut[9],buffIn[500],buffOut[500]);
buffIn[1000] = '\0';
buffOut[1000] = '\0';
if(strcmp(buffIn,buffOut)==0) /*写入与读出一致*/
{
printf("**********flashTest: what are read out are equal to what were written in\n");
/*擦除测试数据*/
state = flashDataErase(testBlockNum,1000);
if(state == STATUS_NORMAL) /*成功擦除测试数据*/
{
/*重新写入原来的数据*/
state = flashDataSet(testBlockNum,buffSave,FLASH_DATA_BLOCK_SIZE_W*width);
if(state != STATUS_NORMAL) /*写入原来的数据失败*/
{
printf("flashTest: can't set origin data back into block %d\n",testBlockNum);
stateReturn = STATUS_ERROR;
}
}
else /*擦除测试数据失败*/
{
printf("flashTest: can't erase test data of block %d\n",testBlockNum);
stateReturn = STATUS_ERROR;
}
}
else /*写入与读出数据不一致*/
{
printf("flashTest: the test data written in is not equal to the data read out\n");
stateReturn = STATUS_ERROR;
}
}
else /*读出测试数据失败*/
{
printf("flashTest: can't get test data out from block %d\n",testBlockNum);
stateReturn = STATUS_ERROR;
}
}
else /*设置测试数据失败*/
{
printf("flashTest: can't set test data into block %d\n",testBlockNum);
stateReturn = STATUS_ERROR;
}
}
else /*擦除测试块原有数据失败*/
{
printf("flashTest: can't erase origin data of block %d\n",testBlockNum);
stateReturn = STATUS_ERROR;
}
}
else /*读出失败*/
{
printf("flashTest: can't get origin data from block %d\n",testBlockNum);
stateReturn = STATUS_ERROR;
}
taskUnlock(); /*任务切换锁定去除*/
return(stateReturn);
}
/**********************************************************************
char flashDataErase(int dataNum,int eraseLen)
函数描述:将从dataNum开始的地址擦除,如果eraseLen不是
块长度的整数倍,仍然将最后一块整体擦除。
调用:
char flashUnLock(int dataNum, int unLockLen)
被调用:
char flashTest(int testBlockNum)
FCITask.c
STATUS t0x1600(char*pBuff);
STATUS t0x1601(char*pBuff);
**********************************************************************/
char flashDataErase(int dataNum, int eraseLen)
{
FLASH_VALUE *addr;
FLASH_VALUE value;
int iBlock,lenBlock,endBlock;
int eraseTime = 0;
char stateReturn = STATUS_NORMAL;
int eraseDelay;
/*因为解锁函数内部调用了semTake和semGive,
*因此必须放在flashDataErase函数调用semTake前*/
if(flashUnLock(dataNum,eraseLen)!=STATUS_NORMAL)
{
printf("unable to unlock block from %d for %d bytes\n",dataNum,eraseLen);
return(STATUS_ERROR);
}
/*获取flash控制权*/
if(semTake(semFlash,100)==ERROR)
{
printf("flashDataErase: unable to get semFlash\n");
return(STATUS_ERROR);
}
/*计算需要擦除的块数量*/
lenBlock = (eraseLen-1)/(FLASH_DATA_BLOCK_SIZE_W*2)+1;
endBlock = dataNum+lenBlock;
if(endBlock>FLASH_DATA_BLOCK_NUM) /*超过范围,擦除到最后一块为止*/
{
printf("flashDataErase: no more place for erase %d blocks\n",lenBlock);
endBlock = FLASH_DATA_BLOCK_NUM;
stateReturn = STATUS_WARNING;
}
printf("flashDataErase: block number 0x ");
/*逐块擦除*/
for(iBlock=dataNum;iBlock<endBlock;iBlock++)
{
printf("\b\b%2x",iBlock);
addr = FLASH2CPU_ADDR((FLASH_VALUE*)((UINT)iBlock*FLASH_DATA_BLOCK_SIZE_W));
/*开始擦除*/
*addr = FLASH_CC_ERASE_SETUP;
*addr = FLASH_CC_ERASE_CONFIRM;
eraseTime = 0;
/*读取状态*/
while(1)
{
/*不断检查是否擦除完毕*/
*addr = FLASH_CC_READ_STATUS;
value = *addr;
if((value & FLASH_CC_ERASE_CHECK1) == FLASH_CC_ERASE_CHECK1) /*擦除完毕*/
break;
else
{
eraseTime++;
for(eraseDelay=0;eraseDelay<10000;eraseDelay++);
if(eraseTime ==FLASH_ERASE_BLOCK_TIME) /*操作超时*/
{
printf("flashDataErase: can't erase block %d in time\n",iBlock);
stateReturn = STATUS_ERROR;
break;
}
}
}
if(stateReturn==STATUS_NORMAL)
{
/*检查是否正确擦除*/
if((value & FLASH_CC_ERASE_CHECK2) != 0x0000) /*擦除出错*/
{
printf("\nflashDataErase: error in erase block %d, value =%x\n",iBlock,value);
stateReturn = STATUS_ERROR;
}
/*正确擦除,回到read array状态*/
*FLASH2CPU_ADDR(0) = FLASH_CC_READ_ARRAY;
}
else
{
break;
}
}
printf("\n");
printf("flashDataErase: erase finished\n");
/*无论是否正确擦除,都回到read array状态*/
*FLASH2CPU_ADDR(0) = FLASH_CC_READ_ARRAY;
/*释放flash控制权*/
semGive(semFlash);
/*全部擦除完毕*/
return(stateReturn);
}
/**********************************************************************
char flashUnLock(int dataNum, int eraseLen)
函数描述:将从dataNum开始的地址解锁,如果eraseLen不是
块长度的整数倍,仍然将最后一块解锁。
调用:
被调用:
char flashDataErase(int dataNum, int eraseLen)
**********************************************************************/
char flashUnLock(int dataNum, int unLockLen)
{
FLASH_VALUE *addr;
int iBlock,lenBlock,endBlock;
char stateReturn = STATUS_NORMAL;
/*获取flash控制权*/
if(semTake(semFlash,100)==ERROR)
{
printf("flashUnLock: unable to get semFlash\n");
return(STATUS_ERROR);
}
/*计算需要解锁的块数量*/
#if (defined FLASH_MAP_2_4)
lenBlock = (unLockLen-1)/(FLASH_DATA_BLOCK_SIZE_W*4)+1;
#else if ((defined FLASH_MAP_1_2)|(defined FLASH_MAP_8_2))
lenBlock = (unLockLen-1)/(FLASH_DATA_BLOCK_SIZE_W*2)+1;
#endif
endBlock = dataNum+lenBlock;
if(endBlock>FLASH_DATA_BLOCK_NUM) /*超过范围,解锁到最后一块为止*/
{
printf("flashUnLock: no more place for unlock %d blocks\n",lenBlock);
endBlock = FLASH_DATA_BLOCK_NUM;
stateReturn = STATUS_WARNING;
}
/*逐块解锁*/
for(iBlock=dataNum;iBlock<endBlock;iBlock++)
{
addr = FLASH2CPU_ADDR((FLASH_VALUE*)((UINT)iBlock*FLASH_DATA_BLOCK_SIZE_W));
/*开始解锁*/
*addr = FLASH_CC_CONFIG_SETUP;
*addr = FLASH_CC_CONFIG_CONFIRM;
/*恢复到read array状态*/
*addr = FLASH_CC_READ_ARRAY;
}
/*释放信号灯*/
semGive(semFlash);
return(stateReturn);
}
/**********************************************************************
char flashIDCheck()
函数描述:检查flash 芯片类型
调用:
被调用:
void flashInit()
**********************************************************************/
char flashIDCheck()
{
FLASH_VALUE id1,id2;
/*设置为read identify 模式*/
*FLASH2CPU_ADDR(0) = FLASH_CC_READ_IDENTIFY;
/*读芯片代号*/
id1 = *FLASH2CPU_ADDR(0);
id2 = *FLASH2CPU_ADDR(1);
/*根据芯片是否是28F320B3做出返回值*/
if( (id1==FLASH_28F320C3_ID) && ((id2==FLASH_28F320C3_IDENT_T)||(id2==FLASH_28F320C3_IDENT_B)) )
return(STATUS_NORMAL);
else
return(STATUS_ERROR);
}
/**********************************************************************
char flashShutDown()
函数描述:关闭FLASH的操作,主要是解决一些在SHELL 下重复
使用flashInit()的信号灯没有删除的问题,在这里
删除信号灯,并将flash重新置到read array状态。
调用:
被调用:用户在shell下调用。
**********************************************************************/
char flashShutDown()
{
/*恢复成read array 状态*/
*FLASH2CPU_ADDR(0) = FLASH_CC_READ_ARRAY;
/*删除flash信号灯*/
semDelete(semFlash);
return(STATUS_NORMAL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -