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

📄 smallflash.c

📁 基于BF561的JS28F128 FLASH驱动
💻 C
字号:
#include "SmallFlash.h"

#define OS_EXIT_CRITICAL()   
#define OS_ENTER_CRITICAL() 

#define DQ7    0x80
#define DQ6    0x40
#define DQ54	  0x60


void FlashWriteCell(UDWORD dwOffset,UWORD wdData)
{
	UWORD* pAddr = (UWORD*)FLASH_BASE;

	OS_ENTER_CRITICAL();
	pAddr       += dwOffset;
	*pAddr       = wdData;	
	OS_EXIT_CRITICAL();

	return;
}


void FlashReadCell(UDWORD dwOffset,UWORD* pData)
{
	UWORD* pAddr = (UWORD*)FLASH_BASE;
	pAddr       += dwOffset;
	
	OS_ENTER_CRITICAL();
	*pData       = *pAddr;
	OS_EXIT_CRITICAL();
}

BOOL FlashUnlock(UDWORD dwOffset)
{
	//FlashWriteCell(0x5555, 0xAA);
	//FlashWriteCell(0x2AAA, 0x55);
	//FlashWriteCell(0x5555, 0xA0);
	FlashWriteCell(dwOffset, 0x40);
	
	return TRUE;
}

void FlashReset()
{
	//向任意地址写0xFF
	FlashWriteCell(0x0000,0xFFFF);
}

BOOL FlashErasePollToggleBit(UDWORD dwOffset)
{
	UWORD  btData0;
	int i,j;	
	
	for(i=0;i<0x1000;i++)
	{
		for(j=0;j<0x10;j++)
			asm("NOP;");
		
		//发送0x70命令
		FlashWriteCell(dwOffset,0x70);
			
		for(j=0;j<0x10;j++)
			asm("NOP;");
			
		//读状态
		FlashReadCell(dwOffset,&btData0);
		if(!(btData0 & DQ7))
		{
			continue;				
		}

		//btData0=0x80;
		if(!(btData0 & DQ54))
		{
			//bit5bit4==00成功擦除
			return TRUE;
		}
		
	}
	
	return FALSE;
}


BOOL FlashPollToggleBit(UDWORD dwOffset)
{
	UWORD  btData0;
	int i,j;

	for(i=0;i<0x100;i++)
	{
		for(j=0;j<0x10;j++)
			asm("NOP;");
		
		//发送0x70命令
		FlashWriteCell(dwOffset,0x70);
			
		for(j=0;j<0x10;j++)
			asm("NOP;");
			
		//读状态
		FlashReadCell(dwOffset,&btData0);
		
		if(!(btData0 & DQ7))
		{
			continue;				
		}

		//btData0=0x80;
		if(!(btData0 & DQ54))
		{
			//bit5bit4==00成功擦除
			return TRUE;
		}
	}
	return FALSE;
}


/***********************************************
// 函数名称: FlashEraseChip
// 函数说明: 删除整个芯片数据
// 返回值  : BOOL  : 
***********************************************/
BOOL FlashEraseChip()
{
	UDWORD i;
	for(i=0;i<FLASH_SIZE / FLASH_BLOCK_SIZE;i++)
	{
		if(!FlashEraseBlock(i))
		{
			return FALSE;
		}
	}
	return TRUE;	
}


/***********************************************
// 函数名称: FlashEraseBlock
// 函数说明: 删除指定块数据
// 返回值  : BOOL  : 
// 参数说明: UDWORD dwBlockNum : 待删除的块号,从0开始编号
***********************************************/
BOOL FlashEraseBlock(UDWORD dwBlockNum)
{
	UDWORD dwOffset;
	UDWORD i;
	if(dwBlockNum >= FLASH_SIZE / FLASH_BLOCK_SIZE)
		return FALSE;//非法块号
		
	dwOffset   = dwBlockNum * FLASH_BLOCK_SIZE;
	dwOffset >>= 1;
	FlashWriteCell(dwOffset, 0x20);
	FlashWriteCell(dwOffset, 0xD0);

	FlashErasePollToggleBit(dwOffset);

	for(i=0;i<0xc00000;i++)
		asm("NOP;");
	FlashReset();

	return TRUE;	
}  


/***********************************************
// 函数名称: FlashGetID
// 函数说明: 得到FlashID
// 返回值  : UWORD  : 返回设备ID
***********************************************/
UWORD FlashGetID()
{	
	UWORD wdDeviceCode = 0,wdManCode = 0;
		
	//FlashWriteCell(0x5555, 0xaa);
	//FlashWriteCell(0x2AAA, 0x55);
	FlashWriteCell(0x5555, 0x90);	
	
	FlashReadCell(0,&wdManCode);
	FlashReadCell(1,&wdDeviceCode);
	FlashReset();
		
	return (wdDeviceCode|(wdManCode<<8));
}


/***********************************************
// 函数名称: FlashWriteData
// 函数说明: 向Flash写入数据
// 返回值  : BOOL  : 
// 参数说明: UDWORD dwOffset    : Flash偏移量,以字节计,且必须是2的整数倍
// 参数说明: UDWORD dwCount     : 写入的数据个数,以字节计,且必须是2的整数倍
// 参数说明: UDWORD dwStride    : 无效,且只能使用1
// 参数说明: const UWORD *pData : 待写数据缓冲区
***********************************************/
BOOL FlashWriteData(UDWORD dwOffset,UDWORD dwCount,UDWORD dwStride,void *pData)
{
	UDWORD i,j;	
	UWORD *pwdData = (UWORD*)pData;
	//将字节操作转换为UWORD操作
	dwOffset >>= 1;
	dwCount  >>= 1;
	dwStride   = 1;
	
	for (i = 0; i < dwCount; i++)
	{	
		FlashWriteCell(dwOffset, 0x40);//准备写flash
		FlashWriteCell(dwOffset, pwdData[i]);
		if(!FlashPollToggleBit(dwOffset))
		{
			//FlashReset();
			//return FALSE;
		}
		dwOffset += dwStride;
	}
	
	FlashReset();
	return TRUE;
}


/***********************************************
// 函数名称: FlashReadData
// 函数说明: 从Flash中读数据
// 返回值  : BOOL  : 
// 参数说明: UDWORD dwOffset : Flash偏移量,以字节计,且必须是2的整数倍
// 参数说明: UDWORD dwCount  : 读数据个数,以字节计,且必须是2的整数倍
// 参数说明: UDWORD dwStride : 无效,且只能使用1
// 参数说明: void *pData     : 存放所读数据缓冲区,以节对齐
***********************************************/
BOOL FlashReadData(UDWORD dwOffset,UDWORD dwCount,UDWORD dwStride,void *pData)
{
	UDWORD i,j;	
	UWORD *pwdData = (UWORD*)pData;
	//将字节操作转换为UWORD操作
	dwOffset >>= 1;
	dwCount  >>= 1;
	dwStride   = 1;


	for (i = 0; i < dwCount; i++)
	{		
		FlashReadCell(dwOffset, &pwdData[i]);		
		dwOffset += dwStride;
	}	
	
	FlashReset();
	
	return TRUE;
}

⌨️ 快捷键说明

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