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

📄 flash.c

📁 嵌入式实时操作系统VxWorks下面的Flash驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -